机器学习算法之KNN最近邻详解和python实现
Posted RayChiu_Labloy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习算法之KNN最近邻详解和python实现相关的知识,希望对你有一定的参考价值。
作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
目录
概念
KNN,K-NearestNeighbor——K最近邻
K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。
该方法的思路是:如果一个样本在特征空间中的 k 个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.它不具有显示的学习过程。
在 KNN中,通过计算对象间的距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离,对于文本分类来说,使用余弦来计算相似度就比欧式距离更合适:同时,KNN 通过依据 k 个对象中占优的类别进行决策,而不是单一的对象类别决策。这两点就是 KNN 算法的优势。
KNN相关的三个事情
1.K值的确定
吴恩达的机器学习课程中,有一个方法。就是尝试不同的k直,然后把误差对应k值的图画出来。一般k值越大,平均误差约小。如果图有明显的拐点,那么这个点对应的k就是一个比较合适的k值,很多情况下靠经(xia)验(meng)来确定,没有固定的经验,一般根据样本的分布,选择一个较小的值,可以通过交叉验证选择一个合适的k值,一般采用5折(10折)交叉验证选择一个最优的准确率最高的k值。
选择较小的k值,就相当于用较小的领域中的训练实例进行预测,训练误差会减小,容易发生过拟合。选择较大的k值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少泛化误差,但缺点是训练误差会增大。
2.距离的度量
欧氏距离
曼哈顿距离
计算距离注意一定要做数据缩放:归一化和标准化
3.分类判别的方式方案
多数表决法和平均值两种方案。
算法基本步骤:
1)计算待分类点与已知类别的点之间的距离
2)按照距离递增次序排序
3)选取与待分类点距离最小的k个点
4)确定前k个点所在类别的出现次数
5)返回前k个点出现次数最高的类别作为待分类点的预测分类
算法python实现
"""
knn
样本集
X = [[1,1],[1,2.5],[3,2],[4.5,3],[4,5]]
Y =['A','A','B','B','B']
测试样本:
t=[3,2.5] 属于哪个类型
设k=3
knn的实现:
将待测试样本和所有的训练进行计算,找出最短的k个元素
然后投票
"""
import numpy as np
import operator
X = np.array([[1,1],[1,2.5],[3,2],[4.5,3],[4,5]])
Y = np.array(['A','A','B','B','B'])
def knn_clasification(X,Y,k,testSample):
"""
:param X: 输入数据
:param Y: 真实数据
:param k: 邻居的个数
:param testSample: 待测试样本
:return: 返回待测试样本类别
"""
# 1.求待测试样本和所有训练样本之间的距离
dist = np.sum((X-testSample)**2, axis=1)**0.5
# 2.距离排序
sort_dist = np.argsort(dist)
# 3.统计距离最近得k个样本的类别的个数
class_count = {}
for dist_index in sort_dist[:k]:
label = Y[dist_index]
class_count[label] = class_count.get(label,0)+1
return sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)[0][0]
if __name__ == "__main__":
predict = knn_clasification(X, Y, 3, np.array([3, 2]))
print(predict)
优缺点
优点
1.简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;
2.可用于数值型数据和离散型数据;
3.训练时间复杂度比支持向量机之类的算法低,仅为O(n);
4.和朴素贝叶斯之类的算法比,对数据没有假设,准确度高, 对异常点不敏感;
缺点
1.计算复杂性高;空间复杂性高,KD树,球树之类的模型建立需要大量的内存;
2.样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
3.一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少 否则容易发生误分。
4.最大的缺点是无法给出数据的内在含义,可解释性不强。
5.使用懒散学习方法,基本上不学习,导致预测时 速度比起逻辑回归之类的算法慢
【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】
以上是关于机器学习算法之KNN最近邻详解和python实现的主要内容,如果未能解决你的问题,请参考以下文章
机器学习十大算法之KNN(K最近邻,k-NearestNeighbor)算法