加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

皮尔逊相关系数的浅显理解

(2016-11-29 14:05:26)
分类: it

1、皮尔逊相关系数又称为简单相关系数,英文名称:pearson correlation coefficient,它描述了两个定距变量间联系的紧密程度(线性关系)。皮尔逊相关系数用于度量两个变量之间的相关(线性相关),其值介于-1和1之间,1表示变量完全正相关,0表示无关,-1表示完全负相关。在自然科学领域中,该系数广泛用于度量两个变量之间的相关程度。

 

2、简单的相关系数的分类

0.8-1.0:极强相关

0.6-0.8:强相关

0.4-0.6:中等程度相关

0.2-0.4:弱相关

0.0-0.2:极弱相关或无相关

 

3、公式

皮尔逊相关系数的浅显理解

4、例子

例如,假设五个国家的国民生产总值分别是1、2、3、5、8(单位10亿美元),又假设这五个国家的贫困比例分别是11%、12%、13%、15%、18%。

创建2个向量

x<-c(1,2,3,5,8)

y<-c(0.11,0.12,0.13,0.15,0.18)

按照维基的例子,应计算出相关系数为1出来.我们看看如何一步一步计算出来的。

x的平均数是:3.8

y的平均数是0.138

所以,

sum((x-mean(x))*(y-mean(y)))=0.308

用大白话来写就是:

(1-3.8)*(0.11-0.138)=0.0784

(2-3.8)*(0.12-0.138)=0.0324

(3-3.8)*(0.13-0.138)=0.0064

(5-3.8)*(0.15-0.138)=0.0144

(8-3.8)*(0.18-0.138)=0.1764

0.0784+0.0324+0.0064+0.0144+0.1764=0.308

同理, 分号下面的,分别是:

sum((x-mean(x))^2)=30.8 sum((y-mean(y))^2)= 0.00308

用大白话来写,分别是:

(1-3.8)^2=7.84 #平方

(2-3.8)^2=3.24 #平方

(3-3.8)^2=0.64 #平方

(5-3.8)^2=1.44 #平方

(8-3.8)^2=17.64 #平方

7.84+3.24+0.64+1.44+17.64=30.8

同理,求得:

sum((y-mean(y))^2)= 0.00308

然后再开平方根,分别是:

30.8^0.5=5.549775 0.00308^0.5=0.05549775

用分子除以分母,就计算出最终结果:

0.308/(5.549775*0.05549775)=1

注:该例子来源于网站:https://segmentfault.com/q/1010000000094674

 

5、 皮尔逊相关的约束条件如下:
1)两个变量之间有线性关系

(2) 变量是连续变量

(3) 变量均符合正态分布,且二元分布也符合正态分布

(4) 两变量独立

在实践统计中一般只输出两个系数,一个是相关系数也就是计算出来的相关系数大小(在-1到1之间),另一个是独立样本检验系数,用来检验样本一致性

6、程序代码

from math import sqrt

#一个涉及影评者及其对几部影片评分情况的字典
critics={'Lisa Rose':{'Lady in the Water':2.5,'Snakes on a plane':3.5},'Gene Seymour':{'Lady in the Water':3.0,'The Night Listener':3.0}}

#返回用户p1和p2的皮尔逊相关系数
def sim_pearson(prefs,p1,p2):
? ? #得到双方都曾评价过的物品列表
? ? si = {}
? ? for item in prefs[p1]:
? ? ? ? if item in prefs[p2]:
? ? ? ? ? ? si[item] = 1
? ??
? ? #得到列表元素的个数
? ? n = len(si)
? ??
? ? #如果两者没有共同之处,则返回1
? ? if(n == 0):
? ? ? ? return 1
? ??
? ? #对所有偏好求和
? ? sum1 = sum([prefs[p1][it] for it in si])
? ? sum2 = sum([prefs[p2][it] for it in si])
? ??
? ? #求平方和
? ? sum1Sq = sum([pow(prefs[p1][it],2) for it in si])
? ? sum2Sq = sum([pow(prefs[p2][it],2) for it in si])
? ??
? ? #求乘积之和
? ? pSum = sum([prefs[p1][it] * prefs[p2][it] for it in si])
? ??
? ? # 计算皮尔逊相关系数
? ? num = pSum - (sum1*sum2/n)
? ? den = sqrt((sum1Sq - pow(sum1,2)/n) * (sum2Sq - pow(sum2,2)/n))
? ??
? ? if den == 0:
? ? ? ? return 0
? ??
? ? r = num/den
? ??
? ? return r

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有