2.8 余弦相似度和余弦距离
余弦相似度
机器学习中有一个重要的概念,叫做余弦相似度(cosine similarity)。余弦相似度用向量夹角的余弦值度量样本数据的相似性。
用k(x, q)来表达x和q两个列向量的余弦相似度,定义为
上一节我们介绍过,如果两个向量方向相同,则夹角θ的余弦值cosθ=1。若两个向量方向完全相反,则夹角θ余弦值cosθ=−1。
因此,余弦相似度取值范围在区间[−1,+1]之间。此外,大家是否在余弦相似度中看到了相关性系数的影子?
余弦距离
下面再介绍余弦距离(cosine distance)。余弦距离定义基于余弦的相似度,用d(x, q)来表达x和q两个列向量的余弦距离,具体定义为
本章前文介绍的欧几里得距离,即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)的余弦距离,并结合样本标签分析结果。