文章目录
一、kNN算法概述
1.k邻近算法直译为K个最近的邻居,是一种聚类算法。采用测量不同特征值之间的距离方法进行分类。基于大量数据的基础上,做出相应的预测,一般运用于手写数字识别,约会网站的大量数据匹配等等。
2.优点:精度高,对异常值不敏感,无数据输入假定.
3.缺点:计算复杂度高,空间复杂度高。
4.适用数据范围是:数值型和标称型。
二、算法原理
以《机器学习实战》第二章导言为例我们需要鉴别某个电影的类别,我们通过比对发现他和我们列举的中5个电影相似,我们发现这5个镜头其中4个是打斗,1个是接吻,所以判定这部电影是武打片。这就是一个5NN算法。
总结出他的流程:
输入:数据x 已知类别的样本z
输出:x的类别y
1.计算数据x与z中每个样本的距离d
2.利用距离d获取与x距离前K小的索引index
3.利用index从样本z中选取出k个样本
4.统计这k个样本的类别,类别数统计最多的作为x的类别
三、相关代码
1.准备:使用Python导入数据
导入两个模块,一个是科学计算包NumPy,还一个是运算符模块。定义createDataSet函数,使用该函数创建数据集和标签。
这里有4组数据,每组数据有两个我们已知的属性或特征值,向量labels包含了每个数据点的标签信息,labels包含的元素个数等于group矩阵行数。
from numpy import * #导入科学计算包Numpy
import operator #导入运算符模块
def createDataSet():
group=array([[3,104],[2,100],[101,10],[99,5]]) #导入四部电影[打斗镜头次数,接吻镜头]
labels=['A','A','B','B'] #labels分类标签,A为爱情片,B为接吻镜头
return group,labels
2.从文本文件中解析数据
伪代码:对未知类别属性的数据集中的每个点依次执行以下操作
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。
def classify0(intX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=tile