Dr.Can在他的教学视频(【卡尔曼滤波器】2_数学基础_数据融合_协方差矩阵_状态空间方程_观测器问题)中使用了足球运动员的数据介绍了协方差矩阵的概念和计算方法,原始数据如下图,那么协方差矩阵到底是什么?他有什么用?我们怎么计算协方差矩阵?如何编写程序让计算机帮助我们计算协方差矩阵呢?

协方差矩阵其实是用来描述一个数据集中不同字段(属性)数据之间的关联程度的。百度词条的解释是:
协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
用数学语言,协方差的公式可以表示为:

我们用简单的人话来说,就是如果两个字段(属性)正相关的(也就是变化趋势一致),协方差是正的;如果负相关(也就是变化趋势相反),那么协方差就是负的。将协方差和两个属性的标准差相除,我们还可以得到一个区间为(-1,1)的相关系数,用来归一化的表示两个字段(属性)的相关程度:

DR.CAN提到了一种基于过度矩阵的计算方法,也就是将协方差的计算公式变形一下,这样我们就可以使用matlab中自带的矩阵运算函数得到非常简洁的表达,并且能够高效快速的得到计算结果,计算过程如下:

我把这种算法写成了matlab函数如下:
function [P] = covarianceMatrix(M)
%输入数据表M矩阵,输出这组数据的协方差矩阵
% 通过引入过度矩阵来简化运算的步骤
N = size(M,1);
dim = size(M,2);
A = ones(N,N);
a = M - 1/N*A*M;
P = 1/N*a'*a
end
我们输入数据调用一下这个函数如下:
M = [179,74,33;187,80,31;175,71,28;170,72,33;185,81,32;177,75,28;178,71,30;187,83,35;190,94,27;178,73,21;170,68,29;183,73,23;184,78,31;180,75,24;180,76,20;
]
covarianceMatrix(M)
运行结果如下:

我们看到,和Dr.Can用excel计算的结果是一致的。
















