协方差与相关系数np.cov()&np.corrcoef()

定义:协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值(相关)。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值(不相关)。

公式:根据贝赛尔修正,样本为/n-1,总体数据为/n

import random
def covariance(vect_1,vect_2):
    assert len(vect_1)==len(vect_2),'length not equal'
    vect_1_mean=sum(vect_1)/len(vect_1)
    vect_2_mean=sum(vect_2)/len(vect_2)
    sigma=0
    for i in range(len(vect_1)):
        sigma+=(vect_1[i]-vect_1_mean)*(vect_2[i]-vect_2_mean)
    return sigma/(len(vect_1)-1)

if __name__=='__main__':
    vect_1=[random.randint(0,10) for i in range(10) ]
    vect_2=[random.randint(0,10) for i in range(10)]
    print(covariance(vect_1,vect_2))

相关系数:

定义:协方差的相关系数,不仅表示线性相关的方向,还表示线性相关的程度,取值[-1,1]。也就是说,相关系数为正值,说明一个变量变大另一个变量也变大;取负值说明一个变量变大另一个变量变小,取0说明两个变量没有相关关系。同时,相关系数的绝对值越接近1,线性关系越显著。

公式:用vect_1、vect_2的协方差除以vect_1的标准差乘以vect_2的标准差。

import math
import random
import numpy as np
def covariance(vect_1,vect_2):
    assert len(vect_1)==len(vect_2),'length not equal'
    vect_1_mean=sum(vect_1)/len(vect_1)
    vect_2_mean=sum(vect_2)/len(vect_2)
    sigma=0
    for i in range(len(vect_1)):
        sigma+=(vect_1[i]-vect_1_mean)*(vect_2[i]-vect_2_mean)
    return sigma/len(vect_1)

def standard_deviation(vector):
    mean=sum(vector)/len(vector)
    sigma=0
    for i in vector:
        sigma+=(i-mean)**2
    variance_data=sigma /len(vector)
    sd=math.sqrt(variance_data)
    return sd
def correlation(cov,vect_1_sd,vect_2_sd):
    return cov/(vect_1_sd*vect_2_sd)
if __name__=='__main__':
    vect_1=[random.randint(0,5) for i in range(10) ]
    vect_2=[random.randint(0,5) for i in range(10)]
    cov=covariance(vect_1,vect_2)
    vect_1_sd=standard_deviation(vect_1)
    vect_2_sd=standard_deviation(vect_2)
    relation=correlation(cov,vect_1_sd,vect_2_sd)
    print(np.corrcoef(vect_1,vect_2))
    print(relation)

猜你喜欢

转载自blog.csdn.net/rookie_is_me/article/details/87894586
今日推荐