中山好的网站建设公司,好看的页面布局,c 网站开发需要的技术,wordpress 结构1、算法介绍 KNN#xff08;K Near Neighbor#xff09;#xff1a;k个最近的邻居#xff0c;即每个样本都可以用它最接近的k个邻居来代表。KNN算法属于监督学习方式的分类算法#xff0c;我的理解就是计算某给点到每个点的距离作为相似度的反馈。 简单来讲#xff0c;KN…1、算法介绍 KNNK Near Neighbork个最近的邻居即每个样本都可以用它最接近的k个邻居来代表。KNN算法属于监督学习方式的分类算法我的理解就是计算某给点到每个点的距离作为相似度的反馈。 简单来讲KNN就是“近朱者赤近墨者黑”的一种分类算法。 KNN是一种基于实例的学习属于懒惰学习即没有显式学习过程。 要区分一下聚类如Kmeans等KNN是监督学习分类而Kmeans是无监督学习的聚类聚类将无标签的数据分成不同的簇。
图中绿色的点就是我们要预测的那个点假设K3。那么KNN算法就会找到与它距离最近的三个点这里用圆圈把它圈起来了看看哪种类别多一些比如这个例子中是蓝色三角形多一些新来的绿色点就归类到蓝三角了。
但是当K5的时候判定就变成不一样了。这次变成红圆多一些所以新来的绿点被归类成红圆。从这个例子中我们就能看得出K的取值是很重要的。 明白了大概原理后我们就来说一说细节的东西吧主要有两个K值的选取和点距离的计算。 2、距离计算
要度量空间中点距离的话有好几种度量方式比如常见的曼哈顿距离计算欧式距离计算等等。不过通常KNN算法中使用的是欧式距离这里只是简单说一下拿二维平面为例二维空间两个点的欧式距离公式如下 三维空间两个点的欧式距离为 拓展到多维空间后的距离公式为 3、K值的选取
通过上面那张图我们知道K的取值比较重要那么该如何确定K取多少值好呢答案是通过交叉验证将样本数据按照一定比例拆分出训练用的数据和验证用的数据比如64拆分出部分训练数据和验证数据从选取一个较小的K值开始不断增加K的值然后计算验证集合的方差最终找到一个比较合适的K值。
通过交叉验证计算方差后你大致会得到下面这样的图 这个图其实很好理解当你增大k的时候一般错误率会先降低因为有周围更多的样本可以借鉴了分类效果会变好。但注意和K-means不一样当K值更大的时候错误率会更高。这也很好理解比如说你一共就35个样本当你K增大到30的时候KNN基本上就没意义了。
所以选择K点的时候可以选择一个较大的临界K点当它继续增大或减小的时候错误率都会上升比如图中的K10。 参考李航博士一书统计学习方法中写道的K值选择
K值小相当于用较小的领域中的训练实例进行预测只要与输入实例相近的实例才会对预测结果模型变得复杂只要改变一点点就可能导致分类结果出错泛化性不佳。学习近似误差小但是估计误差增大过拟合K值大相当于用较大的领域中的训练实例进行预测与输入实例较远的实例也会对预测结果产生影响模型变得简单可能预测出错。学习近似误差大但是估计误差小欠拟合极端情况K0没有可以类比的邻居KN模型太简单输出的分类就是所有类中数量最多的距离都没有产生作用。 4、算法实现
4.1 Scikit-learn工具介绍 Python语言的机器学习工具Scikit-learn包括许多知名的机器学习算法的实现Scikit-learn文档完善容易上手具有丰富的API目前稳定版本为0.19.1
安装
pip3 install scikit-learn0.19.1 4.2 基本流程描述
计算当前点与所有点之间的距离距离按照升序排列选取距离最近的K个点统计这K个点所在类别出现的频率这K个点中出现频率最高的类别作为预测的分类 4.3用sklearn中的KFold进行K折交叉验证
import numpy as np
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import KFold #主要用于K折交叉验证# 导入iris数据集
irisdatasets.load_iris()
Xiris.data
yiris.target
print(X.shape,y.shape)
# 定义我们想要搜索的K值候选集这里定义8个不同的值
ks[1,3,5,7,9,11,13,15]# 例进行5折交叉验证KFold返回的是每一折中训练数据和验证数据的index
# 假设数据样本为:[1,3,5,6,11,12,43,12,44,2],总共10个样本
# 则返回的kf的格式为前面的是训练数据后面的是验证数据
# [0,1,3,5,6,7,8,9],[2,4]
# [0,1,2,4,6,7,8,9],[3,5]
# [1,2,3,4,5,6,7,8],[0,9]
# [0,1,2,3,4,5,7,9],[6,8]
# [0,2,3,4,5,6,8,9],[1,7]
kf KFold(n_splits5, random_state2001, shuffleTrue)# 保存当前最好的K值和对应的准确值
best_k ks[0]
best_score 0# 循环每一个K值
for k in ks:curr_score0for train_index, valid_index in kf.split(X):#每一折的训练以及计算准确率clf KNeighborsClassifier(n_neighborsk)clf.fit(X[train_index], y[train_index])curr_score curr_score clf.score(X[valid_index], y[valid_index])#求5折的平均准确率avg_score curr_score/5if avg_score best_score:best_k kbest_score avg_scoreprint(现在的最佳准确率%.2f%best_score, 现在的最佳K值 %d%best_k)print(最终最佳准确率%.2f%best_score, 最终的最佳K值 %d%best_k)打印结果
(150, 4) (150,)
现在的最佳准确率0.96 现在的最佳K值 1
现在的最佳准确率0.96 现在的最佳K值 1
现在的最佳准确率0.97 现在的最佳K值 5
现在的最佳准确率0.98 现在的最佳K值 7
现在的最佳准确率0.98 现在的最佳K值 7
现在的最佳准确率0.98 现在的最佳K值 7
现在的最佳准确率0.98 现在的最佳K值 7
现在的最佳准确率0.98 现在的最佳K值 7
最终最佳准确率0.98 最终的最佳K值 75、算法特点
KNN是一种非参的惰性的算法模型。什么是非参什么是惰性呢
非参的意思并不是说这个算法不需要参数而是意味着这个模型不会对数据做出任何的假设与之相对的是线性回归我们总会假设线性回归是一条直线。也就是说KNN建立的模型结构是根据数据来决定的这也比较符合现实的情况毕竟在现实中的情况往往与理论上的假设是不相符的。
惰性又是什么意思呢想想看同样是分类算法逻辑回归需要先对数据进行大量训练tranning最后才会得到一个算法模型。而KNN算法却不需要它没有明确的训练数据的过程或者说这个过程很快。 5.1 KNN算法优点
简单易用相比其他算法KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。模型训练时间快上面说到KNN算法是惰性的这里也就不再过多讲述。预测效果好。对异常值不敏感
5.2 KNN算法缺点
对内存要求较高因为该算法存储了所有训练数据预测阶段可能很慢对不相关的功能和数据规模敏感