浅谈协方差矩阵
2015-09-18 13:34
357 查看
浅谈协方差矩阵
统计学的基本概念
学过概率统计的孩子都知道,统计里最基本的概念就是样本的均值,方差,或者再加个标准差。首先我们给你一个含有n个样本的集合X={X1,X2,...Xn}X=\{X_1,X_2,...X_n\},依次给出这些概念的公式描述,这些高中学过数学的孩子都应该知道吧,一带而过。均值:
X¯=∑ni=1Xin\bar X=\frac{\sum_{i=1}^nX_i}{n}标准差:
s=∑ni=1(Xi−X¯)2n−1−−−−−−−−−−−−−√s=\sqrt \frac{\sum_{i=1}^n(X_i-\bar X)^2}{n-1}方差:
s2=∑ni=1(Xi−X¯)2n−1s^2=\frac{\sum_{i=1}^n(X_i-\bar X)^2}{n-1}很显然,均值描述的是样本集合的中间点,它告诉我们的信息是很有限的,而标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前者是8.3,后者是1.8,显然后者较为集中,故其标准差小一些,标准差描述的就是这种“散布度”。之所以除以n-1而不是除以n,是因为这样能使我们以较小的样本集更好的逼近总体的标准差,即统计上所谓的“无偏估计”。而方差则仅仅是标准差的平方。
为什么需要协方差?
上面几个统计量看似已经描述的差不多了,但我们应该注意到,标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集,最简单的大家上学时免不了要统计多个学科的考试成绩。面对这样的数据集,我们当然可以按照每一维独立的计算其方差,但是通常我们还想了解更多,比如,一个男孩子的猥琐程度跟他受女孩子欢迎程度是否存在一些联系啊,嘿嘿~协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:var(X)=∑ni=1(Xi−X¯)(Xi−X¯)n−1var(X)=\frac{\sum_{i=1}^n(X_i-\bar X)(X_i-\bar X)}{n-1}
来度量各个维度偏离其均值的程度,协方差可以这么来定义:
var(X)=∑ni=1(Xi−X¯)(Yi−Y¯)n−1var(X)=\frac{\sum_{i=1}^n(X_i-\bar X)(Y_i-\bar Y)}{n-1}
协方差的结果有什么意义呢?如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),也就是说一个人越猥琐就越受女孩子欢迎,嘿嘿,那必须的~结果为负值就说明负相关的,越猥琐女孩子越讨厌,可能吗?如果为0,也是就是说两者是不相关的”。
从协方差的定义上我们也可以看出一些显而易见的性质,如:
cov(X,X)=var(X)cov(X,X)=var(X)
cov(X,Y)=cov(Y,X)cov(X,Y)=cov(Y,X)
协方差多了就是协方差矩阵
上一节提到的猥琐和受欢迎的问题是典型二维问题,而协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算n!(n−2)!∗2\frac{n!}{(n-2)!*2}个协方差,那自然而然的我们会想到使用矩阵来组织这些数据。给出协方差矩阵的定义:Cn∗n=(ci,j,ci,j=cov(Dimi,Dimj))C_{n*n}=(c_{i,j},c_{i,j}=cov(Dim_i,Dim_j))
这个定义还是很容易理解的,我们可以举一个简单的三维的例子,假设数据集有{x,y,z}\{x,y,z\}三个维度,则协方差矩阵为
C=⎛⎝⎜cov(x,x)cov(y,x)cov(z,x)cov(x,y)cov(y,y)cov(z,y)cov(x,z)cov(y,z)cov(z,z)⎞⎠⎟C=\begin{pmatrix} cov(x,x) & cov(x,y) & cov(x,z) \\ cov(y,x) & cov(y,y) & cov(y,z) \\ cov(z,x) & cov(z,y) & cov(z,z)\end{pmatrix} \\
可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。
Matlab协方差实战
上面涉及的内容都比较容易,协方差矩阵似乎也很简单,但实战起来就很容易让人迷茫了。必须要明确一点,协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。这个我将结合下面的例子说明,以下的演示将使用Matlab,为了说明计算原理,不直接调用Matlab的cov函数。首先,随机产生一个10*3维的整数矩阵作为样本集,10为样本的个数,3为样本的维数。
MySample = fix(rand(10,3)*50)
注:
x=rand(m,n)产生m行n列的位于(0,1)区间的随机数
fix(x) : 截尾取整
根据公式,计算协方差需要计算均值,那是按行计算均值还是按列呢,我一开始就老是困扰这个问题。前面我们也特别强调了,协方差矩阵是计算不同维度间的协方差,要时刻牢记这一点。样本矩阵的每行是一个样本,每列为一个维度,所以我们要按列计算均值。为了描述方便,我们先将三个维度的数据分别赋值:
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 ) % 得到 -58.2667 sum( (dim1-mean(dim1)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 ) % 得到 -8.2778 sum( (dim2-mean(dim2)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 ) % 得到 29.8889
注:
mean(x):求数组的平均数或者均值
sum(x) : 求和
搞清楚了这个后面就容易多了,协方差矩阵的对角线就是各个维度上的方差,下面我们依次计算
std(dim1)^2 % 得到 349.2111 std(dim2)^2 % 得到 218.7111 std(dim3)^2 % 得到 149.3889
注:
std(x):求数组x的标准偏差
这样,我们就得到了计算协方差矩阵所需要的所有数据,调用Matlab自带的cov函数进行验证:
把我们计算的数据对号入座,是不是一摸一样?
总结
理解协方差矩阵的关键就在于牢记它计算的是不同维度之间的协方差,而不是不同样本之间,拿到一个样本矩阵,我们最先要明确的就是一行是一个样本还是一个维度,心中明确这个整个计算过程就会顺流而下,这么一来就不会迷茫了~PS:本文采用CSDN Markdown编辑器编写。
转自:http://pinkyjie.com/2010/08/31/covariance/
略有修改
相关文章推荐
- c/c++ 实现split函数
- Game shader or System shader is busy ::VS CSG
- 部署lvs-rrd监控LVS
- 鼠标悬浮状态
- 创建一个接受String或&str的Rust函数
- 最长公共子序列
- 新浪微博技术架构分析
- Struts的Tiles框架
- iOS关闭键盘的几种方法
- String VS &str 在Rust函数中
- 一行式并行方案(译)
- Java编程语言学习方法谈
- 公司项目适配IOS9总结
- 跨域触发事件(子页面用js触发父页面元素的事件)
- ListView下拉刷新(慕课网教材源码)
- ViewPager简单使用说明
- 通用型集成运放结构及特点
- XCode编译器里有鬼 – XCodeGhost样本分析
- 家用服务机器人将成为机器人的下一个入口
- 用gdb调试程序