KNN(K最临近算法)的python实现

KNN分类是一种“投票机制”  

选取K个最近的数据进行投票操作,什么类型的数据多即票数多,则测试数据就被分为该类型。

至于最近的概念,就是计算距离

我们使用欧式距离L2公式:

\displaystyle d_2(I_1,I_2)=\sqrt{ \sum_p(I^p_1-I^p_2)^2}

这里进行一个简单的K=1的KNN分类的python实现


import numpy as np
import operator
def createdataset():                                                  #创建数据集
    group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'B', 'C', 'D']                                    #定义标签
    return group, labels

#对于KNN我们一般都使用欧式距离进行分类          d(I1 - I2) = √(∑ (Ip1 - Ip2)**2
def classify(Inx, Dataset, labels, k):
    DataSetSize = Dataset.shape[0]                      #获取数据的行数,shape[1]位列数
    diffmat = np.tile(Inx, (DataSetSize, 1)) - Dataset  #将4个数据扩展为4x1的矩阵然后相减,其实就是原点对数据的距离差值
    SqDiffMat = diffmat**2                              #平方
    SqDistances = SqDiffMat.sum(axis=1)                 #将矩阵的每一行向量相加求和
    Distance = SqDistances**0.5                         #开方
    print(Distance)
    SortedDistanceIndicies = Distance.argsort()         #对矩阵进行排序
    ClassCount = {}
    for i in range(k):
        VoteiLabel = labels[SortedDistanceIndicies[i]]                     #直接挑选出距离最近的一个数据
        ClassCount[VoteiLabel] = ClassCount.get(VoteiLabel, 0) + 1         #相同的分类进行"投票"操作
    SortedClassCount = sorted(ClassCount.items(), key = operator.itemgetter(1), reverse = True)  #对ClassCount进行排序
    return SortedClassCount[0][0]

Groups, Labels = createdataset()                         #赋值
Result = classify([0, 0], Groups, Labels, 1)             #分类
print(Result)                                            #结果

最后结果为

[ 1.48660687  1.41421356  0.          0.1       ]
C

即距离为0,最近,原点属于C类

猜你喜欢

转载自blog.csdn.net/t1370620378/article/details/78348038