k-临近算法

k-近邻算法
在命令行按顺序导入

>>> import kNN
>>> group,labels = kNN.createDataSet()
>>>  group
SyntaxError: unexpected indent
>>> group
array([[1. , 1.1],
       [1. , 1. ],
       [0. , 0. ],
       [0. , 0.1]])
>>> labels
['A', 'A', 'B', 'B']
>>> kNN.classify0([0,0],group,labels,3)
'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
def classify0(inX,dataSet,labels,k):#inX用于分类的输入向量;dataSet为输入的训练样本集;labels为标签向量;k用于选择最近邻居的数目
    dataSetSize = dataSet.shape[0]#获得dataSet的行数
    diffMat = tile(inX,(dataSetSize,1) - dataSet)#对应的差值
    sqDiffMat = diffMat**2#差的平方 
    sqDistance = sqDiffMat.sum(axis=1)#差的平方的和
    distance = sqDistance ** 0.5#差的平方的和的平方根
    sortedDistIndicies = distance.argsort()#排序后,统计前面K个数据的分类情况
    classCount = {}#字典
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]#labels得是字典才可以如此
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=Ture)#再次排序
    return sortedClassCount[0][0]

使用欧式距离公式,(0,0)与3个样本的距离,与B最近得出结果

sorted接受三个参数,返回一个排序之后的list。
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=Ture)

sorted函数,针对的对象是list内的元素!不是整个list,所以,在key=函数这个应用时,是直接作用于元素对象上,并非list上!!!

第一个接受一个可迭代的对象(因为sorted实现了迭代协议,所以接受的参数不一定需要list,可以迭代的对象就可以,也是duck typing),返回一个排序之后的列表。

第二个接受一个布尔值,选择是否反转排序结果。

第三个接受一个回调函数,这个回调函数只能有一个参数(如果有多个参数,请用偏函数),根据这个函数的返回值进行排序。

猜你喜欢

转载自blog.csdn.net/qq_42799920/article/details/81216021