Covariance matrix 矩阵协方差计算方法

矩阵协方差如何计算?

[参考]
http://en.wikipedia.org/wiki/Covariance_matrix

看图最容易理解, 其实算的是每两列的协方差.

例如 x[2,3] 这个位置计算的是: 第二行和第三列的协方差.

Definition[edit]

Throughout this article, boldfaced unsubscripted X and Y are used to refer to random vectors, and unboldfaced subscripted Xi and Yi are used to refer to random scalars.

If the entries in the column vector

are random variables, each with finite variance, then the covariance matrix Σ is the matrix whose (ij) entry is the covariance

where

is the expected value of the ith entry in the vector X. In other words,

下面使用R来进行验证.

使用rpois产生一些离散值, 使用array产生一个矩阵.

> x=array(rpois(25,lambda=10), dim=c(5,5))
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]    6   10   12    8    8
[2,]   10    9   10   12   10
[3,]   10    5    8    8    7
[4,]   13    7   12    9    8
[5,]   14    4   11    7   12

计算这个矩阵的协方差

> y=cov(x)
> y
      [,1]  [,2]  [,3]  [,4]  [,5]
[1,]  9.80 -6.00  0.05 -0.85  3.25
[2,] -6.00  6.50  1.75  2.75 -1.50
[3,]  0.05  1.75  2.80 -0.35  0.75
[4,] -0.85  2.75 -0.35  3.70  0.00
[5,]  3.25 -1.50  0.75  0.00  4.00

y[1,1]是算的第一列和第一列的协方差.

> y[1,1]
[1] 9.8

使用cov(vector,vector)函数验证一下. 如下 :

> x[,1]
[1]  6 10 10 13 14
> cov(x[,1], x[,1])
[1] 9.8

y[1,2]和y[2,1]是一样的, 计算的是第一列和第二列的协方差. 验证如下 : 

> cov(x[,1], x[,2])
[1] -6
> cov(x[,2], x[,1])
[1] -6

以此类推.

那么问题来了, 如果输入的数组行列数不一样的话, 例如5行7列, 或者7行5列会怎么样呢?

下面来测试一下 : 

> x=array(rpois(35,lambda=10), dim=c(5,7))
> x
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    9   12   12   11    7   14   12
[2,]   11    8    8   11   14    8    7
[3,]   12    9    9    5   13    6    9
[4,]    9    7   12   11    9   14   10
[5,]    6   13   11    8   11    9   14

因为即使矩阵协方差时, 计算的是列和列的关系, 所以只和列有关, 因此以上数组虽然是5行7列的, 但是计算结果是7行7列.

如下 : 

> y=cov(x)
> y
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
[1,]  5.30 -3.90 -2.70 -1.35  3.10 -3.35 -5.45
[2,] -3.90  6.70  1.60 -1.20 -2.55  0.30  5.85
[3,] -2.70  1.60  3.30  1.65 -4.90  5.65  3.55
[4,] -1.35 -1.20  1.65  7.20 -3.45  7.20 -0.60
[5,]  3.10 -2.55 -4.90 -3.45  8.20 -9.45 -4.65
[6,] -3.35  0.30  5.65  7.20 -9.45 13.20  3.40
[7,] -5.45  5.85  3.55 -0.60 -4.65  3.40  7.30

其中y[7,6]指第七列和第六列的协方差. 验证如下 : 

> y[7,6]
[1] 3.4
> cov(x[,7], x[,6])
[1] 3.4
> x[,7]
[1] 12  7  9 10 14
> x[,6]
[1] 14  8  6 14  9

对于行比列多的输入也无妨, 计算结果都只和列有关.

> x=array(rpois(35,lambda=10), dim=c(7,5))
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]    6   11    8   10    5
[2,]    7    9   12   11    9
[3,]   12   15   11   11   10
[4,]   12    7   10   14   11
[5,]   14   14   18   11   10
[6,]   16   13   14    8   13
[7,]   14   11   12    9   10
> cov(x)
          [,1]       [,2]      [,3]       [,4]       [,5]
[1,] 13.952381  4.2142857  7.404762 -1.8809524  7.6904762
[2,]  4.214286  7.9523810  4.261905 -2.7857143  0.8095238
[3,]  7.404762  4.2619048 10.142857 -1.2619048  4.0476190
[4,] -1.880952 -2.7857143 -1.261905  3.6190476 -0.3095238
[5,]  7.690476  0.8095238  4.047619 -0.3095238  5.9047619
> cov(x[,5], x[,4])
[1] -0.3095238

其实, 我们就把每列想象成一组采样数据好了.

例如第一列是每天的下载量, 第二列是每天的收入, 第三列是每天的点击率, 等等.

计算他们的相关度, 和以上计算方法很相似.

> cor(x[,5], x[,4])
[1] -0.06695696
> y= cor(x)
> y
           [,1]       [,2]       [,3]        [,4]        [,5]
[1,]  1.0000000  0.4000840  0.6224533 -0.26470155  0.84728179
[2,]  0.4000840  1.0000000  0.4745424 -0.51926713  0.11813534
[3,]  0.6224533  0.4745424  1.0000000 -0.20828082  0.52301998
[4,] -0.2647016 -0.5192671 -0.2082808  1.00000000 -0.06695696
[5,]  0.8472818  0.1181353  0.5230200 -0.06695696  1.00000000

我们注意到对角线是1, 因为对角线的位置刚好是自己和自己的相关度, 必然是1.

例如y[1,1], 指第一列和第一列的相关度, y[2,2],  指第2列和第2列的相关度. 当然都是1.

[其他]


 

时间: 2024-09-13 11:18:33

Covariance matrix 矩阵协方差计算方法的相关文章

理解CSS3 transform中的Matrix(矩阵)

一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如"拉普拉斯不等式").这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面"Matrix(矩阵)"的时候,难免会心生畏惧(即使你已经学过),正常心理.实际上,这玩意确实有点复杂. 然而,这却是屌丝逆袭的一个好机会. CSS同行间:你是不是有这样的感觉:哎呀呀,每天就是对着设计图切页面,貌似技术没有得到实质性地提升啊,或者觉得日后高度有限! 我们应该都知道二八法则(

[Android] 使用Matrix矩阵类对图像进行缩放、旋转、对比度、亮度处理

    前一篇文章讲述了Android拍照.截图.保存并显示在ImageView控件中,该篇文章继续讲述Android图像处理技术,主要操作包括:通过打开相册里的图片,使用Matrix对图像进行缩放.旋转.移动.对比度.亮度.饱和度操作,希望对大家有所帮助. 一. 显示打开图片     首先,设置activity_main.xml布局如下所示: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android

CSS3中zoom或Matrix矩阵滤镜中心点变换如何兼容IE

兼容性地矩阵变换效果 IE9+支持CSS3 transform变换,IE9需要-ms-私有前缀,但是IE6-IE8怎么办呢? 在"IE矩阵滤镜Matrix旋转与缩放及结合transform的拓展"一文中曾提到一个CSS3 transform转换成IE矩阵滤镜工具:IE's CSS3 Transforms Translator,于是我们可以在web上实现各种兼容性的transform变换效果. 然而,IE的Matrix矩阵变换,或者zoom缩放会改变元素原本占据的展示尺寸,位置等,与CS

Flash中步入Matrix函数

函数 因为工作忙,所以很久没有出来写教程了.今天就来写个目前Flash 8所提供的新函数,在中文网站中也还没有看到的,这应该比较新鲜吧 看到标题也许很多数学不好或中学时上课打盹的朋友会感到反感,但放心的是在这里的Matrix已经简化了很多琐碎的步骤,也不用大家拿一张纸拼命的做计算.对想制作游戏的朋友也是必学的路程,所以大致上明白了运用的思路就可以说掌握了技巧. 在字典中的说明不够充分让大家去理解,所以开始还是要重复说明一下.Matrix矩阵就像个数组,排列方式是以列与行组成.在flash 8中所

计算任意一个图生成树的个数:Kirchhoff 的Matrix Tree方法Java实现

计算任意一个图的生成树的个数,是Kirchhoff提出的理论,通常称为Matrix Tree Theorem,原理很简单: Let G be a graph with V(G)={v1,v2,...,vn},let A={aij}be the adjacentcy matrix of G,and let C={cij}be the n*n matrix, where cij=deg vi if i=j; cij=-aij if i!=j; Then the number of spanning

剑指offer系列之十八:顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 由于每打印完一圈都会改变其起始坐标,所以需要先确定矩阵大小与这个起始坐标的关系,比如一个4阶矩阵,第一圈的起始坐标是(0,0),第二圈的起始坐标是(1,1),打印两圈之后就打印结束了.在比如一个5阶矩阵,前两圈是一样的,第三圈的

前端开发-关于CSS3 transform:matrix()牛角尖?

问题描述 关于CSS3 transform:matrix()牛角尖? transform:scale(sx,sy) >>> transform:matrix(sx,0,0,sy,0,0) transform:translate(tx,ty) >>> transform:matrix(1,0,0,1,tx,ty) transform:skew(θx,θy) >>> transform:matrix(1,tan(θy),tan(θx),1,0,0) tra

Android变形(Transform)之Matrix用法_Android

引言 最近在研究Android的变形,Android的2D变形(包括缩放,扭曲,平移,旋转等)可以通过Matrix来实现,3D变形可以通过Camera来实现.接下来就将我这俩天研究的东西和大家分享下,先来看看Matrix的用法. 效果图 变形以后   Matrix矩阵 坐标变换矩阵,即一个3*3的矩阵,用来对图形进行坐标变换. 图1.1  A为坐标矩阵,C为原始矩阵,R是A和C矩阵相乘记过,那么可以知道:(矩阵知识,大学没学好的伤不起啊) x' = a*x + b*y + c y' = d*x

Android开发之ImageView通过matrix实现手势缩放

关于ImageView的手势缩放有很多种方法绝大多数开源自定义缩放都是修改了ondraw函数来实现的.但是ImageView本身有scaleType属性通过设置android:scaleType="matrix" 可以用很少的代码就实现缩放功能.缩放的优点是实现起来简单同时因为没有反复调用ondraw函数缩放过程中不会有闪烁现象. MATRIX矩阵可以动态缩小放大图片来显示缩小图片  代码如下 复制代码 //获得Bitmap的高和宽 int bmpWidth=bmp.getWidth(