cs231n python代码运行记录——KNN分类器

KNN分类器

明显KNN不适合做图像处理,但是作为入门,还是写着玩玩;

采用较小的点集作为训练样本,采用K-近邻算法,对未知点进行分类,归为ABC,本实例中选取的是L2欧式距离,根据cs231n描述用的更多,而且由于样本不大,训练时间很短,懒得去换L1距离尝试效果。

#KNN分类器
import numpy as np
import operator
import time

start=time.time()

def createDataSet():
    group = np.array([[1,100],[2,70],[5,80],[100,1],[80,7],[60,5],[50,50],[52,52],[58,58]])
    labels = ['A','A','A','B','B','B','C','C','C']
    return group, labels


def classify(inX, dataSet, labels, k):
    #这里用矩阵的方法批量处理点数据
    dataSetSize = dataSet.shape[0]  #行数、点集的个数
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet  #对测试集进行行赋值,得到相同大小的矩阵作差
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1) #按照行相加,下一步算出个点到测试集的L2距离
    distances = sqDistances**0.5
    #返回distances中元素从小到大排序后的  索引值 的列表!
    sortedDistIndices = distances.argsort()
    #print('sortedDistIndices: ',sortedDistIndices)
    #定一个记录类别次数的字典
    classCount = {}
    for i in range(k):
        #取出前k个元素的类别
        voteIlabel = labels[sortedDistIndices[i]]   #voteIlabel是对应的标签
        #print('sortedDistIndices[%d]: %s' %(i,sortedDistIndices[i]))
        #用字典计算类别次数
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    #reverse降序排序字典
    b=list()    #b列表存储键(标签)对应的vote结果
    for i in classCount:
        b.append(classCount[i])
    for key,val in classCount.items():  #通过值的索引获取K近邻点vote的键(labels)
        if val == np.max(b):
           return key

if __name__ == '__main__':
    group, labels = createDataSet()    #创建数据集
    test = [1000,59]                       #测试集
    test_class = classify(test, group, labels, 4)
    print(test_class)

    end=time.time()
    print('spend time: ',float(end - start) )

给这个KNN分类器三个夸张点的测试集如下:

<注意:测试集不能在训练集中出现,否则犯规毫无意义!>

 

猜你喜欢

转载自blog.csdn.net/mingqi1996/article/details/81293314