Python计算余弦相似度与皮尔逊相关系数详解
本文详细介绍在Python中计算向量相似度的两种核心方法:夹角余弦与皮尔逊相关系数。通过具体代码示例,展示如何利用NumPy和SciPy库实现这两种算法,并深入解析它们在平移不变性、尺度不变性及方向相关性上的区别与适用场景。
余弦相似度原理与计算
夹角余弦(Cosine Similarity)
该指标也被称为余弦相似度。在几何学中,夹角余弦用于衡量两个向量方向的差异;在机器学习中,这一概念被引入以评估样本向量之间的相似程度。
在二维空间内,向量A(x1, y1)与向量B(x2, y2)的夹角余弦计算公式如下:
对于两个n维样本点a(x11, x12, …, x1n)和b(x21, x22, …, x2n),其夹角余弦的计算方式为:
同理,针对任意两个n维样本点a(x11, x12, …, x1n)和b(x21, x22, …, x2n),可采用上述夹角余弦概念来量化它们之间的相似程度。
具体公式表达为:
余弦值的取值范围介于[-1, 1]之间。通过计算两个向量的夹角并得出对应的余弦值,可以表征这两个向量的相似性。当夹角越小(趋近于0度)时,余弦值越接近1,表明两个向量的方向越一致,相似度越高。若两个向量方向完全相反,夹角余弦取最小值-1;当余弦值为0时,两向量正交,夹角为90度。由此可见,余弦相似度仅与向量的方向相关,而与向量的幅值大小无关。

import numpy as np
x=np.random.random(10)
y=np.random.random(10)
#方法一:根据公式求解
d1=np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))
#方法二:根据scipy库求解
from scipy.spatial.distance import pdist
X=np.vstack([x,y])
d2=1-pdist(X,'cosine')
当两个向量完全相等时,计算得到的余弦值为1。以下代码演示了如何计算得出d=1的情况:
d=1-pdist([x,x],'cosine')
皮尔逊相关系数与Python实现
皮尔逊相关系数(Pearson Correlation)
(1) 皮尔逊相关系数的定义
前文提到的余弦相似度仅反映向量方向,但会受到向量平移的影响。例如在夹角余弦公式中,若将向量x平移为x+1,余弦值会发生改变。为了实现平移不变性,需引入皮尔逊相关系数(Pearson Correlation),有时也直接称为相关系数。
若将夹角余弦公式改写为:

皮尔逊相关系数具备平移不变性和尺度不变性,能够计算出两个向量(或维度)之间的相关性。
在Python中的实现方式如下:
import numpy as np
x=np.random.random(10)
y=np.random.random(10)
#方法一:根据公式求解
x_=x-np.mean(x)
y_=y-np.mean(y)
d1=np.dot(x_,y_)/(np.linalg.norm(x_)*np.linalg.norm(y_))
#方法二:根据numpy库求解
X=np.vstack([x,y])
d2=np.corrcoef(X)[0][1]
相关系数是衡量随机变量X与Y相关程度的一种统计方法,其取值范围为[-1, 1]。相关系数的绝对值越大,表明X与Y的相关度越高。当X与Y存在线性相关关系时,相关系数取值为1(正线性相关)或-1(负线性相关)。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













