先看看二者定义,给定两个n维向量A,B:

A=(a1,a2,…,an)A = (a_1, a_2, \ldots ,a_n)A=(a1​,a2​,…,an​)
B=(b1,b2,…,bn)B = (b_1, b_2, \ldots ,b_n)B=(b1​,b2​,…,bn​)

  1. 余弦相似度:
    cos(θ)=A⋅B∥A∥⋅∥B∥=∑i=1nai×bi∑i=1nai2×∑i=1nbi2cos(\theta) = {A \cdot B \over \Vert A \Vert \cdot \Vert B \Vert } = \frac{ \sum_{i=1}^n a_i \times b_i }{ \sqrt {\sum_{i=1}^n a_i^2} \times \sqrt {\sum_{i=1}^n b_i^2}}cos(θ)=∥A∥⋅∥B∥A⋅B​=∑i=1n​ai2​​×∑i=1n​bi2​​∑i=1n​ai​×bi​​

  2. 皮尔逊相关系数:
    pearson_r=∑i=1n(ai−aˉ)×(bi−bˉ)∑i=1n(ai−aˉ)2×∑i=1n(bi−bˉ)2pearson\_r = \frac{ \sum_{i=1}^n (a_i - \bar a ) \times (b_i - \bar b) }{ \sqrt {\sum_{i=1}^n (a_i - \bar a )^2} \times \sqrt {\sum_{i=1}^n (b_i - \bar b)^2}}pearson_r=∑i=1n​(ai​−aˉ)2​×∑i=1n​(bi​−bˉ)2​∑i=1n​(ai​−aˉ)×(bi​−bˉ)​

其中:
aˉ=1n∑i=1nai,bˉ=1n∑i=1nbi\bar a = {1 \over n} \sum_{i=1}^n a_i, \bar b = {1 \over n} \sum_{i=1}^n b_iaˉ=n1​i=1∑n​ai​,bˉ=n1​i=1∑n​bi​

两式对比,可见皮尔逊相关系数的计算是先对向量每一分量减去分量均值,再求余弦相似度。这一操作称为中心化(将特征向量X根据 xˉ\bar xxˉ 移动)。

这么做有什么好处呢?比如小明和小刚爱看电影,他们都看过《夏洛特烦恼》、《羞羞的铁拳》和《西虹市首富》,两个人也都在豆瓣上给这几部电影打了分,分值如下表:

夏洛特烦恼 羞羞的铁拳 西虹市首富
小明 9.6 7.5 5.8
小刚 8.3 5.6 2.4

如果豆瓣的程序员小哥哥想评判小明和小刚的兴趣是否相似(以此来给他们推荐类似的电影或投放相同广告),先初始化两个特征向量:

import numpy as npa_scores = np.array([9.6, 7.5, 5.8])
b_scores = np.array([8.3, 5.6, 2.4])

试下余弦相似度:

from sklearn.metrics.pairwise import cosine_similaritycosine_similarity([a_scores], [b_scores])output:
array([[0.9760924]])

两个人的余弦相似度是0.9760924,还不错,再试试皮尔逊相关系数:

from scipy.stats import pearsonrpearsonr(a_scores, b_scores)[0]
output:
0.9940012359465

效果更好!

余弦相似度除了可以比较样本间相似度,也可用于判断特征的重要性,网上比较多的例子即是评判sklearn库的iris(鸢尾花)数据集特征,在此一起总结下。

加载数据集:

from scipy.stats import pearsonr
from sklearn.datasets import load_iris# 加载数据集
iris = load_iris()

看数据前10行,每行包含鸢尾花的4个特征(花萼、花瓣的长宽):

iris.data[:10]
output:
array([[5.1, 3.5, 1.4, 0.2],[4.9, 3. , 1.4, 0.2],[4.7, 3.2, 1.3, 0.2],[4.6, 3.1, 1.5, 0.2],[5. , 3.6, 1.4, 0.2],[5.4, 3.9, 1.7, 0.4],[4.6, 3.4, 1.4, 0.3],[5. , 3.4, 1.5, 0.2],[4.4, 2.9, 1.4, 0.2],[4.9, 3.1, 1.5, 0.1]])

看看label前10行,都是1个品种:

iris.target[:10]
output:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

每个样本有4维特征,通过计算各特征与label的皮尔逊相关系数,即可得到各特征的重要性,所以需要依次取出iris.data的每一列特征,怎么取呢?sklearn.datasets中的数据集已经帮我们处理好了。iris是sklearn.utils.Bunch类的实例,其中iris.data.T就是iris.data的转置,看看其前10行(由于样本过多,这里只显示10个):

iris.data.T[:, :10]
output:
array([[5.1, 4.9, 4.7, 4.6, 5. , 5.4, 4.6, 5. , 4.4, 4.9],[3.5, 3. , 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1],[1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5],[0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1]])

下面就可以计算特征重要性了:

from scipy.stats import pearsonrfor feature in iris.data.T:# 计算皮尔逊相关系数print(pearsonr(feature, iris.target)[0])output:
0.7825612318100814
-0.4194462002600275
0.9490425448523336
0.9564638238016173

不过要注意的是,皮尔逊相关系数只对线性相关有效,并不是所有衡量特征重要性都可以这么用,需要因地制宜。

皮尔逊相关系数和余弦相似度相关推荐

  1. 皮尔逊相关系数 余弦相似度

    两个向量 相似度计算 高中知识计算cos. n维同理 . 越接近1 越相似. 推荐系统中协同过滤 user-item矩阵中某个用户的向量评分假设 A(1,1,2,1,1,1,0,0,0) B(1,1, ...

  2. 相似度度量:欧氏距离与余弦相似度(Similarity Measurement Euclidean Distance Cosine Similarity)...

    在<机器学习---文本特征提取之词袋模型(Machine Learning Text Feature Extraction Bag of Words)>一文中,我们通过计算文本特征向量之间 ...

  3. 推荐系统入门学习(二)【余弦相似度|皮尔逊相关系数】

    搭建你的第一个推荐系统 初识推荐系统 最初的推荐系统,作用是过滤垃圾邮件.今日机器学习算法的发展,朴素贝叶斯.神经网络已然成为了过滤垃圾邮件的好手.但是在30年前,算法还没有如今使用得广泛的时候,&q ...

  4. 推荐算法-皮尔逊相关系数的相似度

    探索相似性度量 基于用的推荐程序的一个重要的部分是用户相似度(UserSimilarity)实现.基于用户的推荐非常依赖这个组件.如果对用户的相似性缺乏可靠有效的定义,这类推荐方法是没有意义的.这也适 ...

  5. 相似度计算(2)——皮尔逊相关系数

    皮尔逊相关系数 一.定义   皮尔逊相关系数( Pearson correlation coefficient,PC),又称皮尔逊积矩相关系数(Pearson product-moment corre ...

  6. Python基于修正余弦相似度的电影推荐引擎

    //2022.7.15更新,经评论区提醒,更正cosine函数相关描述. 数据集下载地址:MovieLens 最新数据集 数据集包含600 名用户对 9,000 部电影应用了 100,000 个评级和 ...

  7. 欧氏距离、余弦相似度、Jaccard相似度、皮尔逊的Python代码与实例

    首先是一段计算4个相似度的Python代码. 需要注意的是,进行归一化操作后,4个函数取值范围都是0-1,而且都是数值越大表示相似性越高,数值为1代表完全相似. import numpy as npd ...

  8. 英文关键词计算tf-idf 余弦相似度_TFIDF原理与实践

    TF-IDF原理 TF-IDF通常应用于文本关键词提取.要提取一个文章的关键词,一个容易想到的思路就是找到出现次数最多的几个词.这是因为如果某个词很重要,它应该在这篇文章中多次出现.于是,我们进行&q ...

  9. 从向量的角度理解皮尔逊相关系数

    高中数学学的向量中有一个重要的公式用于计算两个向量之间的夹角: 在笛卡尔坐标系中有向量 (x1,y1)和(x2,y2),他们间夹角的cos值等于 向量内积 除以 两个向量摸的乘积. 如果你仔细比较一下 ...

最新文章

  1. 阿里云中间件技术 促进互联网高速发展
  2. linux 进程管理 ppt,Linux内核结构与进程管理.ppt
  3. WordPress+Markdown+为知笔记,实现高质量笔记和博客
  4. ROS技术点滴 —— MoveIt!中的运动学插件
  5. oracle 插入一个语句,oracle如何通过1条语句插入多个值 oracle通过1条语句插入多个值方法...
  6. c++实现超声回波包络检测_超声波物位计的选用
  7. 某个元素的距离页面的左边距_如何提高办公写作效率?先设置好页面上的这4类数据,准没错...
  8. Star Schema完全参考手册学习笔记九
  9. WEB-INF目录结构
  10. open jdk 证书 问题
  11. [UWP]如何实现UWP平台最佳图片裁剪控件
  12. Android开发丶调用百度地图进行导航
  13. redis主从完整配置说明
  14. Gerry-自定义报表组件
  15. 企业微信批量添加好友
  16. 如何检测ip和端口是否连通
  17. 1287 - 【基础】高精度乘
  18. python 论文写作_论文编辑神器Sublime Text,让论文写作过程事半功倍
  19. linux shell 三元运算符,Bash中的三元运算符(?:)
  20. storm是java还是python_Storm与Spark、Hadoop相比是否有优势

热门文章

  1. 虚拟机 SSH常用的命令之一 查看目录
  2. 07-案例:销售图书
  3. 从一粒沙中看世界,一朵花里有天堂 08.11.2
  4. Hive sql删除分区
  5. JavaScript的if的分支语句
  6. 笔记|计算机数据表示实验(HUST)|偶校验编码设计
  7. 脑电信号处理与特征提取——1. 脑电、诱发电位和事件相关电位(胡理)
  8. 精细化学品化学习题与答案
  9. css深入浅出系列之:绝对定位 position:absolute
  10. 用ChatGPT和微信号做一个微信bot