Python 余弦相似度与皮尔逊相关系数 计算实例


Posted in Python onDecember 23, 2019

夹角余弦(Cosine)

也可以叫余弦相似度。 几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。

(1)在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

(2) 两个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度。因此可以看出,余弦相似度与向量的幅值无关,只与向量的方向相关。

Python 余弦相似度与皮尔逊相关系数 计算实例

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')

皮尔逊相关系数(Pearson correlation)

(1) 皮尔逊相关系数的定义

前面提到的余弦相似度只与向量方向有关,但它会受到向量的平移影响,在夹角余弦公式中如果将 x 平移到 x+1, 余弦值就会改变。怎样才能实现平移不变性?这就要用到皮尔逊相关系数(Pearson correlation),有时候也直接叫相关系数。

如果将夹角余弦公式写成:

Python 余弦相似度与皮尔逊相关系数 计算实例

皮尔逊相关系数具有平移不变性和尺度不变性,计算出了两个向量(维度)的相关性。

在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(负线性相关)。

Python 相关文章推荐
Python的装饰器模式与面向切面编程详解
Jun 21 Python
python实现自动重启本程序的方法
Jul 09 Python
关于Python中Inf与Nan的判断问题详解
Feb 08 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
利用Python如何生成hash值示例详解
Dec 20 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
简单谈谈python基本数据类型
Sep 26 Python
基于pycharm导入模块显示不存在的解决方法
Oct 13 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
python flask几分钟实现web服务的例子
Jul 26 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
Oct 24 Python
Python使用进程Process模块管理资源
Mar 05 Python
Python编译成.so文件进行加密后调用的实现
Dec 23 #Python
Cython编译python为so 代码加密示例
Dec 23 #Python
Python编译为二进制so可执行文件实例
Dec 23 #Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 #Python
python 实现屏幕录制示例
Dec 23 #Python
关于ZeroMQ 三种模式python3实现方式
Dec 23 #Python
Python 内置函数globals()和locals()对比详解
Dec 23 #Python
You might like
PHP的FTP学习(一)[转自奥索]
2006/10/09 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
jQuery 使用手册(五)
2009/09/23 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
浅析Prototype的模板类 Template
2011/12/07 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
JSON为什么那样红为什么要用json(另有洞天)
2012/12/26 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
python for循环remove同一个list过程解析
2019/08/14 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
业务员岗位职责
2013/11/16 职场文书
物流仓储计划书
2014/01/10 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
mysql数据库隔离级别详解
2022/06/16 MySQL
Golang gRPC HTTP协议转换示例
2022/06/16 Golang