协方差的意义和计算公式

协方差的意义和计算公式学过概率统计的孩子都知道 统计里最基本的概念就是样本的均值 方差 或者再加个标准差 首先我们给你一个含有 n 个样本的集合 依次给出这些概念的公式描述 这些高中学过数学的孩子都应该知道吧 一带而过 很显然 均值描述的是样本集合的中间点 它告诉我们的信息是很有限的 而标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均 以这两个集合为例 0 8 12 20 和 8 9 11 1

学过概率统计的孩子都知道,统计里最基本的概念就是样本的均值,方差,或者再加个标准差。首先我们给你一个含有n个样本的集合,依次给出这些概念的公式描述,这些高中学过数学的孩子都应该知道吧,一带而过。

协方差的意义和计算公式

很显然,均值描述的是样本集合的中间点,它告诉我们的信息是很有限的,而标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前者是8.3,后者是1.8,显然后者较为集中,故其标准差小一些,标准差描述的就是这种“散布度”。之所以除以n-1而不是除以n,是因为这样能使我们以较小的样本集更好的逼近总体的标准差,即统计上所谓的“无偏估计”。而方差则仅仅是标准差的平方。

为什么需要协方差?

上面几个统计量看似已经描述的差不多了,但我们应该注意到,标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集,最简单的大家上学时免不了要统计多个学科的考试成绩。面对这样的数据集,我们当然可以按照每一维独立的计算其方差,但是通常我们还想了解更多,比如,一个男孩子的猥琐程度跟他受女孩子欢迎程度是否存在一些联系啊,嘿嘿~协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:

 协方差的意义和计算公式

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

 协方差的意义和计算公式

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

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

协方差的意义和计算公式


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

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

 协方差的意义和计算公式

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

 协方差的意义和计算公式

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

Matlab协方差实战

上面涉及的内容都比较容易,协方差矩阵似乎也很简单,但实战起来就很容易让人迷茫了。必须要明确一点,协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。这个我将结合下面的例子说明,以下的演示将使用Matlab,为了说明计算原理,不直接调用Matlab的cov函数(蓝色部分为Matlab代码)。

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

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

协方差的意义和计算公式

协方差的意义和计算公式

根据公式,计算协方差需要计算均值,那是按行计算均值还是按列呢,我一开始就老是困扰这个问题。前面我们也特别强调了,协方差矩阵是计算不同维度间的协方差,要时刻牢记这一点。样本矩阵的每行是一个样本,每列为一个维度,所以我们要按列计算均值。为了描述方便,我们先将三个维度的数据分别赋值:

>> dim1 = mysample(:,1); >> dim2 = mysample(:,2); >> dim3 = mysample(:,3);

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

>> sum((dim1 - mean(dim1)) .* (dim2 - mean(dim2))) / (size(mysample, 1) - 1) %得到 -147.0667 >> sum((dim1 - mean(dim1)) .* (dim3 - mean(dim3))) / (size(mysample, 1) - 1) %得到 -82.2667 >> sum((dim2 - mean(dim2)) .* (dim3 - mean(dim3))) / (size(mysample, 1) - 1) %得到 76.5111

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

>> var(dim1) %得到 227.8778 >> var(dim2) %得到 179.8222 >> var(dim3) %得到 156.7111

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

>> cov(mysample)

协方差的意义和计算公式

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

Update

今天突然发现,原来协方差矩阵还可以这样计算,先让样本矩阵中心化,即每一维度减去该维度的均值,使每一维度上的均值为0,然后直接用新的到的样本矩阵乘上它的转置,然后除以(N-1)即可。其实这种方法也是由前面的公式推导而来,只不过理解起来不是很直观,但在抽象的公式推导时还是很常用的!同样给出Matlab代码实现:

>> temp = mysample - repmat(mean(mysample), 10, 1); >> result = temp' * temp ./ (size(mysample, 1) - 1)

协方差的意义和计算公式

总结

理解协方差矩阵的关键就在于牢记它计算的是不同维度之间的协方差,而不是不同样本之间,拿到一个样本矩阵,我们最先要明确的就是一行是一个样本还是一个维度,心中明确这个整个计算过程就会顺流而下,这么一来就不会迷茫了~ 

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

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

(0)
上一篇 2026年3月20日 上午8:45
下一篇 2026年3月20日 上午8:45


相关推荐

  • 如何用Manus完成一个完整的项目

    如何用Manus完成一个完整的项目

    2026年3月15日
    1
  • 数学建模:排队论模型

    数学建模:排队论模型今天来简单介绍一下关于数学建模中排队论模型的基本情况和其在 MATLAB 中的实现方法 排队论 QueuingTheor 是研究系统随机聚散现象和随机服务系统工作过程的数学理论和方法 又称随机服务系统理论 为运筹学的一个分支 是通过对服务对象到来及服务时间的统计研究 得出这些数量指标 等待时间 排队长度 忙期长短等 的统计规律 然后根据这些规律来改进服务系统的结构或重新组织被服务对象 使得

    2026年3月19日
    1
  • cursor邪修教程:免魔法+无限续杯claude4/GPT5

    cursor邪修教程:免魔法+无限续杯claude4/GPT5

    2026年3月16日
    3
  • 瓦片地图拼接_开源瓦片地图

    瓦片地图拼接_开源瓦片地图瓦片地图(TiledMap)瓦片地图(TileMap)不但生成简单,并且可以灵活的用于Cocos2d-x引擎。不论你的游戏是角色扮演游戏,平台动作游戏或仿打砖块游戏,这些游戏地图可以使用开源的瓦片地图编辑器TiledMapEditor生成并保存为TMX文件格式,被Cocos2d-x支持。TMX瓦片地图格式Cocos2d支持被Tiled创建的地图文件(TMX)。Tiled的2个版本…

    2025年8月16日
    2
  • 非线性最小二乘问题例题_非线性自适应控制算法

    非线性最小二乘问题例题_非线性自适应控制算法摘录的一篇有关求解非线性最小二乘问题的算法–LM算法的文章,当中也加入了一些我个人在求解高精度最小二乘问题时候的一些感触:LM算法,全称为Levenberg-Marquard算法,它可用于解决非线性最小二乘问题,多用于曲线拟合等场合。LM算法的实现并不算难,它的关键是用模型函数 f 对待估参数向量p在其邻域内做线性近似,忽略掉二阶以上的导数项,从而转化为线性最小二乘问题,它具有收敛速度快

    2026年4月14日
    6
  • Struts2用AbstractInterceptor取代了AroundInterceptor

    Struts2用AbstractInterceptor取代了AroundInterceptorStruts2中绝大多数预建interceptor都从AbstractInterceptor扩展而来,AbstractInterceptor不在支持before、after两个抽象方法,取而代之的是intercept方法被抽象出来,交由子类去实现。其实大多数interceptor只会去实现before、after中的一个,这样就必须还要在ww中为另一个提供空方法,再由于线程安全问题WW…

    2022年5月14日
    37

发表回复

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

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