KNN

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

2019-02-13  本文已影响22人  MichalLiu

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
上一篇下一篇

猜你喜欢

热点阅读