协方差矩阵计算例子.docx

上传人:b****7 文档编号:9607133 上传时间:2023-02-05 格式:DOCX 页数:12 大小:20.43KB
下载 相关 举报
协方差矩阵计算例子.docx_第1页
第1页 / 共12页
协方差矩阵计算例子.docx_第2页
第2页 / 共12页
协方差矩阵计算例子.docx_第3页
第3页 / 共12页
协方差矩阵计算例子.docx_第4页
第4页 / 共12页
协方差矩阵计算例子.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

协方差矩阵计算例子.docx

《协方差矩阵计算例子.docx》由会员分享,可在线阅读,更多相关《协方差矩阵计算例子.docx(12页珍藏版)》请在冰豆网上搜索。

协方差矩阵计算例子.docx

协方差矩阵计算例子

协方差矩阵计算例子

【篇一:

协方差矩阵计算例子】

浅谈协方差矩阵今天看论文的时候又看到了协方差矩阵这个破东西,以前看模式分类的时候就特困扰,没想到现在还是搞不清楚,索性开始查协方差矩阵的资料,恶补之后决定马上记录下来,嘿嘿~本文我将用自认为循序渐进的方式谈谈协方差矩阵。

统计学的基本概念

学过概率统计的孩子都知道,统计里最基本的概念就是样本的均值,方差,或者再加个标准差。

首先我们给你一个含有n个样本的集合,依次给出这些概念的公式描述,这些高中学过数学的孩子都应该知道吧,一带而过。

均值:

标准差:

方差:

很显然,均值描述的是样本集合的中间点,它告诉我们的信息是很有限的,而标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。

以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前者是8.3,后者是1.8,显然后者较为集中,故其标准差小一些,标准差描述的就是这种“散布度”。

之所以除以n-1而不是除以n,是因为这样能使我们以较小的样本集更好的逼近总体的标准差,即统计上所谓的“无偏估计”。

而方差则仅仅是标准差的平方。

为什么需要协方差?

上面几个统计量看似已经描述的差不多了,但我们应该注意到,标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集,最简单的大家上学时免不了要统计多个学科的考试成绩。

面对这样的数据集,我们当然可以按照每一维独立的计算其方差,但是通常我们还想了解更多,比如,一个男孩子的猥琐程度跟他受女孩子欢迎程度是否存在一些联系啊,嘿嘿~协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:

来度量各个维度偏离其均值的程度,标准差可以这么来定义:

协方差的结果有什么意义呢?

如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),也就是说一个人越猥琐就越受女孩子欢迎,嘿嘿,那必须的~结果为负值就说明负相关的,越猥琐女孩子越讨厌,可能吗?

如果为0,也是就是统计上说的“相互独立”。

从协方差的定义上我们也可以看出一些显而易见的性质,如:

协方差多了就是协方差矩阵

上一节提到的猥琐和受欢迎的问题是典型二维问题,而协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算个协方差,那自然而然的我们会想到使用矩阵来组织这些数据。

给出协方差矩阵的定义:

这个定义还是很容易理解的,我们可以举一个简单的三维的例子,假设数据集有三个维度,则协方差矩阵为

可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。

matlab协方差实战

上面涉及的内容都比较容易,协方差矩阵似乎也很简单,但实战起来就很容易让人迷茫了。

必须要明确一点,协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。

这个我将结合下面的例子说明,以下的演示将使用matlab,为了说明计算原理,不直接调用matlab的cov函数(蓝色部分为matlab代码)。

首先,随机产生一个10*3维的整数矩阵作为样本集,10为样本的个数,3为样本的维数。

1mysample=fix(rand(10,3)*50)根据公式,计算协方差需要计算均值,那是按行计算均值还是按列呢,我一开始就老是困扰这个问题。

前面我们也特别强调了,协方差矩阵是计算不同维度间的协方差,要时刻牢记这一点。

样本矩阵的每行是一个样本,每列为一个维度,所以我们要按列计算均值。

为了描述方便,我们先将三个维度的数据分别赋值:

1dim1=mysample(:

1);2dim2=mysample(:

2);3dim3=mysample(:

3);计算dim1与dim2,dim1与dim3,dim2与dim3的协方差:

1sum((dim1-mean(dim1)).*(dim2-mean(dim2)))/(size(mysample,1)-1)%得到74.53332sum((dim1-mean(dim1)).*(dim3-mean(dim3)))/(size(mysample,1)-1)%得到-10.08893sum((dim2-mean(dim2)).*(dim3-mean(dim3)))/(size(mysample,1)-1)%得到-106.4000搞清楚了这个后面就容易多了,协方差矩阵的对角线就是各个维度上的方差,下面我们依次计算:

1std(dim1)^2%得到108.32222std(dim2)^2%得到260.62223std(dim3)^2%得到94.1778这样,我们就得到了计算协方差矩阵所需要的所有数据,调用matlab自带的cov函数进行验证:

1cov(mysample)把我们计算的数据对号入座,是不是一摸一样?

update:

今天突然发现,原来协方差矩阵还可以这样计算,先让样本矩阵中心化,即每一维度减去该维度的均值,使每一维度上的均值为0,然后直接用新的到的样本矩阵乘上它的转置,然后除以(n-1)即可。

其实这种方法也是由前面的公式通道而来,只不过理解起来不是很直观,但在抽象的公式推导时还是很常用的!

同样给出matlab代码实现:

1x=mysample-repmat(mean(mysample),10,1);%中心化样本矩阵,使各维度均值为02c=(x*x)./(size(x,1)-1);

【篇二:

协方差矩阵计算例子】

矩阵中的第个元素是与的协方差。

这个概念是对于的一般化推广。

二、理解的关键

1、理解的关键是两个随机变量x1,x2的协方差如何计算,有cov(x1,x2)=e{[(x1-e(x1)][x2-e(x2)]},对于离散的随机变量x1,x2,协方差矩阵描述的x1,x2相互联系的偏差,所以两个随机变量是一一对应的,即假设有m个样本值,则分别为(x11,x21),(x12,x22),(x13,x23),...(x1m,x2m),这便可以写成一个2*m的矩阵的形式。

则x1,x2协方差表示的是两个随机变量对应的样本值分别都减去各自均值后的乘积的均值(因为无偏性估计的缘故,除以的不是m而是m-1);

2、所以对于一个n*m的样本矩阵,得出的协方差矩阵c是n*n的矩阵,协方差矩阵每个元素cij表示的随机变量xi,xj的协方差。

所以协方差矩阵是一个对称矩阵,且对角线上元素为每个随机变量的方差(如果是信号的话可以看成是能量);如果各个变量相关性很小的话,互相的协方差接近0,即协方差矩阵基本上为对角阵;

3、可以证明,协方差矩阵是非负定矩阵,这可以有非负定矩阵的定义得到;

4、同样地,为了表示各个随机变量相关性到底有多大,可以引入相关性矩阵。

统计学的基本概念

学过概率统计的孩子都知道,统计里最基本的概念就是样本的均值,方差,或者再加个标准差。

首先我们给你一个含有n个样本的集合,依次给出这些概念的公式描述,这些高中学过数学的孩子都应该知道吧,一带而过。

均值:

标准差:

方差:

很显然,均值描述的是样本集合的中间点,它告诉我们的信息是很有限的,而标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。

以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前者是8.3,后者是1.8,显然后者较为集中,故其标准差小一些,标准差描述的就是这种“散布度”。

之所以除以n-1而不是除以n,是因为这样能使我们以较小的样本集更好的逼近总体的标准差,即统计上所谓的“无偏估计”。

而方差则仅仅是标准差的平方。

为什么需要协方差?

上面几个统计量看似已经描述的差不多了,但我们应该注意到,标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集,最简单的大家上学时免不了要统计多个学科的考试成绩。

面对这样的数据集,我们当然可以按照每一维独立的计算其方差,但是通常我们还想了解更多,比如,一个男孩子的猥琐程度跟他受女孩子欢迎程度是否存在一些联系啊,协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:

来度量各个维度偏离其均值的程度,标准差可以这么来定义:

协方差的结果有什么意义呢?

如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),也就是说一个人越猥琐就越受女孩子欢迎,那必须的~结果为负值就说明负相关的,越猥琐女孩子越讨厌,可能吗?

如果为0,也是就是统计上说的“相互独立”。

从协方差的定义上我们也可以看出一些显而易见的性质,如:

协方差多了就是协方差矩阵

上一节提到的猥琐和受欢迎的问题是典型二维问题,而协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算个协方差,那自然而然的我们会想到使用矩阵来组织这些数据。

给出协方差矩阵的定义:

这个定义还是很容易理解的,我们可以举一个简单的三维的例子,假设数据集有三个维度,则协方差矩阵为

可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。

matlab协方差实战

上面涉及的内容都比较容易,协方差矩阵似乎也很简单,但实战起来就很容易让人迷茫了。

必须要明确一点,协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。

这个我将结合下面的例子说明,以下的演示将使用matlab,为了说明计算原理,不直接调用matlab的cov函数(蓝色部分为matlab代码)。

首先,随机产生一个10*3维的整数矩阵作为样本集,10为样本的个数,3为样本的维数。

1mysample=fix(rand(10,3)*50)

根据公式,计算协方差需要计算均值,那是按行计算均值还是按列呢,我一开始就老是困扰这个问题。

前面我们也特别强调了,协方差矩阵是计算不同维度间的协方差,要时刻牢记这一点。

样本矩阵的每行是一个样本,每列为一个维度,所以我们要按列计算均值。

为了描述方便,我们先将三个维度的数据分别赋值:

dim1=mysample(:

1);dim2=mysample(:

2);dim3=mysample(:

3);

计算dim1与dim2,dim1与dim3,dim2与dim3的协方差:

1sum((dim1-mean(dim1)).*(dim2-mean(dim2)))/(size(mysample,1)-1)%(10行;(10-1))得到74.53332;sum((dim1-mean(dim1)).*(dim3-mean(dim3)))/(size(mysample,1)-1)%得到-10.08893;sum((dim2-mean(dim2)).*(dim3-mean(dim3)))/(size(mysample,1)-1)%得到-106.4000

搞清楚了这个后面就容易多了,协方差矩阵的对角线就是各个维度上的方差,下面我们依次计算:

1std(dim1)^2%得到108.3222;2std(dim2)^2%得到260.6222;3std(dim3)^2%得到94.1778

这样,我们就得到了计算协方差矩阵所需要的所有数据,调用matlab自带的cov函数进行验证:

1cov(mysample)

把我们计算的数据对号入座,是不是一摸一样?

update:

今天突然发现,原来协方差矩阵还可以这样计算,先让样本矩阵中心化,即每一维度减去该维度的均值,使每一维度上的均值为0,然后直接用新的到的样本矩阵乘上它的转置,然后除以(n-1)即可。

其实这种方法也是由前面的公式通道而来,只不过理解起来不是很直观,但在抽象的公式推导时还是很常用的!

同样给出matlab代码实现:

1x=mysample-repmat(mean(mysample),10,1);%中心化样本矩阵,使各维度均值为02c=(x*x)./(size(x,1)-1);%b=repmat(a,m,n)将矩阵a复制mn块,即把a作为b的元素,b由mn个a平铺而成。

b的维数是[size(a,1)*m,(size(a,2)*n]

a=[1,2;3,4]b=repmat(a,2,3)121234341212134343总结

理解协方差矩阵的关键就在于牢记它计算的是不同维度之间的协方差,而不是不同样本之间,拿到一个样本矩阵,我们最先要明确的就是一行是一个样本还是一个维度。

matlab:

1、均值

数学定义:

matlab函数:

mean

x=[1,2,3]

mean(x)=2

如果x是一个矩阵,则其均值是一个向量组。

mean(x,1)为列向量的均值,mean(x,2)为行向量的均

值。

x=[123

456]

mean(x,1)=[2.5,3.5,4.5]

mean(x,2)=[2

5]

若要求整个矩阵元素的均值,则为mean(mean(x))。

mean(mean(x))=3.5

也可使用mean2函数:

mean2(x)=3.5

median,求一组数据的中值,用法与mean相同。

x=[1,2,9]

mean(x)=4

median(x)=2

2、方差

数学定义:

均方差:

matlab函数:

var

要注意的是var函数所采用公式中,分母不是,而是。

这是因为var函数实际上求的并不是方差,

而是误差理论中“有限次测量数据的标准偏差的估计值”。

x=[1,2,3,4]

var(x)=1.6667

sum((x(1,:

)-mean(x)).^2)/length(x)=1.2500

sum((x(1,:

)-mean(x)).^2)/(length(x)-1)=1.6667

var没有求矩阵的方差功能,可使用std先求均方差,再平方得到方差。

std,均方差,std(x,0,1)求列向量方差,std(x,0,2)求行向量方差。

x=[12

34]

std(x,0,1)=1.41421.4142

std(x,0,2)=0.7071

0.7071

若要求整个矩阵所有元素的均方差,则要使用std2函数:

std2(x)=1.2910

4、协方差矩阵

a=[61.45,55.9,61.95,59,58.14,53.61,55.48,54.21,61.52,54.92];

b=[40.36,39.8,49.2,48,51.5,49.39,51.13,58.06,61,62.35];

c=[8.61,8.91,10.43,13.32,13.48,15.75,18.14,19.95,21.95,23.53];

d=[14.31,14.72,15.28,15.91,14.67,15,15.86,15.16,13.72,12.94];

e=[7.67,7.75,8.15,9.24,10.68,10.58,10.31,10,8.91,8.51];

q=[a,b,c,d,e];

w=cov(q)

w=

10.3710-4.7446-6.6023-0.1873-1.8881

-4.744659.150338.7606-3.07433.0982

-6.602338.760628.6966-2.01992.4166

-0.1873-3.0743-2.01990.84740.3936

-1.88813.09822.41660.39361.3412

例:

a=

-112

-231

403

fori=1:

size(a,2)%size(a,1)求矩阵的行数;size(a,2)求矩阵的列数,相当于length(a);size(a)同时求矩阵的行和列数

forj=1:

size(a,2)%a(1,:

)表示这个矩阵的第一行;a(:

1)表示这个矩阵的第一列

c(i,j)=sum((a(:

i)-mean(a(:

i))).*(a(:

j)-mean(a(:

j))))/(size(a,1)-1);

end

end

c=

10.3333-4.16673.0000

-4.16672.3333-1.5000

3.0000-1.50001.0000

c为求得的协方差矩阵,在matlab以矩阵a的每一列为变量,对应的每一行为样本。

这样在矩阵a中就有3个列变量分别为a(:

1),a(:

2),a(:

3)。

在协方差矩阵c中,每一个元素c(i,j)为对第i列与第j列的协方差,例如c(1,2)=-4.1667为第一列与第二列的协方差。

拿c(1,2)的求解过程来说

c(1,2)=sum((a(:

1)-mean(a(:

1))).*(a(:

2)-mean(a(:

2))))/(size(a,1)-1);

1.a(:

1)-mean(a(:

1)),第一列的元素减去该列的均值得到

-1.3333

-2.3333

3.6667

2,a(:

2)-mean(a(:

2)),第二列的元素减去该列的均值得到

-0.3333

1.6667

-1.3333

3,再将第一步与第二部的结果相乘

-1.3333-0.33330.4444

-2.3333.*1.6667=-3.88896667-1.3333-4.8889

4,再将结果求和/size(a,1)-1得-4.1667,该值即为c(1,2)的值。

再细看一下是不是与协方差公式:

cov(x,y)=e{[(x-e(x)][(y-e(y)]}过程基本一致呢,只是在第4步的时候matlab做了稍微的调整,自由度为n-1,减少了一行的样本值个数。

clearall;

a=[-1,1,2;-2,3,1;4,0,3]

b=cov(a)

fori=1:

size(a,2)%size(a,1)求矩阵的行数;size(a,2)求矩阵的列数

forj=1:

size(a,2)%a(1,:

)表示这个矩阵的第一行;a(:

1)表示这个矩阵的第一列

c(i,j)=sum((a(:

i)-mean(a(:

i))).*(a(:

j)-mean(a(:

j))))/(size(a,1)-1)

end

end

【篇三:

协方差矩阵计算例子】

协方差的定义

对于一般的分布,直接代入e(x)之类的就可以计算出来了,但真给你一个具体数值的分布,要计算协方差矩阵,根据这个公式来计算,还真不容易反应过来。

网上值得参考的资料也不多,这里用一个例子说明协方差矩阵是怎么计算出来的吧。

记住,x、y是一个列向量,它表示了每种情况下每个样本可能出现的数。

比如给定

则x表示x轴可能出现的数,y表示y轴可能出现的。

注意这里是关键,给定了4个样本,每个样本都是二维的,所以只可能有x和y两种维度。

所以

用中文来描述,就是:

协方差(i,j)=(第i列的所有元素-第i列的均值)*(第j列的所有元素-第j列的均值)

这里只有x,y两列,所以得到的协方差矩阵是2x2的矩阵,下面分别求出每一个元素:

所以,按照定义,给定的4个二维样本的协方差矩阵为:

用matlab计算这个例子

z=[1,2;3,6;4,2;5,2]

cov(z)

ans=

2.9167-0.3333

-0.33334.0000

可以看出,matlab计算协方差过程中还将元素统一缩小了3倍。

所以,协方差的matlab计算公式为:

协方差(i,j)=(第i列所有元素-第i列均值)*(第j列所有元素-第j列均值)/(样本数-1)

下面在给出一个4维3样本的实例,注意4维样本与符号x,y就没有关系了,x,y表示两维的,4维就直接套用计算公式,不用x,y那么具有迷惑性的表达了。

(3)与matlab计算验证

z=[1234;3412;2314]

cov(z)

ans=

1.00001.0000-1.0000-1.0000

1.00001.0000-1.0000-1.0000

-1.0000-1.00001.33330.6667

-1.0000-1.00000.66671.3333

可知该计算方法是正确的。

我们还可以看出,协方差矩阵都是方阵,它的维度与样本维度有关(相等)。

参考2中还给出了计算协方差矩阵的源代码,非常简洁易懂,在此感谢一下!

参考:

[1]

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1