自学内容网 自学内容网

【小白学机器学习37】用numpy计算协方差cov(x,y) 和 皮尔逊相关系数 r(x,y)

目录

1 关于1个数组np.array(1组数据)如何求各种统计数据

2 关于2个数组np.array(2组数据)如何求数组的相关关系?

2.1 协方差公式和方差公式

2.2 协方差 公式 的相关说明

2.3 用np.cov(x,y,ddof=0) 直接求协方差矩阵

2.4  手动求2个数组的协方差的具体步骤

2.5 皮尔逊相关系数 (和有偏无偏没关系,分母约掉)

2.6 直接用公式求corr1=np.corrcoef(x,y) 皮尔逊相关系数矩阵

2.7 手动求皮尔逊相关系数

3 完整测试代码


用python处理协方差 和 皮尔逊相关系数

1 1个数组np.array(1组数据)如何求各种统计数据?

  • 如果
  • np.mean(array)
  • np.var(array,ddof=1) 
  • np.std(array,ddof=1)

均值

  • mean=u = Σ(x1+x2+.....+xn)/n
  • E=mean

方差

  • var= Σ(x1-u)^2 / n
  • var= Σ(x1-u)^2 / (n-1)

标准差

  • std=sqrt(var)

# 求1组数据的各种统计值
list1=[1,2,3,4,5,6,7,8,9,10]
array1=np.array(list1)

mu1=np.mean(array1)
var1=np.var(array1)                 #默认缺省 ddof=0,方差有偏估计
var11=np.var(array1,ddof=1)    #ddof 无偏估计
std1=np.std(array1)
std11=np.std(array1,ddof=1)

2 关于2个数组np.array(2组数据)如何求数组的相关关系?

2组数据/2个数组,可以检查是否有相关关系

  • 协方差
  • 相关系数

2.1 协方差公式和方差公式

方差公式

  • var(x) =var(x,x)  = Σ(x1-u)^2 / n
  • var(x) =var(x,x)  = Σ(x1-u)^2 / (n-1)

协方差公式

  • cov(x,y) = (x1i-u1)*(x2i-u2) / n
  • cov(x,y) = (x1i-u1)*(x2i-u2) / (n-1)

2.2 协方差 公式 的相关说明

  • 协方差的范围可以为,正数,负数
  • 如果是正数,表示正相关
  • 如果是负数,表示负相关
  • 如果=0等,表示不相关
  • 图形上看就不相关

2.3 用np.cov(x,y,ddof=0) 直接求协方差矩阵

  • 协方差矩阵
  • 包含了,cov(x,y) 和 δx^2 和 δy^2
  • 直接求法  cov1=np.cov(x,y,ddof=0)
  • 直接求法  cov1=np.cov(x,y,ddof=1)  #无偏

import numpy as np
import pandas as pd
import scipy as sp
%precision 3

# 求1组数据的各种统计值
list1=[1,2,3,4,5,6,7,8,9,10]
array1=np.array(list1)

mu1=np.mean(array1)
var1=np.var(array1)            #默认缺省 ddof=0,方差有偏估计
var11=np.var(array1,ddof=1)    #ddof 无偏估计
std1=np.std(array1)
std11=np.std(array1,ddof=1)

print("mu1%d=" %555)  #%d %s 只适合数字,字符串,不适合变量,变量当参数会报错
print("mu1=" ,mu1)    #比较山寨,但是可以
print("var1={0}".format(var1))   #适合变量带入,不灵活,不能用参数名需要标数字对应
print("var11={0}".format(var11)) 
print(f"std1={std1}")   #适合变量带入,带入的是参数名,灵活
print(f"std11={std11}") 
print()

# 求2组数据的各种统计值,也就是2组数据之间的关系---相关关系
list2=[2,6,7,5,7,8]
list3=[10,12,14,20,24,28]
array2=np.array(list2)
array3=np.array(list3)

#pd.DataFrame 注意驼峰命名法,2个首字母都要大写
dataframe1=pd.DataFrame({"x":array2,"y":array3})
print(dataframe1)
print()

x=dataframe1["x"]
y=dataframe1["y"]

cov1=np.cov(x,y,ddof=0)
print(cov1)
print()

cov2=np.cov(x,y,ddof=1)
print(cov2)
print()

corr1=np.corrcoef(x,y)
print(corr1)
print()

2.4  手动求2个数组的协方差的具体步骤

  • 先求2个数组分别的均值,
  • 数组-均值 =新的数组
  • 新数组*新数组=新数组
  • Σ新数据=协方差cov(x,y)
  • cov11=sum((array2-u2)*(array3-u3))/N

  • #错误写法,需求将差的乘积求和Σ
  • cov11=(array2-u2)*sum(array3-u3)/N    
  •  #错误写法,是差的乘积求和Σ,不是分别的和的 乘积!
  • #cov11=sum(array2-u2)*sum(array3-u3)/N  
# 手动求协方差
u2=np.mean(array2)
len2=len(array2)

u3=np.mean(array3)
len3=len(array3)

N=len(dataframe1)

if(len2==len3 and len3==N):
    print("二维数组的长度就是其中任何一个xi的长度")

#cov11=(array2-u2)*sum(array3-u3)/N       #错误写法,需求将差的乘积求和Σ
#cov11=sum(array2-u2)*sum(array3-u3)/N    #错误写法,是差的乘积求和Σ,不是分别的和的乘积!
cov11=sum((array2-u2)*(array3-u3))/N

print(cov11)

2.5 皮尔逊相关系数 (和有偏无偏没关系,分母约掉)

  • 协方差和  /n  /(n-1)  没有关系,因为分子,分母都包含除掉了
  • 所以,相关系数,不需要ddof=0/1
  • 协方差的范围 [-1,1] 之间

2.6 直接用公式求corr1=np.corrcoef(x,y) 皮尔逊相关系数矩阵

  • 相关系数矩阵
  • 包含了,1 和相关系数  Rxy
  • 直接求法 corr1=np.corrcoef(x,y)

2.7 手动求皮尔逊相关系数

  • 公式方法
  • 分子,相关系数
  • 分母,开根号(里面是  x1的方差   *  x2的方差)
  • 或者说,分母是开根号(里面是 x1的标准差std^2*  x2的标准差std^2)

# 手动求协方差
u2=np.mean(array2)
len2=len(array2)

u3=np.mean(array3)
len3=len(array3)

N=len(dataframe1)

if(len2==len3 and len3==N):
    print("二维数组的长度就是其中任何一个xi的长度")

#cov11=(array2-u2)*sum(array3-u3)/N       #错误写法,需求将差的乘积求和Σ
#cov11=sum(array2-u2)*sum(array3-u3)/N    #错误写法,是差的乘积求和Σ,不是分别的和的乘积!
cov11=sum((array2-u2)*(array3-u3))/N

print(cov11)
print()

# 手动求相关系数r(x,y)
var2=np.var(array2)
var3=np.var(array3)

corr11=cov11/np.sqrt(var2*var3)
print(corr11)
print()

3 完整测试代码

import numpy as np
import pandas as pd
import scipy as sp
%precision 3

# 求1组数据的各种统计值
list1=[1,2,3,4,5,6,7,8,9,10]
array1=np.array(list1)

mu1=np.mean(array1)
var1=np.var(array1)            #默认缺省 ddof=0,方差有偏估计
var11=np.var(array1,ddof=1)    #ddof 无偏估计
std1=np.std(array1)
std11=np.std(array1,ddof=1)

print("mu1%d=" %555)  #%d %s 只适合数字,字符串,不适合变量,变量当参数会报错
print("mu1=" ,mu1)    #比较山寨,但是可以
print("var1={0}".format(var1))   #适合变量带入,不灵活,不能用参数名需要标数字对应
print("var11={0}".format(var11)) 
print(f"std1={std1}")   #适合变量带入,带入的是参数名,灵活
print(f"std11={std11}") 
print()

# 求2组数据的各种统计值,也就是2组数据之间的关系---相关关系
list2=[2,6,7,5,7,8]
list3=[10,12,14,20,24,28]
array2=np.array(list2)
array3=np.array(list3)

#pd.DataFrame 注意驼峰命名法,2个首字母都要大写
dataframe1=pd.DataFrame({"x":array2,"y":array3})
print(dataframe1)
print()

x=dataframe1["x"]
y=dataframe1["y"]

cov1=np.cov(x,y,ddof=0)
print(cov1)
print()

cov2=np.cov(x,y,ddof=1)
print(cov2)
print()

corr1=np.corrcoef(x,y)
print(corr1)
print()

# 手动求协方差
u2=np.mean(array2)
len2=len(array2)

u3=np.mean(array3)
len3=len(array3)

N=len(dataframe1)

if(len2==len3 and len3==N):
    print("二维数组的长度就是其中任何一个xi的长度")

#cov11=(array2-u2)*sum(array3-u3)/N       #错误写法,需求将差的乘积求和Σ
#cov11=sum(array2-u2)*sum(array3-u3)/N    #错误写法,是差的乘积求和Σ,不是分别的和的乘积!
cov11=sum((array2-u2)*(array3-u3))/N

print(cov11)
print()

# 手动求相关系数r(x,y)
var2=np.var(array2)
var3=np.var(array3)

corr11=cov11/np.sqrt(var2*var3)
print(corr11)
print()

4  可用markdown写各种草稿公式

$$\sqrt(x^2)$$

$$
\begin{bmatrix}
a & b \\
c & d \\
\end{bmatrix}
$$

$$
cov(x,y) = (x1i-u1)*(x2i-u2) / n
$$

#使用markdown
#使用latex


$$cov(x,y)=
\begin{bmatrix}
δx^2,cov(x,y) \\
 cov(x,y),δy^2
 \end{bmatrix}
 $$
 
 $$r(x,y)=
\begin{bmatrix}
1,r(x,y) \\
 r(x,y),1
 \end{bmatrix}
 $$


 $$r(x,y)=cov(x,y)/\sqrt(δx1^2*δx2^2)$$


原文地址:https://blog.csdn.net/xuemanqianshan/article/details/144081178

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!