k-近邻算法原理

存在一组带标签的训练样本集,输入未带标签的新数据,将新数据每个特征属性与样本集中数据对应的特征属性进性比较,取k个最相似数据中出现次数最多的分类,做为新数据的分类。**

代码实现

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

# 分类器,inX为用于分类的输入样本,dataSet为数据集,labels为标签,k为k-近邻算法的k值
def classify0(inX,dataSet,labels, k):
    dataSetSize =dataSet.shape[0] # 获取数据的行数
    diffMat=tile(inX,(dataSetSize,1))-dataSet
    sqDiffMat=diffMat**2
    
    #举证的sum(axis=1)函数是让矩阵的每一行相加,返回值是一个数组
    sqDistances=sqDiffMat.sum(axis=1)
    distances=sqDistances**0.5

    # argsort()求距离从小到大排序的序号
    sortedDistIndicies = distances.argsort()
    
    classCount = {}
    
    # 选择距离最小的k个点,并计算他们的频率,若字典里没有找到voteILable,则返回0,若找到则加1
    for i in range(k): 
        # 取第i+1邻近的样本对应的类别标签
        voteILable = labels[sortedDistIndicies[i]]
        #以标签为key,标签出现的次数为value将统计到的标签及出现次数写进字典
        classCount[voteILable] = classCount.get(voteILable, 0) + 1
       
    # 对字典按value从大到小排序
    # 字典的items()函数依次返回每一个元素,operator.itemgetter(1)函数的功能是获取对象的value
    # sorted函数用于排序,reverse=True表示逆序
    # 注意:iteritem()是在python2中使用,如果是python3版本中用item()
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #返回排序后字典中最大value对应的key
    return sortedClassCount[0][0] 

group,labels = createDataSet()
print(classify0([0,0], group, labels, 3))  # 结果为B

知识点补充:

Numpy.tile()

例:
>>> numpy.tile([0,0],(2,1))#在列方向上重复[0,0]1次,行2次
        
    array([[0, 0],
          [0, 0]])

shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]读取矩阵的行数,shape[1]读取矩阵的列数。

shape的输入参数可以是一个整数(表示维度),也可以是一个矩阵。
<div align=center></div>

文章目录