从机器学习的门缝开始窥了那一眼
一.kNN–通用分类器
计算输入向量与训练样本的特征值的距离----欧式距离公式
两个特征值—二维两点间的距离
sqrt((Ax-Bx)^2 +(Ax-Bx) ^2)—sqrt开根号
4个特征值
比如:
(1,0,0,1),(7,6,9,4)
sqrt((7-1)^ 2+(6-0) ^ 2+(9-0)^ 2+(4-0)^2)
# classify:分类(器)
def classify0(inx, data_set, labels, k):
"""
kNN
:param inx: 用于分类的输入向量,待分类数据
:param data_set: 输入的训练样本集
:param labels: 标签向量,个数与训练样本集矩阵的行数相同
:param k: 用于选择最近邻的数目
:return:
"""
# shape:从外往内获取数组分别在一维,二维,三维....
# 的元素的个数(一维是最外层),返回值是一个元组,元素的元素个数
# 与待处理数据的维度一致
data_set_size = data_set.shape[0] # shape[0]返回数组在一维的元素个数
# tile:按digest参数,维度对照来平铺数组
# 维度对照的元组的元素值,即为对应维度平铺的倍数,同shape,分别为一维,二维,三维....
# 平铺待处理向量与训练样本集一致,并进行数组内元素的值对位相减----求差
diff_mat = tile(inx, (data_set_size, 1)) - data_set
# 数组内元素值平方----平方
sq_diff_mat = diff_mat ** 2
# 按行(横轴)合并数据-----求和
# axis:轴
sq_distances = sq_diff_mat.sum(axis=1)
# 各元素开根号---开根号
distances = sq_distances ** 0.5 # 获取到的特征值距离的序列
# argsort----升序排序:将数据升序排序,将数据的值替换成原数据所在数组中的索引值
# ,即原数据,升序排序后的数组在原数据中索引的映射序列
# [1.48660687 1.41421356 0. 0.1 ]
# [2 3 1 0]
sorted_dist_indicies = distances.argsort()
# 构造一个空的字典
class_count = {
}
for i in range(k):
# sorted_dist_indicies[i] 取出距离从小到大排序的第i+1个值在数据源中的索引
# 并取出其对应的标签(数据源的索引和标签一一对应)
vote_ilabel = labels[sorted_dist_indicies[i]]
# 如果标签存在则获取到标签你的value,并加一,若不存在,则将其value设为1
class_count[vote_ilabel] = class_count.get(vote_ilabel, 0) + 1
# operator.itemgetter(x)---定义一个函数,取到其作用到的对象身上的第x域的值,域==索引
# 关于排序的通用解法,参考cookbook,此处使用域来排序,是因为,字典转成元组之后,第0域的key都是不同的,无法直接使用key作为参照
# items---将对象转成元组列表
sorted_class_count = sorted(class_count.items(),
key=operator.itemgetter(1), reverse=True) # 排序再反转
# 去第一个元组的,第1个元素,即频率最高的标签
return sorted_class_count[0][0]
二.实例:使用k-近邻算法改进约会网站的配对效果
流程:
(1)收集数据:提供文本文件
(2)准备数据:使用Python解析文本数据
(3)分析数据:使用Matplotlib绘制二维扩散图
(4)训练算法:此步骤不适用于k-近邻算法
(5)测试算法:使用提供的部分数据作为测试数据
测试样本与非测试样本的区别在于,测试样本是已经分类的数据,如果预测分类与实际分类不同,则标记一个错误
(6)使用算法:产生简单的命令行程序,输入一些特征值以判断对方是否为喜欢的类型
def file2matrix(filename