用python代码示例说明KNN算法的实际应用

用python代码示例说明KNN算法的实际应用
邻近算法,或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))

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部