k-近邻算法

337 阅读1分钟

代码是机器学习里的,我加了一点解释,今天开始接触机器学习,代码还是有点生疏。

#分类器
import numpy as np
import operator

def classify0(inx,dataSet,labels,k):
    #dataSetSize得到列数
    dataSetSize = dataSet.shape[0]
    #diffMat = np.tile(inx,(dataSetSize,1))-dataSet
    """
    用tile,把一行inX变成4行一模一样的(tile有重复的功能,dataSetSize是重复4遍,后面的1保证重复完了是4行,而不是一行里有四个一样的),
    不用的话输出d   [0 0 0 0 0 0 0 0]
    """
    d = np.tile(inx,(dataSetSize,1))
    diffMat = d-dataSet
    sqDiffmat = diffMat**2
    sqDistances = sqDiffmat.sum(axis = 1)
    distances = sqDistances**0.5
    sortedDis = distances.argsort()
    #print(sortedDis)
    cla = {}
    for i in range(k):
        vot = labels[sortedDis[i]]
        cla[vot] = cla.get(vot,0) + 1
        #print(cla[vot])
        #用iteritems,AttributeError: 'dict' object has no attribute 'iteritems'
        #原因:python3中已经没有这个属性,直接改为items即可
    sortedcla = sorted(cla.items(),key = operator.itemgetter(1),reverse=True)
    """
    operator.items函数
    operator模块提供的items函数用于获取对象的哪些维的数据,参数为一些序号。看下面的例子
    a = [1,2,3] 
    >>> b=operator.items(1)      //定义函数b,获取对象的第1个域的值
    >>> b(a) 
    2
    >>> b=operator.items(1,0)  //定义函数b,获取对象的第1个域和第0个的值
    >>> b(a) 
    (2, 1)
    """
    return sortedcla[0][0]
group = np.array([[1.,1.1],[1.,1.],[0.,0.],[0.,0.1]])
labels = np.array(['A','A','B','B'])
a = classify0([0,0],group,labels,3)
print(a)