算法描述:
k-近邻算法主要就是采用测量不同特征值之间的距离方法分类。原理:存在一个数据集合即训练样本,并且样本中的数据都存在标签,也即我们知道每个样本数据和所属分类的对用关系,输入没有标签的新数据之后,将新数据的每个特征和样本集数据中数据对应的特征进行比较,然后算法提取样本数据集中特征最为相似(最近邻)的数据的标签。若过一个样本在特征空间的k个最相似的样本属于一个类别,那么该样本也属于这个类别,也即k-近邻算法。一般k值不大于20;
对应于一个k-近邻的小例子:判断一部电影到底是爱情片,还有动作片(采取的特征主要就是接吻镜头和打斗镜头)
数据采集:
电影名称 | 打斗镜头 | 接吻镜头 | 电影类型 |
California man | 3 | 104 | 爱情 |
he is not really into dudes | 2 | 100 | 爱情 |
beautiful woman | 1 | 90 | 爱情 |
窃听风云 | 103 | 2 | 动作 |
精武英雄 | 140 | 1 | 动作 |
纵横四海 | 97 | 2 | 动作 |
? | 2 | 102 | ? |
未知电影并不清楚是什么类型的电影,但是也根据其他的电影计算出距离(具体方法见下)
电影名称 | 距离 |
California man | 20.5 |
he is not really into dudes | 18.7 |
beautiful woman | 19.2 |
窃听风云 | 115.3 |
精武英雄 | 117.2 |
纵横四海 | 118.9 |
k-近邻算法的一般流程:
(1)收集数据
(2)准备数据
(3)分析数据
(4)训练算法,此步骤不适合k-近邻算法
(5)测试算法,计算误差率
(6)使用算法 分类
实施KNN算法的伪代码:
对应于未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点的距离
(2)按照距离递增排序
(3)选取与当前距离最小的k个点
(4)确定前k个点所在类别出现的频率
(5)返回前k个点频率最高的类别作为当前点的类别
python简单实现kNN小例子:
__author__ = 'XD'
from numpy import *
import operator
def createDataset():
group = ([1.0,1.1],[1.0,1.0],[0.0,0.0],[0.0,0.1]) #训练样本
lables = ['A','A','B','B'] #目标变量
return group,lables
def classify0(inx,dataset,lables,k):
datasetsize = len(dataset) #维度
diffMat = tile(inx,(datasetsize,1))-dataset #计算距离
sqDiffMat = diffMat**2
sqDistance = sqDiffMat.sum(axis=1)
distance = sqDistance**0.5
sortedDistIndicies = distance.argsort() #输出每个元素排序的序号
classCount = {}
for i in range(k):
voteIlable = lables[sortedDistIndicies[i]]
classCount[voteIlable] = classCount.get(voteIlable,0)+1
sortedclassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) #排序 倒排以第二个元素为准
return sortedclassCount[0][0]
'''
实施kNN时需要,inx为输入向量【0,0】dataset为上面函数的group,lables函数也是由上面函数求出,k的值取3
'''
#此小例子的输出结果是B