邻近算法,或K近邻法(KNN,KNN)
分类算法是数据挖掘中的一个分类,最简单的
方法。K近邻是K最近邻的意思,说每个样品可由其最近的邻居K.表示
KNN算法的
核心思想是:如果一个样本在特征
空间中属于大多数的K近邻样本类别,样本也属于这一范畴,并对这类样本的特性,在确定分类决策,分样本的分类仅由最近的一个或多个样本的类别确定。KNN方法只对极少数的课堂决策中的相邻样本相关。由于KNN方法主要取决于周围有限的邻近的样本,而不是歧视类的字段来确定类别。因此,KNN更适合于重叠域或重叠域的样本集。
在上面的
图片中,哪一个类是确定要给出的绿色圆,是红色三角形还是蓝色正方形如果k=3,因为红色三角形的比率为2 3,绿色圆圈将被赋予红三角的一类。如果k = 5是3 5,由于蓝方比率,绿色圈将被赋予蓝色四边形类。
K近邻(K-Nearest Neighbor,KNN)分类算法是一种比较成熟的方法在理论上最简单的机器
学习算法,这种方法的思想是:如果一个样本是K在特征空间中,这是最相似的,在特征空间中的样本属于某个类别,然后样本属于这一类。KNN算法中,所选择的邻居
都是对象是否被
正确分类。在决策,分样本的分类是由最近的一个或多个样本的类别确定。虽然KNN方法取决于原则的极限定理,它是在课堂上很小的数量只与相邻的样本因为KNN方法主要依赖于周围有限的相邻样本,而不是区分类字段来确定类别。因此,KNN更适合于重叠域或重叠域的样本集。
KNN算法不仅可以用于分类也是回归。找到k个近邻样本,这些邻居的
属性被指定到样品,和样品的属性可以得到一个更有用的方法是给予不同的权重(权重)对样品不同距离的邻居的
影响,如重量的距离成反比。
用KNN算法预测豆膜使用者的性别
摘要
本文认为,不同性别
类型选择不同类型的电影,并进行了实验验证。我们用100最新的274电影,100豆片数最活跃的
用户,有37部电影类型的属性特征。KNN算法是用来建立用户性别bean的
芯片的分类。以90%的样品作为训练样本,10%作为试验样本,准确率可达81.48%。
实验数据
本实验所使用的数据来自豆瓣用户,选取了274个豆用户最近看过的100部电影,计算了每个用户的电影类型,在实验数据中有37种类型,所以37种类型是用户的属性属性。每个特征的值是100部电影中的电影数量。用户的标签是性别,因为bean的皮瓣没有用户性别信息,所以它是手动标注的。
数据的格式如下所示:
x1,1,x1,2,x1,3,x1,4 x1,36 x1,37,Y1,…
x2,1,x2,2,x2,3,x2,4…x2,36,x2,37,Y2
…
x274,1,x274,2,x274,3,x274,4…x274,36,x274,37,y274
实例:
0,0,0,3,1,34,5,0,0,0,11,31,0,0,38,40,0,0,15,8,3,9,14,2,3,0,4,1,1,15,0,0,1,13,0,0,1,1 0,1,0,2,2,24,8,0,0,0,10,37,0,0,44,34,0,0,3,0,4,10,15,5,3,0,0,7,2,13,0,0,2,12,0,0,0,0
有274条这样的数据,代表274个样本,每一个样本的前37个数据是样本的37个特征值,最后一个是标签,即性别:男性为0,女性为1。
在本实验中,前10%个样本被作为测试样本,其余的被用作训练样本。
首先,所有的数据进行归一化
处理,矩阵中的每个列的最大值(max_j),最小值(min_j),和数据x_j在矩阵。
x_j =(x_j-min_j)/(max_j-min_j)。
然后,对每个测试样本,计算所有训练样本的欧氏距离,测试样本i与训练样本j之间的距离为:
distance_i_j = sqrt((席,1-xj,1)^ 2 +(席,2-xj,2)^ 2 +…+(席,37株,37)^ 2),
样本的所有距离从小到大
排序,最频繁的标签被选择在第一K,也就是样本I的预测值。
实验结果
首先,选择一个合适的K值,K为7d,相同的测试样本和训练样本来检验其正确率,结果如下表所示。
用不同的k值选择正确的速率表
从上述结果可以看出,K=3检验的平均精度最高,为74.07%,最高可达81.48%。
不同的测试集来自同一个样本集,它们是随机选择的。
Python代码
此代码不是原始的,来自Peter Harrington(2013),并已更改。
# UTF-8编码:
从NumPy import *
进口经营者
DEF classify0(INX,数据集,标签,K):
datasetsize =数据。形状{ 0 }
diffmat =瓦(INX,(((datasetsize,1))-数据集
sqdiffmat = diffmat * * 2
sqdistances = sqdiffmat.sum(轴= 1)
距离= sqdistances * * 0.5
sorteddistindicies = distances.argsort()
classcount = { }
我在射程(k):
voteilabel =标签{ sorteddistindicies {我} }
classcount { voteilabel } = classcount.get(voteilabel,0)+ 1
sortedclasscount =排序(classcount.iteritems(),关键= operator.itemgetter(1)、反向= true)
返回sortedclasscount { 0 } { 0 }
DEF autonorm(数据集):
minvals = dataset.min(0)
maxvals = dataset.max(0)
maxvals - minvals范围=
normdataset =零(形状(数据集))
m =数据集。形状{ 0 }
normdataset =数据集-瓦(minvals,(m,1))
normdataset = normdataset /瓦(范围,(((m,1))#元智分
返回normdataset,范围,minvals
DEF file2matrix(
文件名):
=打开(文件名)
numberoflines = Len(fr.readlines())#获得文件中的行数
returnmat =零(((numberoflines,37))#准备矩阵返回
classlabelvector = #准备标签返回{ }
=打开(文件名)
指数= 0
线在fr.readlines():
线= line.strip()
listfromline = line.split(',')
returnmat {指数:= listfromline 0:37 } { }
ClassLabelVector.append(int(listfromline { 1 }))
指数= 1
Fr.close()
返回returnmat,classlabelvector
genderclasstest(DEF):
霍雷肖= 0.10 #伸出10%
DatingDataMat,datinglabels = file2matrix('doubanmoviedataset .txt)#加载数据集文件
NormMat,范围,minvals = autonorm(datingdatamat)
M = normmat形状{ 0 }。
numtestvecs = int(M·霍雷肖)
testmat = normmat { 0:numtestvecs,:}
trainmat = normmat { numtestvecs:M,:}
trainlabels = datinglabels { numtestvecs:M }
K = 3
错误数量= 0
我在范围(numtestvecs):
classifierresult = classify0(testmat {我:},trainmat,trainlabels,K)
打印分类器返回:%d,真正的答案是:%d%
如果(classifierresult!= datinglabels {我}):
错误数量= 1
打印总误差:%%错误数量
打印总准确率为F %(1.0-errorcount /浮(numtestvecs))