K-近邻算法(KNN)

简介

k近邻算法是数据分类一种常用的算法,属于监督学习算法的一类,它采用不同特征值之的距离进行分类。K近邻算法具有精度高、对异常值不敏感、无数据输入假定的优点,缺点是计算复杂度高、空间复杂度高。适用于数值型和标称型数据的计算分类。

K近邻算法的一般流程包括:

  1. 收集数据
  2. 准备数据:距离计算所需要的数值,最好是结构化的数据
  3. 分析数据
  4. 训练算法:根据训练样本得到
  5. 测试算法:计算错误率
  6. 使用算法

Case

已知四个点,及其对应的分类。我们需要根据已有数据,判别未知点的分类。首先导入数据。

from numpy import *

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

对未知点类别属性的判别执行以下的步骤

  1. 计算已知类别数据点和当前点之间的距离
  2. 按照距离递增排序
  3. 选取与当前点距离最小的k个点
  4. 确定前k个点所在类别的出现规律
  5. 返回前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


def classfiy(inX, dataSet, labels, k):
    # size of the dataSet array
    dataSetSize = dataSet.shape[0]
    <!--得到未知点和已知点的差值-->
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet
    <!--差值平方-->
    sqDiffMat = diffMat ** 2
    <!--未知点和已知点距离的平方和-->
    sqDistances = sqDiffMat.sum(axis=1)
    <!--得到距离差数据-->
    distances = sqDistances ** 0.5
    <!--argsort得到index的sort,index可以关联labels的index-->
    sortedDistanceIndicts = distances.argsort()
    print 
    classCount = {}

    for i in range(k):
        voteIlabel = labels[sortedDistanceIndicts[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount


data_set = createDataSet()

result = classfiy([0, 0], data_set[0], data_set[1], 3)
<!--返回的结果是B-->
print result
原文地址:https://www.cnblogs.com/jun-ma/p/5249154.html