这是我的代码,用pearson's r计算两个变量之间的相关性。
def correlation(x, y):
std_x = (x - x.mean()) / x.std(ddof=0)
std_y = (y - y.mean()) / y.std(ddof=0)
return (std_x * std_y).mean()
我的理解是,要做到这一点,就必须:
这就引出了我的问题,为什么使用下面这一行:
std_x = (x - x.mean()) / x.std(ddof=0)
而不是简单地:
r = (x.std(ddof=0)*y.std(ddof=0))/len(x)
发布于 2018-04-05 16:17:14
我想你对皮尔逊系数的公式搞糊涂了。假设你有两个随机变量X和Y,那么Pearson系数被定义为
r = Cov(X, Y)/(s_X*s_Y)
其中Cov(X, Y)
是X和Y之间的协方差,s_Y
和s_Y
是它们的标准差。
Cov(X, Y) = E[(X-E[X])*(Y - E[Y])]
其中E[Z]
设计随机变量Z
的期望值。
好的,现在我们有了公式,那么如何计算它。实际上,你不能,因为你不能访问真正的标准差和实际的期望值。相反,我们通常做的是计算样本相关系数,它基于这个公式,但是用估计者给出的值来代替实数。
公式中关于期望值的一个自然(最小方差无偏)估计,简单地说是均值(由np.mean
给出),同样,对标准差的正确估计是np.std
给出的经验标准差。
所以把所有的东西放在一起,这个公式就会变成
r = np.mean((x-np.mean(x))*(y-np.mean(y)))/(np.std(x)*np.std(y))
实际上这和
np.mean(X*Y)
X = (x-np.mean(x))/np.std(x)
和Y = (y-np.mean(y))/np.std(y)
https://stackoverflow.com/questions/49676630
复制相似问题