写在最前面:简单来说,k-近邻算法是用来根据不同的特征进行分类的一种算法
优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型
IDE:Pycharm
python版本:3.6
操作系统:macOS Mojave
kNN(k-近邻算法)的工作原理是:存在一个样本数据集合,也称作训练样本集,这个样本集的每个数据都存在标签,当我们输入没有标签的数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后通过KNN算法提取样本集中特征最相似(最近邻)的分类标签。通常来说,我们取样本数据集中的钱k个最相似的数据。
下面把这段话解释一下,假设我们已有的6部电影,其中三部是爱情片,三部是动作片(不是爱情动作片哈),而这6部片子是根据什么来分类的呢,是根据打斗镜头和接吻镜头来分类的,然后我们通过KNN算法,将一部新的没有分类的电影的打斗镜头和接吻镜头和其他6部已知电影算出距离,这样我们得到k个距离,取k=3,然后看着三部电影是什么类型的,我们就知道新的电影是什么类型的了。
下面举个栗子:
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group, labels
我们创建了一个数组,我们知道,这是一个4x2的数组
m,n = shape(group)
print(m,n)
4 2
打点不易啊
x = [1.0,1.0,0.0,0.0]
y = [1.1,1.0,0.0,0.1]
plt.scatter(x,y)# python要用show展现出来图
plt.annotate(s='A',xy =(1.0,1.1))
plt.annotate(s='A',xy = (1.0,1.0))
plt.annotate(s='B',xy = (0.0,0.0))
plt.annotate(s='B',xy = (0.0,0.1))
plt.show()
下面我们实施kNN算法
classify0()函数有四个输入参数
用于分类的输入向量是inX
输入的训练样本集为dataSet
标签向量为labels
最后的参数k表示用于选择最近邻居的数目,其中,标签向量的元素数目和矩阵dataSet的行数相同
欧式距离公式:
就是算两点之间的距离
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
然后我们把上面的一组数据输入
classify0([1,7],group,labels,3)
第一个参数可以更换成你想预测的,运行
然后报错:
AttributeError: 'dict' object has no attribute 'iteritems'
把iteritems
改成items
即可
得出预测结果
A
2018.10.28晚于南京邮电大学三牌楼校区图4
今天只是讲一下原理和基本思路
有时间会解析一下代码