K-最近邻算法(KNN)
来源:互联网 发布:淘宝秋冬裙子 编辑:程序博客网 时间:2024/05/10 12:37
K-最近邻算法(KNN)
KNN算法是监督学习中分类方法的一种,主要思想是如果一个样本在特征空间中的k个最近的样本中的大多数都属于某个类别,则该样本属于这个类别,并具有这个类别上的特性。
补充: 所谓监督学习与非监督学习,是指训练数据是否有标柱类别,若有则为监督学习,若否则为非监督学习。 监督学习是指根据训练数据学习一个模型,然后能对后来的输入做预测。在监督学习中,输入变量和输出变量可以是连续的,也可以是离散的。若输入变量和输出变量均为连续变量,则称为回归;输出变量为有限个离散变量,则称为分类。
KNN算法流程:
- 准备数据:对数据进行预处理,选用合适的数据结构存储训练数据和测试数据。
- 先给k一个值
- 遍历训练集,计算当前测试样本与训练集中样本的距离或相似度,
- 根据k个距离最小或相似度最大的k个训练样本的类别确定测试样本的类别。
- 测试集测试完毕后计算错误率,继续设定不同的k值返回到第3步,最后取错误率最小的k值。
- 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行KNN判定输入数据分别属于哪个分类,最后对计算出的分类执行后续处理。
距离度量公式有:欧几里得距离,明可夫斯基距离,曼哈顿距离,切比雪夫距离,马氏距离等,相似度的度量公式有:余弦相似度,皮尔森相关系数,Jaccard相似系数。
补充:欧几里得距离度量会受特征不同单位刻度的影响,所以一般需要先进行标准化处理。
类别的判断方法:
- 投票决定:少数服从多数,近邻中哪个类别的点最多就分为该类。
- 加权投票法:根据距离的远近,对近邻的投票进行加权,距离越近则权重越大。
knn还可用于回归,目标样本的属性值是k个邻居属性值的平均值。
下面是使用KNN改进约会网站的配对效果的python实现代码:
from numpy import *imort operator#准备数据def file2matrix(filename): fr = open(filename) numberOfLines = len(fr.readlines()) #get the number of lines in the file returnMat = zeros((numberOfLines,3)) #prepare matrix to return classLabelVector = [] #prepare labels return fr = open(filename) index = 0 for line in fr.readlines(): line = line.strip() listFromLine = line.split('\t') returnMat[index,:] = listFromLine[0:3] classLabelVector.append(int(listFromLine[-1])) index += 1 return returnMat,classLabelVector#归一化数据def autoNorm(dataSet): minVals = dataSet.min(0) maxVals = dataSet.max(0) ranges = maxVals - minVals normDataSet = zeros(shape(dataSet)) m = dataSet.shape[0] normDataSet = dataSet - tile(minVals, (m,1)) normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide return normDataSet, ranges, minVals#分类def classify0(inX, dataSet, labels, k): # 计算距离 dataSetSize = dataSet.shape[0] #计算数据的个数 diffMat = tile(inX, (dataSetSize,1)) - dataSet #tile复制inX来生成和dataSet一样大小的数据集 sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances**0.5 sortedDistIndicies = distances.argsort()#得到距离从小到大的索引值 classCount={} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]#计算错误率def datingClassTest(): hoRatio = 0.10 #hold out 10% datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file normMat, ranges, minVals = autoNorm(datingDataMat) m = normMat.shape[0] numTestVecs = int(m*hoRatio) errorCount = 0.0 for i in range(numTestVecs): classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3) print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]) if (classifierResult != datingLabels[i]): errorCount += 1.0 print "the total error rate is: %f" % (errorCount/float(numTestVecs)) print errorCount#完整应用def classifyPerson(): resultList=['not at all','in small doses','in large doses'] percentTats=float(raw_input("frequent flier miles earned per year?")) ffMiles=float(raw_input("liters of ice cream comsumed per year?")) iceCream=float(raw_input("liters of ice cream consumed per year?")) datingDataMat, datingLabels=file2matrix('datingTestSet2.txt') normMat, ranges, minVals=autoNorm(datingDataMat) inArr=array([ffMiles, percentTats, iceCream]) classifierResult=classify0((inArr-minVals)/ranges, normMat, datingLabels,3) print "you will probably like this person", resultList[classifierResult-1]
优点:
简单,易于理解,易于实现,无需估计参数,无需训练, 特别适合多分类问题,适合对稀有事件进行分类,精度高,对异常值不敏感,无数据输入假定。
缺点:消极学习法, 需要大量的存储空间(需要保存全部数据集), 耗时(需计算目标样本与训练集中每个样本的值),可解释性差。
补充:
积极学习法:先根据训练集构造出分类模型,根据分类模型对测试集分类。
消极学习法(基于实例的学习法):推迟建模,当给定训练元组时,简单地存储训练数据,一直等到给定一个测试样本。
适用数据范围:数值型和标称型。
应用KNN的常见问题:
1、k值设定为多大?
k太小,分类结果易受噪声的影响;k太大,近邻中又可能包含太多的其它类别的点。(对距离加权,可以降低k值设定的影响)。
k值通常是采用交叉检验来确定(以k=1为基准)。
经验规则:k一般低于训练样本数的平方根
2、类别如何判定最合适?
投票法没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最终的分类,所以加权投票法更恰当一些。
3、如何选择合适的距离衡量?
高维度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差。
变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化。
4、训练样本是否要一视同仁?
在训练集中,有些样本可能是更值得依赖的。
可以给不同的样本施加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响。(如何判断样本可信不可信)
5、能否大幅减少训练样本量,同时又保持分类精度?
浓缩技术(condensing)
编辑技术(editing)
KNN与推荐系统:
利用KNN进行推荐的方法分为:
- user-based: 先利用KNN算法找到与目标用户兴趣相似的k个用户,再根据这些相似用户的兴趣为目标用户进行推荐。
- item-based: 利用KNN计算与目标用户喜欢的物品相似的k个物品,然后推荐给目标用户。
- K-最近邻算法(KNN)
- K最近邻算法(KNN)
- KNN最近邻算法(K-NearestNeighbor)
- K最近邻分类算法(KNN)
- KNN K最近邻算法
- K最近邻算法(kNN)
- k最近邻算法(kNN)
- K最近邻算法(KNN,K-NearestNeighbor)
- K最近邻(KNN)
- 经典算法(4):K最近邻算法(KNN)
- K-近邻算法(KNN)
- k近邻算法(kNN)
- KNN(K近邻算法)
- K-近邻算法(KNN)
- K-近邻算法(KNN)
- KNN(K-近邻算法)
- K-近邻算法(KNN)
- kNN(k近邻算法)
- 安卓6.0权限管理
- 3、在Myeclipse中,导入formatter模板
- 常用删归档,查看归档
- python server简单入门(socket)
- c# wpf 利用截屏键实现截屏功能
- K-最近邻算法(KNN)
- 简单的全选,不选,反选的js实现方式
- 产品助理day18
- eclipse在运行模拟器时候提示:Adb connection Error:远程主机强迫关闭了一个现有的连接
- MySQL中在查询结果集中得到记录行号的方法
- RDMA编程技术
- mysql错误集
- How to enable ping response in windows 7?
- 文章标题