编译最近的协同过滤算法皮尔逊相似度计算。下顺便研究R简单使用的语言。概率统计知识。
一、概率论和统计学概念复习

1)期望值(Expected Value)
由于这里每一个数都是等概率的。所以就当做是数组或向量中全部元素的平均数吧。能够使用R语言中函数mean()。
2)方差(Variance)
方差分为population variance整体方差和sample variance样本方差,差别是整体方差除以N,样本方差除以N-1。

数理统计中经常使用样本方差,R语言的var()函数计算的也是样本方差。

详细原因是样本方差是无偏的(Unbiased),想刨根问底能够Google一下。

3)标准差(Standard Variance)
非常easy。标准差就是方差的平方根。

R语言中函数为sd()。

4)协方差(Covariance)
也分成整体协方差和样本协方差,差别同上。

R语言中函数为cov()。注意向量中有空元素(NA)时,比如稀疏矩阵中的一行,则要cov(x,y, use='complete')。

方差也能够看做是协方差的特例。也就是:var(x)=cov(x,x)。
这里仅仅列举了计算公式。看着有些头晕,详细还是看以下样例吧。一看就懂了。
二、类似度计算在协同过滤推荐算法中的地位

在协同过滤推荐算法中,无论是基于用户(User-based)还是基于物品(Item-based),都要通过计算用户或物品间的类似度,得到离线模型(训练学习过程)。
之后再利用排序和加权算法得到终于的推荐物品Top-N列表。

不同类似度算法的选择对终于推荐结果会产生非常大的影响。

1)余弦类似度(Cosine-based Similiarity)
2)相关性类似度(Correlation-based Similiarity)
这样的类似度计算使用的算法就是皮尔森。
3)修正余弦类似度(Adjusted Cosine-based Similiarity)
三、R语言入门简单介绍

Windows下的R语言安装包地址为:http://cran.r-project.org/bin/windows/base/
下载exe后直接安装后,执行交互控制台就能够使用了。

经常使用的函数都能够从网上中查找到:http://jiaoyan.org/r/?page_id=4100
要习惯的一点是。R语言的表达方式,比如在控制台输入:
> x<-c(1:10)
> x-mean(x)
[1] -4.5 -3.5 -2.5 -1.5 -0.5  0.5  1.5  2.5  3.5  4.5
x-mean(x)的含义是都向量x中每一个元素都减去x的平均数mean(x),能够说这样的表达方式高度抽象化。表现力非常强。

之后我们能够用其它函数对计算结果进行聚合:
> sum(x-mean(x))
[1] 0
四、皮尔森类似度(Pearson Similiarity)计算举例

以下以还有一篇文章中的用户-物品关系为例,说明一下皮尔森类似度的计算过程。

皮尔森类似度的原始计算公式为: 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGNfNzI2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />,不继续展开化简。

1)定义用户数组(向量)
user1<-c(5.0, 3.0, 2.5)
user5<-c(4.0, 3.0, 2.0)
2)计算方差
var(user1)=sum((user1-mean(user1))^2)/(3-1)=1.75
var(user2)=sum((user5-mean(user5))^2)/(3-1)=1
3)计算标准差
sd(user1)=sqrt(var(user1))=1.322876
sd(user5)=sqrt(var(user5))=1
4)计算协方差
cov(user1, user5)
=sum((user1-mean(user1))*(user5-mean(user5)))/(3-1)
=1.25
5)计算类似度
cor(user1, user5)
=cov(user1, user5) / (sd(user1)*(sd(user5)))
=0.9449112
五、数学特性和存在问题

以下1)和2)整理自维基百科:
1)代数特性
皮尔逊相关系数的变化范围为-1到1。 系数的值为1意味着X 和 Y能够非常好的由直线方程来描写叙述。全部的数据点都非常好的落在一条 直线上,且 Y 随着 X 的添加而添加。

系数的值为−1意味着全部的数据点都落在直线上,且 Y 随着 X 的添加而降低。

系数的值为0意味着两个变量之间没有线性关系。

因两个变量的位置和尺度的变化并不会引起该系数的改变。即它该变化的不变量 (由符号确定)。

也就是说,我们假设把X移动到a + bX和把Y移动到c + dY,当中a、b、c和d是常数。

并不会改变两个变量的相关系数(该结论在整体和样本皮尔逊相关系数中都成立)。我们发现更一般的线性变换则会改变相关系数。

2)几何学含义
对于没有中心化的数据, 相关系数与两条可能的回归线y=gx(x) 和 x=gy(y) 夹角的余弦值一致。

对于中心化过的数据 (也就是说, 数据移动一个样本平均值以使其均值为0), 相关系数也能够被视作由两个随机变量 向量 夹角theta 的余弦值(见下方)。

3)存在问题
这也就是为什么会导致User1和User4更为类似的原因了,虽然User4仅仅对Item101和103评分,可是这两个评分形成的直线与User1形成的直线趋势更为接近。

同一时候还有一个问题是,假设一些几何变换不会影响相关系数,则评分的高低也被忽略掉了,仅仅是分数的趋潜在影响。当然,这是对于矩阵0和1用户-购买的物品矩阵没有效果。

版权声明:本文博主原创文章。博客,未经同意不得转载。

皮尔逊相似度计算的例子(R语言)的更多相关文章

  1. np.corrcoef()方法计算数据皮尔逊积矩相关系数(Pearson's r)

    上一篇通过公式自己写了一个计算两组数据的皮尔逊积矩相关系数(Pearson's r)的方法,但np已经提供了一个用于计算皮尔逊积矩相关系数(Pearson's r)的方法 np.corrcoef()  ...

  2. pandas通过皮尔逊积矩线性相关系数(Pearson's r)计算数据相关性

    皮尔逊积矩线性相关系数(Pearson's r)用于计算两组数组之间是否有线性关联,举个例子: a = pd.Series([1,2,3,4,5,6,7,8,9,10]) b = pd.Series( ...

  3. Pearson(皮尔逊)相关系数及MATLAB实现

    转自:http://blog.csdn.net/wsywl/article/details/5727327 由于使用的统计相关系数比较频繁,所以这里就利用几篇文章简单介绍一下这些系数. 相关系数:考察 ...

  4. Pearson(皮尔逊)相关系数

    Pearson(皮尔逊)相关系数:也叫pearson积差相关系数.衡量两个连续变量之间的线性相关程度. 当两个变量都是正态连续变量,而且两者之间呈线性关系时,表现这两个变量之间相关程度用积差相关系数, ...

  5. 皮尔逊(Pearson)系数矩阵——numpy

    一.原理 注意 专有名词.(例如:极高相关) 二.代码 import numpy as np f = open('../file/Pearson.csv', encoding='utf-8') dat ...

  6. Spark Mllib里的如何对两组数据用皮尔逊计算相关系数

    不多说,直接上干货! import org.apache.spark.mllib.stat.Statistics 具体,见 Spark Mllib机器学习实战的第4章 Mllib基本数据类型和Mlli ...

  7. Python基于皮尔逊系数实现股票预测

    # -*- coding: utf-8 -*- """ Created on Mon Dec 2 14:49:59 2018 @author: zhen "&q ...

  8. 从欧几里得距离、向量、皮尔逊系数到http://guessthecorrelation.com/

    一.欧几里得距离就是向量的距离公式 二.皮尔逊相关系数反应的就是线性相关 游戏http://guessthecorrelation.com/ 的秘诀也就是判断一组点的拟合线的斜率y/x ------- ...

  9. 皮尔逊残差 | Pearson residual

    参考:Pearson Residuals 这些概念到底是写什么?怎么产生的? 统计学功力太弱了!

随机推荐

  1. hdu 4291 A Short problem(矩阵+取模循环节)

    A Short problem                                                          Time Limit: 2000/1000 MS (J ...

  2. 在 Java 项目中解压7Zip特殊压缩算法文件

    1 问题描写叙述 Java Web 后端下载了一个经特殊算法压缩的 zip 文件,由于不能採用 java 本身自带的解压方式,必须採用 7Zip 来解压.所以,提到了本文中在 java web 后端调 ...

  3. 动态拼接lambda表达式树

    前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...

  4. SendMessage发送自定义消息及消息响应

    控件向父窗体发送自定义消息,父窗体定义处理此消息的函数   效果描述: 指定哪个类添加自定义消息:(当然这个类必须是CmdTarget的子类,不然不能处理消息) 添加消息 实现消息函数:(wParam ...

  5. This application failed to start because it could not find or load the Qt platform plugin &quot;xcb&quot;.

    linux根据系统Qt5未安装编译的程序Qt在该系统下进行下面的错误会报: This application failed to start because it could not find or ...

  6. POJ 1184 聪明的打字员

    简直难到没朋友. 双向bfs + 剪枝. 剪枝策略: 对于2--5位置上的数,仅仅有当光标在相应位置时通过swap ,up.down来改变.那么当当前位置没有达到目标状态时,left和right无意义 ...

  7. 逆向 Framework.jar

    Ref:http://www.addictivetips.com/mobile/what-is-odex-and-deodex-in-android-complete-guide/ Ref:http: ...

  8. 如何在WindowsPhone Bing Map控件中显示必应中国中文地图、谷歌中国中文地图。

    原文:如何在WindowsPhone Bing Map控件中显示必应中国中文地图.谷歌中国中文地图. 最近正好有点业余时间,所以在做做各种地图.Bing Map控件本身就能显示必应地图,但是很遗憾微软 ...

  9. 深入了解HTTP协议、HTTP协议原则

    ttp协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写. 它的发展是万维网协会(World Wide Web C ...

  10. SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF

    原文:SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF 本来用 Writer 写一篇关于一列多行合并的博客来的,结果快写完了时候,在一个插入代码时候,崩了,重新打开,居然 ...