矩阵力量:线性代数全彩图解+微课+Python编程
上QQ阅读APP看书,第一时间看更新

2.8 余弦相似度和余弦距离

余弦相似度

机器学习中有一个重要的概念,叫做余弦相似度(cosine similarity)。余弦相似度用向量夹角的余弦值度量样本数据的相似性。

kx, q)来表达xq两个列向量的余弦相似度,定义为

上一节我们介绍过,如果两个向量方向相同,则夹角θ的余弦值cosθ=1。若两个向量方向完全相反,则夹角θ余弦值cosθ=−1。

因此,余弦相似度取值范围在区间[−1,+1]之间。此外,大家是否在余弦相似度中看到了相关性系数的影子?

余弦距离

下面再介绍余弦距离(cosine distance)。余弦距离定义基于余弦的相似度,用dx, q)来表达xq两个列向量的余弦距离,具体定义为

本章前文介绍的欧几里得距离,即L2范数,是一种最常见的距离度量。本节介绍的余弦距离也是一种常见的距离度量。L2范数的取值范围为[0,+∞),而余弦距离的取值范围为[0, 2]。

本书下一章,以及《统计至简》《机器学习》两册将逐步介绍常见距离度量,“距离”的内涵会不断丰富。

鸢尾花例子

图2.22所示给出鸢尾花四个样本数据。x(1)x(2)两个样本对应的鸢尾花都是setosa这一亚属。x(51)样本对应的鸢尾花为versicolor这一亚属;x(101)样本对应的鸢尾花为virginica这一亚属。

图2.22 鸢尾花的四个样本数据

计算x(1)x(2)两个向量余弦距离为

同理,可以计算得到x(1)x(51)x(1)x(101)两个余弦距离为

可以发现,x(1)x(2)两朵同属于setosa亚属的鸢尾花,余弦距离较近,也就是较为相似。

x(1)x(101)分别属于setota和virginica亚属,余弦距离较远,也就是不相似。

大家思考一下下面的问题,鸢尾花数据有150个数据点,任意两个数据点可以计算得到一个余弦相似度。因此成对余弦相似度有11175个,大家想想该怎么便捷计算、存储这些数据呢?

此外,大家可以试着先给数据去均值,如图2.23所示,将向量起点移动到原点,然后再计算余弦距离,并比较结果差异。和之前相比,去均值是否有利于区分不同类别鸢尾花呢?

图2.23 向量起点移到鸢尾花数据质心

Bk4_Ch2_10.py可以完成上述计算。感兴趣的读者可以修改代码计算x(51)x(101)的余弦距离,并结合样本标签分析结果。