使用K-近邻算法改进约会网站的配对效果
参考自:https://blog.csdn.net/c406495762/article/details/75172850
例子说明:
我的朋友海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的
人选,但她没有从中找到喜欢的人。经过一番总结,她发现曾交往过三种类型的人:
□ 不喜欢的人
□ 魅力一般的人
□ 极具魅力的人
尽管发现了上述规律,但海伦依然无法将约会网站推荐的匹配对象归人恰当的分类。她觉得可以在周一到周五约会那些魅力一般的人,而周末则更喜欢与那些极具魅力的人为伴。海伦希望让未来触手可及我们的分类软件可以更好地帮助她将匹配对象划分到确切的分类中。此外海伦还收集了一些约会网站未曾记录的数据信息,她认为这些数据更有助于匹配对象的归类。
练习内容
(1)收集数据:提供文本文件。
(2)_准备数据: 使用python解析文本文件。
(3)分析数据:使用matplotlib化画二维扩散图。
(4)训练算法:此步驟不适用于K近邻算法。
(5)测试算法:使用海伦提供的部分数据作为测试样本。测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误。
(6)使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否为自己喜欢的类型。
from matplotlib.font_manager import FontProperties
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
import numpy as np
import operator
'''
函数说明:kNN算法,分类器
Parameters:
inX - 用于分类的数据(测试集)
dataSet - 用于训练的数据(训练集)
labes - 分类标签
k - kNN算法参数,选择距离最小的k个点
Returns:
sortedClassCount[0][0] - 分类结果
'''
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0] #shape[0]返回dataset的行数
diffMat=np.tile(inX,(dataSetSize,1)) - dataSet
#在行向量上重复inX共dataSetSize次,列向量上重复一次inX
sqDiffMat=diffMat**2 #二维特征相减后平方
sqDistances=sqDiffMat.sum(axis=1) #sum(1),在同一行的所有元素相加
distances=sqDistances**0.5 #开方,计算距离
sortedDistIndices = distances.argsort() #返回distances中元素从小到大排序后的索引值
classCount={} #定义一个记录类别次数的字典
for i in range(k): #取出前K个元素的类别
voteIlabel = labels[sortedDistIndices[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
#dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
# key