KNN算法上一篇已经进行过介绍,现在主要进行实际操作,通过对实际数据进行分析,来对没有见过面的美女帅哥进行要不要进行约会作出判断。
以下有一系列采集整理好的数据,第一列表示每年乘坐飞机飞行的里程数(高富帅,白富美比较偏向坐飞机,我们这种屌丝就坐坐火车啦),第二列表示每年吃冰淇淋的公升数,第三列表示玩游戏时间占的百分比(喜欢玩游戏的注意了哈,小心找不到白富美),第四列主要表示要不要约会的程度,数值越大,诱惑力越大。
此次参考《Mechine Learning in Action》这本书,本次实验的数据可以从链接:http://pan.baidu.com/s/1hr9M4Wc 密码:3g3z进行下载。
思路:
1.先读取已经准备好的数据。
2.对已经读取的数据进行转换,前三列组成一个矩阵A,后一列单独组成一个标签列表。
3.对待测数据进行操作,生成一个与矩阵A维度一致的矩阵B。
4.计算矩阵B减去矩阵A之后的差值,然后进行计算,计算出他们之间的距离(待测数据点与原来所有数据点之间的距离)。
5.对距离进行从小到大的排序。
6.取排序后的前n个数值。
7.对前n个数值对应的标签进行统计,谁的占有比重大,就选取为实验的最终结果。
Python实现:
from numpy import * import operator data = open("datingTestSet2.txt") lines = data.readlines() size = lines.__len__() print "Size : ", size dataMat = zeros((size,3)) classLabelVector = [] index = 0 for line in lines : line = line.strip() listFromLine = line.split("\t") dataMat[index, :] = listFromLine[0:3] classLabelVector.append(int(listFromLine[-1])) index += 1 print classLabelVector print dataMat test = [40920, 8.326976, 0.953952] testMat = tile(test, (size,1)) distancesMat = testMat - dataMat sqDifffMat = distancesMat**2 sqDistances = sqDifffMat.sum(axis=1) distances = sqDistances**0.5 sortedNum = distances.argsort() result = {} for i in range(10): result[classLabelVector[sortedNum[i]]] = result.get(classLabelVector[sortedNum[i]], 0) + 1 sortedResult = sorted(result.iteritems(), key=operator.itemgetter(1), reverse=True) print sortedResult if sortedResult[0][0] == 3: print "Certainly go" elif sortedResult[0][0] == 2: print "Casual" else : print "Don't go"