编程实现k近邻分类器,利用西瓜数据集3.0α,给出其中编号为8的西瓜的预测结果。
代码全是《机器学习》上的,只是将其整合到了一起,能够运行手写体识别。
内容大部分进行了注释,可能有些注释不够精准或者不容理解,见谅!
代码:
from numpy import * #引入numpy用来构建数据类型
import operator #用来计算距离
dataMat=array([[0.697,0.460],[0.774,0.376], [0.634,0.264],
[0.608,0.318],[0.556,0.215],[0.403,0.237],
[0.481,0.149],[0.666,0.091],[0.243,0.267],
[0.245,0.057],[0.343,0.099],[0.639,0.161],
[0.657,0.198],[0.360,0.370],[0.593,0.042],
[0.719,0.103]]) #准备训练数据
def classify0(inX, dataSet, labels, k): #k临近距离计算,并且输出频率最大的数
dataSetSize = dataSet.shape[0] #统计数据的行数
diffMat = tile(inX, (dataSetSize,1)) - dataSet #计算被测数据与训练数据的差
sqDiffMat = diffMat2 #平方
sqDistances = sqDiffMat.sum(axis=1) #求和
distances = sqDistances0.5 #开方求距离
sortedDistIndicies = distances.argsort() #给距离排序,返回他们的索引
classCount={} #建立一个字典
for i in range(k): #遍历前k个数
voteIlabel = labels[sortedDistIndicies[i]] #返回第k索引的标签
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #统计该标签的个数
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #将标签个数按照降序排序
return sortedClassCount[0][0]
if name==‘main’:
labels=[‘是’,‘是’,‘是’,‘是’,‘是’,‘是’,‘是’,‘否’,‘否’,‘否’,‘否’,‘否’,‘否’,‘否’,‘否’,‘否’,]
inX=[0.437 ,0.211]
k=int(input(“请输入k值:”))
ccc=classify0(inX,dataMat,labels,k) #调用函数
print(ccc) #输出标签结果
运行结果
k的取值范围1-16,都可以,建议1-6.