皮尔逊相关系数的浅显理解
| 分类: 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
用大白话来写,分别是:
(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.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

加载中…