机器学习实战--KNN算法

来源:互联网 发布:bilibili视频下载 mac 编辑:程序博客网 时间:2024/06/06 05:08

K近邻算法

    存在一个样本数据集合,样本集中的每个元素都存在标签,这个标签也就是每一个数据与所属分类的对应关系。输入没有标签的数据后,将新数据的每个特征与样本集中已有的数据对应的特征进行比较,根据算法提取出与新数据特征最相似的样本集中的数据所对应的分类。一般来说,只选择样本集前k个最相似的数据(一般K<=20),选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

算法实现(python3)

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 = {}   #定义一个dict用来存放labels(key),和对应的val    for i in range(k):        voteIlabel = labels[sortedDistIndicies[i]]        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1    sortedClassCount = sorted(classCount.items(),        key = operator.itemgetter(1), reverse = True)    return sortedClassCount[0][0]

tile函数:

    numpy.tile(A, reps)    通过A,根据reps构造一个array,也就是将A,根据参数按行按列重复。    A的类型可以是:array,list,tuple,dict,matrix,int, string,float,bool    reps的类型是:tuple,list,dict,arrayintbool,但不能是floatstring,matrix        SimpleExample:        >>> A = [1, 2, 3]        >>> tile(A, 2)        [1, 2, 3, 1, 2, 3] # 列表A横向重复两边        >>> tile(A, (3, 2)) #列表A首先在横向重复两边,然后纵向重复3遍         [[1 2 3 1 2 3]         [1 2 3 1 2 3]         [1 2 3 1 2 3]]        reps里面的从后往前第i个数字分别对应着A需要在第i维度上需要重复的次数, 例如tile(A, (3,2))表示A在第一个维度    上需要重复2,在第2个维度上需要重复3次。

sum函数:

    当无参数时,把矩阵中所有元素相加求和,返回一个数;    当sum(axis = 0), 将矩阵同列的元素相加,返回一个list;    当sum(axis = 1), 将矩阵同行的元素相加,返回一个list

sorted和operator.itemgetter():

    sorted函数:py内置的排序函数,可以对list或者iterator进行排序;    函数原型如下:    sorted(iterable[, cmp[, key[, reverse]]])    第一个参数是list或者iterator;    第二个参数是一个函数,这是一个能让两个iterator元素能够相互比较大小的方法;    第三个参数也是一个函数,这个函数用来选取带排序对象的哪一个元素来排序;    第四个参数revesre,不多讲。    operator.itemgetter()函数: 用来获取对象某些域的值, 返回的是一个函数;    Example:    >>> b = [1, 2, 3]    >>> a = operator.itemgetter(2)    >>> a(b)    3    >>> b = [1, 2, 3, 4, 5]    >>> a = operator.itemgetter(2, 4), 取第3个值和第5个值    >>> a(b)    (3, 5)    所以此处的sorted函数,取dict每一个item的第二值,进行升序排序