zoukankan      html  css  js  c++  java
  • k-近邻算法(kNN)

      工作原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

    # -*- coding: utf-8 -*-
    # 导入了两个模块,第一个是科学计算包Numpy,第二个是运算符模块,K近邻算法执行排序操作时将使用这个模块提供的函数
    from numpy import *
    import operator
    
    """
        创建数据集和标签
    """
    def createDataSet():
        group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
        labels = ['A','A','B','B']
        return group, labels
    
    """
        四个输入参数:用于分类的输入向量是inX,输入的训练样本集为dataSet,标签向量labels,
                      最后的参数k表示用于选择最近邻居的数目,其中标签向量的元素数目和矩阵
                      dataSet的行数相同
    """
    def classify0(inX, dataSet, labels, k):
        #计算距离
        dataSetSize = dataSet.shape[0]
        diffMat = tile(inX, (dataSetSize, 1)) - dataSet
        sqDiffMat = diffMat ** 2
        sqDistances = sqDiffMat.sum(axis = 1)
        distances = sqDistances ** 0.5
        sortedDistIndicies = distances.argsort()
        classCount = {}
        #选择距离最小的K个点
        for i in range(k):
            voteIlabel = labels[sortedDistIndicies[i]]
            classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
        #使用程序operator模块的itemgetter方法,按照第二个元素的次序对元组进行排序,此处的排序为逆序,即按照从大到小的次序,最后返回发生频率最高的元素标签
        sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True)
        return sortedClassCount[0][0]
    
    
    
    dataSet, labels = createDataSet()
    testPoint = [0, 0]
    print classify0(testPoint, dataSet, labels, 3)

      分类器并不会得到百分百正确的结果,我们可以使用多种方法检测分类器的正确率。此外分类器的性能也会受到很多因素的影响,例如分类器设置和数据集等。用测试集去测试分类器的错误率,错误率即是分类器给出错误结果的次数除以测试执行的总数。完美的分类器的错误率为0,最差分类器的错误率为1.0。

      

  • 相关阅读:
    LCT 动态树 模板
    [HNOI2010] 物品调度 fsk
    [HNOI2010] 矩阵 matrix
    [HNOI2010] 平面图判定 planar
    [HNOI2010] 公交线路 bus
    [HNOI2017]抛硬币
    [HNOI2010] 弹飞绵羊 bounce
    [HNOI2010] 合唱队 chorus
    [HNOI2017]礼物
    [HNOI2017]大佬
  • 原文地址:https://www.cnblogs.com/GDUT-xiang/p/5718738.html
Copyright © 2011-2022 走看看