上次介绍了KNN的基本原理,以及KNN的几个窍门,这次就来用sklearn实践一下KNN算法。

一.Skelarn KNN参数概述

要使用sklearnKNN算法进行分类,我们需要先了解sklearnKNN算法的一些基本参数,那么这节就先介绍这些内容吧。

def KNeighborsClassifier(n_neighbors = 5,weights = 'uniform',algorithm = '',leaf_size = '30',p = 2,metric = 'minkowski',metric_params = None,n_jobs = None)- n_neighbors: 这个值就是指KNN中的"K"了,前面说到过,调整K值,算法会有不同的效果。
- weights(权重):最普遍的 KNN 算法无论距离如何,权重都一样,但有时候我们想搞点特殊化,比如距离更近的点让它更加重要。这时候就需要 weight 这个参数了,这个参数有三个可选参数的值,
决定了如何分配权重。参数选项如下:• 'uniform':不管远近权重都一样,就是最普通的 KNN 算法的形式。• 'distance':权重和距离成反比,距离预测目标越近具有越高的权重。• 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。
- algorithm:在 sklearn 中,要构建 KNN 模型有三种构建方式,1. 暴力法,就是直接计算距离存储比较的那种放松。2. 使用 kd 树构建 KNN 模型 3. 使用球树构建。 其中暴力法适合数据较小的方式,否则效率会比较低。如果数据量比较大一般会选择用 KD 树构建 KNN 模型,而当 KD 树也比较慢的时候,则可以试试球树来构建 KNN。参数选项如下:• 'brute' :蛮力实现• 'kd_tree':KD 树实现 KNN• 'ball_tree':球树实现 KNN • 'auto': 默认参数,自动选择合适的方法构建模型不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 'brute'
- leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的,当使用KD树或球树,
它就是是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,
否则速度过慢不说,还容易过拟合。
- p:和metric结合使用的,当metric参数是"minkowski"的时候,p=1为曼哈顿距离,p=2为欧式距离。默认为p=2。
- metric:指定距离度量方法,一般都是使用欧式距离。• 'euclidean' :欧式距离• 'manhattan':曼哈顿距离• 'chebyshev':切比雪夫距离• 'minkowski': 闵可夫斯基距离,默认参数
- n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。

二. KNN代码实例

KNN算法算是机器学习里面最简单的算法之一了,我们来sklearn官方给出的例子,来看看KNN应该怎样使用吧:

数据集使用的是著名的鸢尾花数据集,用KNN来对它做分类。我们先看看鸢尾花长的啥样。

上面这个就是鸢尾花了,这个鸢尾花数据集主要包含了鸢尾花的花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性(特征),以及鸢尾花卉属于『Setosa,Versicolour,Virginica』三个种类中的哪一类(这三种都长什么样我也不知道)。

在使用KNN算法之前,我们要先决定K的值是多少,要选出最优的K值,可以使用sklearn中的交叉验证方法,代码如下:

from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier#读取鸢尾花数据集
iris = load_iris()
x = iris.data
y = iris.target
k_range = range(1, 31)
k_error = []#循环,取k=1到k=31,查看误差效果
for k in k_range:knn = KNeighborsClassifier(n_neighbors=k)# cv参数决定数据集划分比例,这里是按照5:1划分训练集和测试集scores = cross_val_score(knn, x, y, cv=6, scoring='accuracy')k_error.append(1 - scores.mean())#画图,x轴为k值,y值为误差值
plt.plot(k_range, k_error)
plt.xlabel('Value of K for KNN')
plt.ylabel('Error')
plt.show()

运行后,我们可以得到下面这样的图:

有了这张图,我们就能明显看出K值取多少的时候误差最小,这里明显是K=11最好。当然在实际问题中,如果数据集比较大,那为减少训练时间,K的取值范围可以缩小。

有了K值我们就能运行KNN算法了,具体代码如下:

import matplotlib.pyplot as plt
from  numpy import *
from matplotlib.colors import ListedColormap
from sklearn import neighbors, datasetsn_neighbors = 11#导入一些要玩的数据
iris = datasets.load_iris()
x = iris.data[:, :2]   #我们只采用前两个feature,方便画图在二维平面显示
y = iris.targeth = .02  #网格中的步长# 创建彩色的图
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])#weights 是KNN模型中的一个参数,上述参数介绍中有介绍,这里绘制两种权重参数下KNN的效果图
for weights in ['uniform', 'distance']:# 创建了一个knn分类器的实例,并拟合数据。clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)clf.fit(x, y)# 绘制决策边界。为此,我们将为每个分配一个颜色# 来绘制网格中的点 [x_min, x_max]x[y_min, y_max].x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h),      np.arange(y_min, y_max, h))Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])# 将结果放入一个彩色图中Z = Z.reshape(xx.shape)plt.figure()plt.pcolormesh(xx, yy, Z, cmap=cmap_light)# 绘制训练点plt.scatter(x[:, 0], x[:, 1], c=y, cmap=cmap_bold)plt.xlim(xx.min(), xx.max())plt.ylim(yy.min(), yy.max())plt.title("3-Class classification (k = %i, weights = '%s')"% (n_neighbors, weights))plt.show()

KNN和Kmeans

前面说到过,KNN和Kmeans听起来有些像,但本质是有区别的,这里我们就顺便说一下两者的异同吧。

相同:

  1. K值都是重点
  2. 都需要计算平面中点的距离

相异:
Knn和Kmeans的核心都是通过计算空间中点的距离来实现目的,只是他们的目的是不同的。KNN的最终目的是分类,而Kmeans的目的是给所有距离相近的点分配一个类别,也就是聚类。

简单说,就是画一个圈,KNN是让进来圈子里的人变成自己人,Kmeans是让原本在圈内的人归成一类人。

深入浅出KNN算法(二) sklearn KNN实践相关推荐

  1. KNN算法——kd-tree、KNN莺尾花分类sklearn实现实例

    KNN算法--kd-tree.KNN莺尾花分类sklearn实现实例 KNN算法--kd-tree.KNN莺尾花分类sklearn实现实例 1.kd-tree 2.kd-tree的构建 3.kd-tr ...

  2. 【机器学习】KNN算法及其用KNN解决字体反爬

    KNN算法及其用KNN解决字体反爬 关于KNN算法 概要 简介 原理 KNN算法Python实现 KNN解决字体反爬 web-font介绍 例子 最后 关于KNN算法 概要 K最近邻(kNN,k-Ne ...

  3. 具体knn算法概念参考knn代码python实现

    具体knn算法概念参考knn代码python实现 上面是参考<机器学习实战>的代码,和knn的思想 # _*_ encoding=utf8 _*_ import numpy as np i ...

  4. KNN算法的sklearn实践

    一.KNN算法概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它 ...

  5. 售票java代码_初探12306售票算法(二)-java代码实践

    周五闲来无事,基于上一篇关于初探12306售票算法(一)-理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成Tic ...

  6. python的knn算法list_[机器学习]kNN算法python实现(实例:数字识别)

    # 使用好任何机器学习算法的前提是选好Featuresfrom numpy import *import operatorfrom os import listdirdef classify0(inX ...

  7. 机器学习KNN算法实践:预测城市空气质量

    出品:Python数据之道 作者:叶庭云 整理:Lemon 机器学习KNN算法实践 预测城市空气质量 「Python数据之道」导读: 之前在公众号上分享过 "图解KNN算法" 的内 ...

  8. 深入浅出KNN算法(一) KNN算法原理

    一.KNN算法概述 KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学 ...

  9. 【基础机器学习算法原理与实现】使用感知器算法LDA、最小二乘法LSM、Fisher线性判别分析与KNN算法实现鸢尾花数据集的二分类问题

    本文设计并实现了PerceptronLA.PseudoIA.LeastSM.LinearDA.KNN等五个算法类,以及DataProcessor的数据处理类.对感知器算法LDA.最小二乘法LSM的伪逆 ...

最新文章

  1. AutoML前沿技术与实践经验分享 | 免费公开课
  2. python爬虫之初恋 selenium
  3. [POI 2009] gas 贪心
  4. html5变动标签新写法,Html5新标签解释及用法
  5. if-else运用及技巧(C# 参考)
  6. HTTP 200 OK和HTTP 304 Not modified的由来
  7. 常用技巧 —— 位运算 —— 异或 1 的妙处
  8. wimbuilder2教程_Wimbuilder WIN10XPE制作所需的工程文件
  9. sstap tun虚拟网卡没有安装_虚拟设备之TUN和TAP
  10. MYSQL5.6创建表报错 [ERR] 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘
  11. [paper reading] ResNet
  12. 谷歌验证码(Recaptcha)对接教程
  13. 正则表达式判断手机号和邮箱格式是否正确
  14. mysql数据库应用试卷代号3868_实用数据库期末试卷B卷答题纸
  15. 2022年度Top9的任务管理系统
  16. TCP协议:RST标志位
  17. 微信从原版到现在所有界面图片_微信6年来首次更换启动界面地球图片:来感受一下...
  18. 汉字风格迁移篇--KAGAN:一种中国诗歌风格转换的方法
  19. 许知远在吴晓波《预见2019——国运70》2018年年终演讲上的精华
  20. 3D打印控制板初步认识

热门文章

  1. 关节点和重连通分量,trajan算法实现(python)
  2. JS —— 存取器属性get()和set()
  3. c语言编译不了什么情况,c语言编译没错但是无法运行
  4. 虚拟局域网VLAN简介
  5. 缓存服务器协议有哪些,HTTP 协议的缓存机制概述
  6. mysql dataset_数据库 dataset database
  7. 扫雷游戏网页版_做游戏,单人行动可行吗(3.让我试试扫雷)
  8. springboot socket服务端_从零开始学SpringBoot之Spring Boot WebSocket:编码分析
  9. access工具_工具篇之pycharm小技巧-httpclient
  10. mongodb创建用户名和密码_Python中使用MongoDB详解