协方差矩阵的定义及其计算公式 (转)

协方差矩阵的定义及其计算公式 (转)协方差矩阵的定义及其计算公式 nbsp 2014 03 2018 36 56 转载 nbsp 分类 nbsp matlab 协方差矩阵在机器学习中经常用到 查看 wiki http zh wikipedia org wiki 协方差矩阵 nbsp 可知协方差矩阵的具体计算公式如下 在统计学与概率论中 协方差矩阵是一个矩阵 其每个元素是各个向量元素

协方差矩阵的定义及其计算公式

 
协方差矩阵的定义及其计算公式 (转)
(2014-03-20 18:36:56)

  分类: matlab

协方差矩阵在机器学习中经常用到,查看wiki:http://zh.wikipedia.org/wiki/协方差矩阵 可知协方差矩阵的具体计算公式如下:

统计学概率论中,协方差矩阵是一个矩阵,其每个元素是各个向量元素之间的协方差。这是从标量随机变量到高维度随机向量的自然推广。

假设X是以n个标量随机变量组成的列向量,

X = \begin{bmatrix}X_1 \\ \vdots \\ X_n \end{bmatrix}

并且\mu_i是其第i个元素的期望值,即, \mu_i = \mathrm{E}(X_i)。协方差矩阵被定义的第i,j项是如下:

\Sigma_{ij} = \mathrm{cov}(X_i, X_j) = \mathrm{E}\begin{bmatrix} (X_i - \mu_i)(X_j - \mu_j) \end{bmatrix}

即:

\Sigma=\mathrm{E} \left[ \left( \textbf{X} - \mathrm{E}[\textbf{X}] \right) \left( \textbf{X} - \mathrm{E}[\textbf{X}] \right)^\top \right]
= \begin{bmatrix} \mathrm{E}[(X_1 - \mu_1)(X_1 - \mu_1)] & \mathrm{E}[(X_1 - \mu_1)(X_2 - \mu_2)] & \cdots & \mathrm{E}[(X_1 - \mu_1)(X_n - \mu_n)] \\ \ \mathrm{E}[(X_2 - \mu_2)(X_1 - \mu_1)] & \mathrm{E}[(X_2 - \mu_2)(X_2 - \mu_2)] & \cdots & \mathrm{E}[(X_2 - \mu_2)(X_n - \mu_n)] \\ \ \vdots & \vdots & \ddots & \vdots \\ \ \mathrm{E}[(X_n - \mu_n)(X_1 - \mu_1)] & \mathrm{E}[(X_n - \mu_n)(X_2 - \mu_2)] & \cdots & \mathrm{E}[(X_n - \mu_n)(X_n - \mu_n)] \end{bmatrix}

矩阵中的第(i,j)个元素是X_iX_j的协方差。这个概念是对于标量随机变量方差的一般化推广。

 

二、理解的关键

  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 复制 m×n 块,即把 A 作为 B 的元素,B 由 m×n 个 A 平铺而成。B 的维数是 [size(A,1)*m, (size(A,2)*n]

>> A = [1,2;3,4]
A =
1 2
3 4
>> B = repmat(A,2,3)
B =
1 2 
1 2 
1 2
3 4 
3 4 
3 4
1 2 
1 2 1 2
3 4 
3 4 3 4
 

总结

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

matlab:

-1.8881 3.0982 2.4166 0.3936 1.3412

例:

=
    
1     1     2
    
2     3     1
     
4     0     3



for i=1:size(a,2%size(a,1)求矩阵的行数;size(a,2)求矩阵的列数,相当于length(a);size(a)同时求矩阵的行和列数
    
for j=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.1667    3.0000

-4.1667    2.3333   -1.5000

3.0000   -1.5000    1.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);

1a(:,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.3333          0.4444

-2.3333  .*     1.6667  =        -3.8889

3.6667          -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,减少了一行的样本值个数。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226693.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:20
下一篇 2026年3月16日 下午10:20


相关推荐

  • pycharm最新版本激活码activation code

    pycharm最新版本激活码activation code2RRJMBXW33 eyJsaWNlbnNl

    2026年3月27日
    6
  • 全面理解.htaccess语法中RewriteCond和RewriteRule意义

    全面理解.htaccess语法中RewriteCond和RewriteRule意义全面理解.htaccess语法中RewriteCond和RewriteRule意义.htaccess配置文件可以通过RewriteCond和RewriteRule实现伪静态。RewriteCond的语法//含义:当什么东西匹配某种模式,则..RewriteCondTestStringCondPattern[Flags]RewriteCond%{HTTP_H…

    2022年5月14日
    53
  • mongodb和MySQL 区别_MongoDB和MySQL的区别

    mongodb和MySQL 区别_MongoDB和MySQL的区别一 1 基于分布式文件存储 2 高负载情况下添加更多节点 可以保证服务器性能 3 将数据存储为一个文档二 比较 1 稳定性 2 索引 索引放在内存中 能够提升随机读写的性能 如果索引不能完全放在内存 一旦出现随机读写比较高的时候 就会频繁地进行磁盘交换 MongoDB 的性能就会急剧下降 3 占用的空间很大 因为它属于典型空间换时间原则的类型 那么它的磁盘空间比普通数据库会浪费一些 而且到目前为止它还没有实现

    2026年3月19日
    2
  • pycharm2021.11.2激活[最新免费获取]

    (pycharm2021.11.2激活)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~09LVN3XLKC-eyJsaWNlbnNlSWQiOi…

    2022年3月28日
    47
  • MFC读取excel数据

    MFC读取excel数据CDatabasedatabase; CStringsDriver; CStringsItem1,sItem2; CStringsDsn; CStringsFile=””;//filename CStringsSql; CFileDialogdlg(TRUE,//true为打开,false为创建 “xls”, “FileList”,

    2022年6月16日
    36
  • yarn详细入门教程「建议收藏」

    yarn详细入门教程「建议收藏」简介Yarn是Facebook,Google,Exponent和Tilde开发的一款新的JavaScript包管理工具。就像我们可以从官方文档了解那样,它的目的是解决这些团队使用npm面临的少数问题,即:1.安装的时候无法保证速度/一致性2.安全问题,因为npm安装时允许运行代码Yarn同样是一个从npm注册源获取模块的新的CLI客户端。注册的方

    2022年6月5日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号