机器学习:KNN-近邻算法

1、理论知识

一、K近邻(k-Nearest Neighbor,简称KNN)学习是一种经常使用的监督学习算法

     工做机制:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,而后基于这k个的信息来进行预测。且一般使用“投票法”。机器学习

 

二、以电影类型举例,如今已知部分电影的属性和分类,想要预测未知电影的分类。ide

      

  咱们能够计算未知电影和其它电影的属性距离,这里直接采用几何距离(Euclidean Distance),即把每一个属性化为不一样维度的坐标,再利用距离公式学习

             

  计算结束后,递增排序,能够找到k个最近的样本。由于要采用“投票法”,即知足少数服从多数原则,因此K的取值通常为奇数。这里假设k=3,则最靠近的3个都为爱情电影,因此判断未知电影为爱情电影。测试

       

 

三、KNN算法伪码描述:优化

  (1) 计算已知类别数据集中的点与当前点之间的距离;idea

  (2) 按照距离递增次序排序;spa

  (3) 选取与当前点距离最小的k个点;
rest

  (4) 肯定前k个点所在类别的出现频率;
code

  (5) 返回前k个点出现频率最高的类别做为当前点的预测分类

 

四、优势:简单易于理解;经过对K的选择可具有丢噪音数据的健壮性

   缺点:(1)须要大量空间储存全部已知实例

      (2)算法执行效率低(须要比较全部已知实例与要分类的实例

           (3)当其样本分布不平衡时,好比其中一类样本过大(实例数量过多)占主导的时候,新的未知实例容易被归类为这个主导样本,由于这类样本实例的数量过大,但这个新的未知实例并未接近目标样本。

     

    缺点(3)的意思是,如图中的Y点,黑圈表明其k的取值,即黑圈内的点都是要进行投票的数据点。经过观察会发现Y显然与红点更近,然而由于紫色点在这个圈里数目更多,Y点就会被认为是紫色。对于这个缺点,一般咱们用权重的方法改善,根据距离d改变权重,例如1/d,这样就能让离目标点近的数据点的权重更大一点,优化算法。

  

 

2、代码实现

  调用sklearn库中KNN算法分析著名的iris数据

 1 from sklearn import neighbors
 2 from sklearn import datasets
 3 
 4 knn = neighbors.KNeighborsClassifier()
 5 iris = datasets.load_iris()
 6 
 7 knn.fit(iris.data, iris.target)                          # 创建KNN模型,输入特征值和分类结果
 8 predictedLabel = knn.predict([[6.3, 1.2, 5.2, 1.6]])
 9 
10 print("predictedLabel is :"+ str(predictedLabel))
predictedLabel is :[1]

  有现成的库调用起来很方便,固然也能够本身写对应的算法,下面是KNN的算法。

 1 def classify0(inX, dataSet, labels, k):                  # KNN算法
 2     dataSetSize = dataSet.shape[0]
 3     diffMat = tile(inX, (dataSetSize,1)) - dataSet       #计算两个点的空间距离
 4     sqDiffMat = diffMat**2
 5     sqDistances = sqDiffMat.sum(axis=1)
 6     distances = sqDistances**0.5
 7     sortedDistIndicies = distances.argsort()
 8     classCount={}
 9     for i in range(k):                                   #选择距离最小的k个点
10         voteIlabel = labels[sortedDistIndicies[i]]
11         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
12     sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)  # 按照第二个元素进行从小到大排序,最后返回发生频率最高的标签
13     return sortedClassCount[0][0]

 

3、参考资料

  《机器学习》—— 周志华

  《机器学习实战》—— Peter Harrington

 

ps:本人初学者,有错误欢迎指出。感谢。

相关文章
相关标签/搜索