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