【小白学机器学习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)

相关推荐
skywalk81631 分钟前
体验智谱清言的AutoGLM进行自动化的操作(Chrome插件)
运维·人工智能·自动化·glm·autoglm
不辉放弃16 分钟前
零基础讲解pandas
开发语言·python
Chaos_Wang_23 分钟前
NLP高频面试题(三十)——LLama系列模型介绍,包括LLama LLama2和LLama3
人工智能·自然语言处理·llama
databook26 分钟前
线性判别分析(LDA):降维与分类的完美结合
python·机器学习·scikit-learn
慕丹27 分钟前
虫洞数观系列三 | 数据分析全链路实践:Pandas清洗统计 + Navicat可视化呈现
python·mysql·数据挖掘·数据分析·pandas
新智元28 分钟前
美国 CS 专业卷上天,满分学霸惨遭藤校全拒!父亲大受震撼引爆热议
人工智能·openai
新智元30 分钟前
美国奥数题撕碎 AI 数学神话,顶级模型现场翻车!最高得分 5%,DeepSeek 唯一逆袭
人工智能·openai
ZHW_AI课题组39 分钟前
调用阿里云API实现运营商实名认证
python·阿里云·云计算·api
Baihai_IDP41 分钟前
「DeepSeek-V3 技术解析」:无辅助损失函数的负载均衡
人工智能·llm·deepseek
闲人编程42 分钟前
图像插值算法(最近邻/双线性/立方卷积)
python·opencv·图像识别