K-Nearest Neighbor(KNN) 最邻近分类算法及Python实现方式

K-Nearest Neighbor 最邻近分类算法:

简称KNN,最简单的机器学习算法之一,核心思想俗称“随大流”。是一种分类算法,基于实例的学习(instance-based learning)和懒惰学习(lazy learning)。
懒惰学习:指的是 在训练是仅仅是保存样本集的信息,直到测试样本到达是才进行分类决策。

核心想法:

在距离空间里,如果一个样本的最接近的k个邻居里,绝大多数属于某个类别,则该样本也属于这个类别。


范例:

假设,我们有这样一组电影数据:
K-Nearest Neighbor(KNN) 最邻近分类算法及Python实现方式_第1张图片
由数据可以看出,我们有上述6部电影的数据及分类,最后一部“未知”的是需要预测处于哪个分类中。
然后,我们将数据中的“打斗次数”属性标记为X,“接吻次数”标记为Y,这样上述数据都能化为坐标轴中的一点:
K-Nearest Neighbor(KNN) 最邻近分类算法及Python实现方式_第2张图片
之后便是将所有点与“未知”的点G进行距离计算,因为这个例子是二维的,因此这里我们使用E(x,y)=sqr((x2-x1)^2+(y2-y1)^2),如果是多维的话,可以使用:
K-Nearest Neighbor(KNN) 最邻近分类算法及Python实现方式_第3张图片
最后可得到结果,这里我省略到int:
a:20
b:18
c:19
d:115
e:117
f:118
因此可以看出,最近的三个点是ABC三点,而ABC三点都是Romance类型。

选择方式:

根据上述例子,如果ABC中三个电影分类有一个不是Romance怎么办。这里我们遵循少数服从多数的投票法则(majority-voting),让未知实例归类为最邻近样本中最多数的类别。

其他距离衡量方式:

亦可使用余弦值(cos),相关度(correlation),曼哈顿距离等。

优点:

简单,易于实现,易于理解,通过对K的选择能一定程度上的具备丢噪音数据的健壮性(增大K值)

缺点:

需要大量的空间存储已知实例,算法复杂度高(需要比较所有已知实例)。当样本分布不平均时,比如其中一个样本实例过多,容易被归纳为实例多的样本,如下图Y点:
K-Nearest Neighbor(KNN) 最邻近分类算法及Python实现方式_第4张图片


解决方法:

给距离增加权重,越近的距离权重越高,能一定程度的避免上述样本分布不平均的问题。

Python实现方式:

import numpy as np  
from sklearn import neighbors 

knn = neighbors.KNeighborsClassifier() #取得knn分类器  
data = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]]) #data对应着打斗次数和接吻次数
labels = np.array([1,1,1,2,2,2]) #labels则是对应Romance和Action
knn.fit(data,labels) #导入数据进行训练 
print(knn.predict([18,90]))
需要加载numpy,sklearn包,这两个都是机器学习或数据挖掘常用的包。



你可能感兴趣的:(数据挖掘,Python,数据挖掘基础算法)