KNN原理及优缺点KNN的python实现KNN的python代码中的数据格式
KNN原理及优缺点
KNN算法又称为k近邻分类(k-nearest neighbor classification)算法。
算法原理是,从训练集中找到和新数据距离最接近的k条记录,然后根据这K条记录的分类来决定新数据的类别。所以Knn的关键是,训练集与测试集、距离或相似的衡量、k的大小及分类决策规则。一旦他们确定了,则结果就确定了。常用的距离度量公式是欧氏距离,K值的选择反映了对近似误差与估计误差之间的权衡,K值的选择会对结果产生重大的影响,通常由交叉验证选择最优的K值。
KNN算法的优点: 简单,易于理解,易于实现,无需估计参数,无需训练; 适合对稀有事件进行分类;特别适合于多分类问题, kNN比SVM的表现要好
缺点:懒惰算法,对测试样本分类时的计算量大,内存开销大(我自己够用)
KNN的python实现
from numpy
import *
import operator
'''从文件中读取数据,将文本记录转换为矩阵,提取其中特征和类标'''
def filematrix(filename):
fr=open(filename)
arrayOLines=fr.readlines()
numberOfLines=len(arrayOLines)
returnMat=zeros((numberOfLines,
7))
classLabelVector=[]
index=
0
for line
in arrayOLines:
line=line.strip()
listFromLine=line.split(
'\t')
returnMat[index, : ]=listFromLine[
1:
8]
classLabelVector.append(listFromLine[-
1])
index+=
1
return returnMat,classLabelVector
'''归一化数字特征值到0-1范围,防止特大值与特小值的影响'''
'''输入为特征值矩阵'''
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))
return normDataSet, ranges, minVals
def classify(sample,dataSet,labels,k):
dataSetSize=dataSet.shape[
0]
'''距离计算'''
diffMat=tile(sample,(dataSetSize,
1))-dataSet
sqDiffMat=diffMat**
2
sqDistances=sqDiffMat.sum(axis=
1)
distances=sqDistances**
0.5
sortedDistIndicies=distances.argsort()
'''选择距离最小的k个点'''
classCount={}
for i
in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,
0)+
1
'''从大到小排序'''
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(
1),reverse=
True)
return sortedClassCount[
0][
0]
def ClassTest():
hoRatio=
0.20
datingDataMat,datingLabels=filematrix(
'user_info_and_topic_5topicand50word.txt')
normMat, ranges, minVals=autoNorm(datingDataMat)
m =normMat.shape[
0]
numTestVecs=int(m*hoRatio)
precisionCount=
0.0
k=
35
for i
in range(numTestVecs):
classifierResult=classify(normMat[i, : ],normMat[numTestVecs:m, : ], datingLabels[numTestVecs:m],k)
print(
"The classifier came back with: %s, the real answer is: %s" % (classifierResult, datingLabels[i]))
if(classifierResult == datingLabels [i] ) :
precisionCount +=
1.0
print(
"the total precision rate is: %f" % (precisionCount/float(numTestVecs)))
def main():
ClassTest()
if __name__==
'__main__':
main()
KNN的python代码中的数据格式
如图所示,为以上算法的数据格式,但是在运用是需要将数据的第一行删除,只保留数字。并将其转化为.txt文档,注意最好是utf-8的形式。以下代码中的,其中7表示age,user_province,topic1……..topic5七个变量
returnMat=zeros((numberOfLines,
7))
以下代码是获得变量X的
returnMat[index, : ]=listFromLine[
1:
8]
'''从文件中读取数据,将文本记录转换为矩阵,提取其中特征和类标'''
def filematrix(filename):
fr=open(filename)
arrayOLines=fr.readlines()
numberOfLines=len(arrayOLines)
returnMat=zeros((numberOfLines,
7))
classLabelVector=[]
index=
0
for line
in arrayOLines:
line=line.strip()
listFromLine=line.split(
'\t')
returnMat[index, : ]=listFromLine[
1:
8]
classLabelVector.append(listFromLine[-
1])
index+=
1
return returnMat,classLabelVector
如下图所示,为KNN算法,针对我的数据跑出的精度,以及预测的标签,通过调节K值来调解预测的精度。
转载请注明原文地址: https://ju.6miu.com/read-1294902.html