k临近算法(kNN)采用测量不同特征值之间的距离方法进行分类,也是一种非常直观的方法。本文主要记录了使用kNN算法改进约会网站的例子。
任务一:分类算法classify0
就是使用距离公式计算特征值之间的距离,选择最邻近的k个点,通过统计这k个点的结果来得出样本的预测值。
tile函数用法在这里
argsort函数在这里
def classify0(inX,dataset,labels,k):
#shape 返回行列数,shape[0]是行数,有多少元组
datasetsize = dataset.shape[0]
#tile 复制inX,使其与dataset一样大小
diffmat = tile(inX,(datasetsize,1)) - dataset
#**表示乘方
sqdiffmat = diffmat ** 2
#按行将计算结果求和
sqdistances = sqdiffmat.sum(axis=1)
distances = sqdistances ** 0.5
#使用argsort排序,返回索引值
sortedDistIndicies = distances.argsort()
#用于计数,计算结果
classcount = {}
for i in range(k) :
voteIlabel = labels[sortedDistIndicies[i]]
classcount[voteIlabel] = classcount.get(voteIlabel,0)+1
#按照第二个元素降序排列
sortedClasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=True)
#返回出现次数最多的那一个label的值
return sortedClasscount[0][0]
任务二:读入数据
注意这里书上写错了,应该读入的是datingTestSet2.txt而不是datingTestSet.txt
书上的数据和例子下载:在这里
def file2matrix(filename):
fr = open(filename)
#打开文件,按行读入
arrayOLines = fr.readlines()
#获得文件行数
numberOfLines = len(arrayOLines)
#创建m行n列的零矩阵
returnMat = zeros((numberOfLines,3))
classLabelVector = []
index = 0
for line in arrayOLines:
line = line.strip()
#删除行前面的空格
listFromLine = line.split('\t')
#根据分隔符划分</