KNN算法概述

KNN算法是比较简单的基于欧氏距离的有监督分类算法;

大致思路:

对于多维多特征数据,数据的分布呈现一定的规律,所以通过计算待分类样本距离数据集的各个欧氏距离,距离最短的数据中点的类别,就有可能是该待分类样本的类别。

类似于聚类,其中K邻近中K的含义为欧氏距离最小的k个样本,通过统计k中哪个类别个数最多,则说明该类别最有可能是待分类样本的类别;

样例参考代码:

def classify(inx,dataset,labels,k):
    #输入:inx为预测样本的特征向量/dataset训练集/labels训练集标签/k最小的个数
    datasetsize=dataset.shape[0]
    #获得训练集的个数,也就是计算的个数
    diffmat=tile(inx,(datasetsize,1))-dataset
    #title为平铺函数,旨在对inx进行扩充,由(1,n)变为(m,n)直接进行欧式计算
    sqdiffmat=diffmat**2
    #注意**2是针对于矩阵内的单个元素,而不是矩阵乘积
    sqdistances=sqdiffmat.sum(axis=1)
    #对每一行的各列求和,压缩矩阵为一个列向量
    distances=sqdistances**0.5
    #列向量整体开方,仍然是欧氏距离计算范畴
    sorteddistindicies=distances.argsort()
    #argsort返回排序后的索引,而非数值
    classcount={}
    for i in range(k):
        voteilabel=labels[sorteddistindicies[i]]
        classcount[voteilabel]=classcount.get(voteilabel,0)+1
        #利用字典进行值得统计;
        #get函数旨在当字典中不含有该索引的时候,添加,并且赋值default,这里default=1
    sortedclasscount=sorted(classcount.items(),key=lambda d:d[1],reverse=True)
    #针对字典进行排序,返回一个二维数组而非dict;
    return sortedclasscount[0][0]

【补充说明】:

sorted函数:https://www.runoob.com/python/python-func-sorted.html

dict以及dict排序、迭代器问题:https://www.runoob.com/python/att-dictionary-get.html  https://blog.csdn.net/qq_32126633/article/details/78359767

numpy中sum得问题:https://blog.csdn.net/leekingsen/article/details/76242244

numpy中argsort得问题:https://blog.csdn.net/maoersong/article/details/21875705

numpy中tile得问题:https://blog.csdn.net/qq_39072607/article/details/89364254?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

猜你喜欢

转载自www.cnblogs.com/songlinxuan/p/12939950.html
今日推荐