from numpy import *
import operator
import matplotlib
import operator
from os import listdir
import matplotlib.pyplot as plt
def classify0(inX, dataSet, labels, k):
# 用于分类的输入向量是inX,输入的训练样本集为dataSet,
# 标签向量为 labels ,最后的参数 k 表示用于选择最近邻居的数目,其中标签向量的元素数目和矩
# 阵 dataSet 的行数相同。
# 获取 数组 形状的 第一个 参数 a=[[1,2],[1,2],[1,2]] a.shape = [3,2] a.shape[0] = 3
dataSetSize = dataSet.shape[0]
# tile 代表了inX,复制为dataSetSize行,1列的数组
diffMat = tile(inX, (dataSetSize,1)) - 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.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
filename="datingTestSet2.txt"
#清洗数据
def file2matrix(filename):
fr =open(filename)
arrayOLines=fr.readlines()
numberOLines=len(arrayOLines)
returnMat=zeros((numberOLines,3))
classLabelVector=[]
index=0
for line in arrayOLines:
line=line.strip()
listFromLine=line.split('\t')
returnMat[index,:]=listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index+=1
# fig = plt.figure()
# ax = fig.add_subplot(111)
# ax.scatter(returnMat[:,0],returnMat[:,1],15.0*array(classLabelVector),15.0*array(classLabelVector))
# plt.show()
return returnMat,classLabelVector
#归一化
def autoNorm(dataSet):
minVals=dataSet.min(0) #每列最小值
print(minVals)
maxVals=dataSet.max(0) #每列最大值
print(maxVals)
ranges=maxVals-minVals
# normDataSet=zeros(shape(dataSet))
m=dataSet.shape[0] #计算多少维度 [0]表示多少行(也就是第一个维度是多少)
normDataSet=dataSet-tile(minVals,(m,1)) #矩阵减法
normDataSet=normDataSet/tile(ranges,(m,1)) #矩阵除法 tile() 将变量内容复制成输入矩阵同样大小的矩阵
print(normDataSet,ranges,minVals)
return normDataSet,ranges,minVals
def datingClassTest():
horatio=0.10
a, b = file2matrix(filename)
normat,ranges,minvals=autoNorm(a)
m=normat.shape[0] #取第一个维度 1000
numtesvecs=int(m*horatio) #100
print(numtesvecs)
errorCount=0.0
for i in range(numtesvecs):
classifilerreult=classify0(normat[i,:],normat[numtesvecs:m,:],b[numtesvecs:m],3)
print(classifilerreult,b[i])
if (classifilerreult !=b[i]):errorCount+=1.0
print(errorCount/float(numtesvecs))
if __name__=="__main__":
datingClassTest()
初识KNN(k-近邻算法)
最新推荐文章于 2024-03-13 01:06:49 发布