机器学习-k-近邻算法python实践【4】

版权声明:本文为博主原创文章,未经允许,不得转载,如需转载请注明出处 https://blog.csdn.net/ssjdoudou/article/details/83477144

写在最前面:简单来说,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
今天只是讲一下原理和基本思路
有时间会解析一下代码

猜你喜欢

转载自blog.csdn.net/ssjdoudou/article/details/83477144