美文网首页KNN
【机器学习】分类算法之K近邻算法

【机器学习】分类算法之K近邻算法

作者: MichalLiu | 来源:发表于2019-02-13 10:58 被阅读22次

    kNN原理:

    对于一个给定的训练集,我们知道训练样本中的每组数据特征及其分类标签。然后输入没有标签的新数据,将新数据的每个特征与训练集中的每个特征进行比较,选取特征最相似(最近邻:k=1)的分类标签,一般来说,我们只选取前 k 个最相似的分类标签,这也是 k-近邻算法中 k 的由来,通常 k 不超过 20。最后,选择 k 个数据中出现次数最多的分类标签作为新数据的分类结果。

    K-近邻算法的一般流程

    收集数据:可以使用任何方法

    准备数据:距离计算所需要的数值,最好是结构化的数据格式

    分析数据:可以使用任何方法

    训练算法:此步骤不适用于K-近邻算法

    测试算法:计算错误率

    使用算法:首先需要输入样本数据和结构化的输出结果,然后运行K-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

    K近邻算法伪代码:

    对未知类别属性的数据集中的每个点依次执行以下操作:

    (1)计算已知类别数据集中的点与当前点之间的距离;

    (2)按照距离递增次序排序;

    (3)选取与当前点距离最小的k和点;

    (4)确定前k个点所在类别的出现频率;

    (5)返回当前k个点出现频率最高类别作为当前点的预测分类。

    python3.5函数代码:

    import numpy as np
    import operator
    
    group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    
    def classify0(inX,dataSet,labels,k):
        dataSetSize=dataSet.shape[0]
        #距离计算,新的数据与样本的距离进行减法
        diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
        #对数组的每一项进行平方
        sqDiffMat=diffMat**2
        #数组每个特征值进行求和
        sqDistances=sqDiffMat.sum(axis=1)
        #每个值开方
        distances=sqDistances**0.5
        #索引值排序
        sortedDistIndicies = distances.argsort()
        #选取距离最小的前k个值进行索引,从k个中选取分类最多的一个作为新数据的分类
        classCount={}
        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)
        #返回前k个点中频率最高的类别
        return sortedClassCount[0][0]
        
    print(classify0([0,0],group,labels,3))
    
    out:B
    

    相关文章

      网友评论

        本文标题:【机器学习】分类算法之K近邻算法

        本文链接:https://www.haomeiwen.com/subject/avpreqtx.html