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

目录

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

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

[2.1 协方差公式和方差公式](#2.1 协方差公式和方差公式)

[2.2 协方差 公式 的相关说明](#2.2 协方差 公式 的相关说明)

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

[2.4 手动求2个数组的协方差的具体步骤](#2.4 手动求2个数组的协方差的具体步骤)

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

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

[2.7 手动求皮尔逊相关系数](#2.7 手动求皮尔逊相关系数)

[3 完整测试代码](#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)

相关推荐
訾博ZiBo1 分钟前
JSON路径工具类`JsonPathUtil`的实现与应用
开发语言·python·json
ToTensor2 分钟前
VLLM 格式化LLM输出
人工智能
学习前端的小z6 分钟前
【AI绘画】Midjourney进阶:色调详解(下)
人工智能·ai作画·aigc·midjourney
北国1376 分钟前
python端拉流检测后再推流到流媒体服务器实现前端拉流查看(多摄像头切换)
服务器·前端·python·opencv·流媒体服务器
『₣λ¥√≈üĐ』8 分钟前
如何写出好证明(支持思想的深入数学写作)
人工智能·学习·数学建模·矩阵·动态规划·概率论·抽象代数
qq_3521095215 分钟前
自动驾驶目标检测融合全貌
人工智能·目标检测·自动驾驶
ZOMI酱16 分钟前
【AI系统】动态图与静态图转换
人工智能
知来者逆22 分钟前
ChemBench—— 探索大语言模型在化学领域的新基准框架是否胜过化学专家
人工智能·语言模型·自然语言处理·llm·大语言模型·化学
烬奇小云32 分钟前
通过抓包,使用frida定位加密位置
android·python·安全
花生糖@34 分钟前
OpenCV截取指定图片区域
人工智能·opencv·计算机视觉