Python中的k—近邻算法(处理常见的分类问题)

最近买了一本机器学习的书,书名叫《机器学习实战》,刚学了第一个算法,k—近邻算法,所以写篇博客分享一下。

那么开始,我们假设平面坐标系上面有四个坐标点,坐标分别是

[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]

然后这四个点有两个分类,分别是:

['A', 'A', 'B', 'B']

那么如果出现第五个点,我们怎么确定它,是A类还是B类呢,这个问题我们就可以用到我们今天介绍的算法了。

我们看代码:

from numpy import *
import operator

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

代码中我们导入两个模块,numpy和operator,之后会用到,然后我们定义了一个样本集,放的正好是我们刚刚给出的数据。

然后,我们写一个函数,去处理数据,参数有四个,分别是我们要处理的第五个点的坐标,样本坐标集合,分类集合,和k值(即排序比对的前k个元素),下面是函数代码:

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]#shape[0]取矩阵第二维的长度,4
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet#tile函数,将制定数组按照行列数转换为矩阵4行1列
    sqDiffMat = diffMat**2#矩阵减去初始坐标做平方运算
    sqDistances = sqDiffMat.sum(axis=1)#横纵坐标求和并开方求出与四个样本点的距离
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()#距离排序,返回值为升序的索引数组
    classCount = {}

    for i in range(k):#遍历前K个元素
        voteIlabels = labels[sortedDistIndicies[i]]
        classCount[voteIlabels] = classCount.get(voteIlabels, 0) + 1#分类名作为字典的键,如果字典中不包含该元素,default值为0
    #sorted函数:把字典的iterator,通过第一个域的大小排序,是否降序,是
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]#返回分类名次数最多的类

注释中有讲到每一个函数的功能,然后我们讲一下原理:

1.首先我们将给定的坐标按照样本数量返回一个相同长度的列表

2.经过计算我们得到坐标到每一个点的距离,排序

扫描二维码关注公众号,回复: 4081811 查看本文章

3.排序以后截取前k个元素,获得对应索引的分类类名

4.根据分类类名的出现次数,再次排序,次数越多,排序越靠前

5.返回次数出现最多的类名,即排序后列表的[0][0]元素

函数写完了,以上代码我们保存为kNN.py作为一个模块使用

那我们看一下执行代码:

import kNN

group, labels = kNN.createDataSet()
result = kNN.classify0([0, 0], group, labels, 3)
print(result)

打印出结果是:

B

所以第五个点[0,0],应该分为B类

猜你喜欢

转载自blog.csdn.net/OneWord233/article/details/82866761
今日推荐