【小白学机器学习37】用numpy计算协方差cov(x,y) 和 皮尔逊相关系数 r(x,y)
目录
1 关于1个数组np.array(1组数据)如何求各种统计数据
2 关于2个数组np.array(2组数据)如何求数组的相关关系?
2.3 用np.cov(x,y,ddof=0) 直接求协方差矩阵
2.6 直接用公式求corr1=np.corrcoef(x,y) 皮尔逊相关系数矩阵
用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)!