本博文主要参考机器学习KNN中第二个例程实现,若有不当之处,请指教,谢谢!
import numpy as np
import operator
from os import listdir
import matplotlib
import matplotlib.pyplot as plt
def classify(inX,dataSet,labels,k):
"""
inX:测试样本
dataSet:训练集
labels:训练集标签
k:选择最近邻的数目
"""
#数据集的样本数
m = dataSet.shape[0]
#测试样本与训练集样本做差
diffMat = np.tile(inX,(m,1)) - dataSet
#取平方
sqDiffMat = diffMat ** 2
#对矩阵的每一行进行相加
sqDistance = sqDiffMat.sum(axis = 1)
#开方
distances = sqDistance ** 0.5
#将距离从小到大排序
sortedDistIndicies = distances.argsort()
#选择距离最小的k个点
classCount = {}
for i in range(k):
votelabel = labels[sortedDistIndicies[i]]
classCount[votelabel] = classCount.get(votelabel,0) + 1
#排序并返回出现频率最高的类型
sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)
return sortedClassCount[0][0]
def file2matrix(filename):
"""
导入数据
"""
fr = open(filename)
#获得文件中的数据行的行数
numberOfLines = len(fr.readlines())
#生成对应的空矩阵
returnMat = np.zeros((numberOfLines,3))
classLabelVector = []
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip()
#以'\t'切割字符串
listFromLine = line.split('\t')
#每列的属性数据
returnMat[index,:] = listFromLine[0:3]
#每列的类别数据,就是label标签数据
classLabelVector.append(int(listFromLine[-1]))
index += 1
if index < 10:
print "line = ",line
print "listFromLine = ",listFromLine
#返回数据矩阵returnMat和对应的类别classLabelVector
return returnMat,classLabelVector
def autoNorm(dataSet):
"""
归一化数据
Y = (X - Xmin) / (Xmax - Xmin)
"""
#计算每种属性的最大值,最小值,范围
minVals = dataSet.min(0) #min(0)返回每一列的最小值
maxVals = dataSet.max(0)
m = dataSet.shape[0] #返回数据的行
#极差
ranges = maxVals - minVals
normDataSet = np.zeros(np.shape(dataSet))
#将原始数据与最小值做差
normDataSet = dataSet - np.tile(minVals,(m,1))
#将与最小值之差除以范围组成矩阵
normDataSet = normDataSet / np.tile(ranges,(m,1))
return normDataSet,ranges,minVals
def datingClassTest():
"""
对约会网站的测试方法
"""
#设置测试数据的一个比例
hoRatio = 0.1
#从文件中加载数据
datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
#归一化数据
normMat,ranges,minVals = autoNorm(datingDataMat)
#m为数据的行数,即样本数
m = normMat.shape[0]
#设置测试样本的数量
numTestVecs = int(m * hoRatio)
print 'numTestVecs = ',numTestVecs
errorCount = 0.0
for i in range(numTestVecs):
#对数据测试
classifierResult = classify(normMat[i,:],normMat[numTestVecs:m,:],
datingLabels[numTestVecs:m],3)
print "the classifier came back with: %d, the real answer is : %d"%(classifierResult,
datingLabels[i])
if(classifierResult != datingLabels[i]):
errorCount += 1.0
print "the total error rate is: %f" %(errorCount / float(numTestVecs))
print errorCount
if __name__=='__main__':
datingClassTest()

本文介绍了一个基于KNN算法的示例程序,通过Python实现,并详细解释了如何使用该算法进行分类预测。文中提供了完整的代码实现,包括数据读取、归一化处理、分类测试等步骤。
4991

被折叠的 条评论
为什么被折叠?



