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。

  

原文地址:https://www.cnblogs.com/GDUT-xiang/p/5718738.html