在opencv的Core中有一个函数是计算协方差矩阵,这个函数为:calcCovarMatrix
在这里我们就来简单的介绍一些协方差矩阵
方差
方差是各个数据与平均数之差的平方的平均数。在概率论和数理统计中,方差(英文Variance)用来度量随机变量和其数学期望(即均值)之间的偏离程度
我们首先看看方差,对于单个向量,我们称为是方差。比如一个n维的向量 其中 方差我们应该:
标准差 :方差开根号
对于两个向量:还有一个概念,协方差
协方差 :在概率论和统计学中,协方差用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
比如向量: 和
协方差计算方式:
协方差是描述两个向量直接的关系
我们计算来一个简单的例子:
对于向量:
如何来求解这个来年两个向量的协方差
我们利用协方差的计算公式:
X的均值为:102.5 Y的均值为:151.5
这个地方 * 我们作为当做内积来使用
所以(112-102.5,93-102.5)* (147-151.5,157-151.5)=(9.5,-9.5)*(-3.5,4.5)=-9.5*3.5-9.5*4.5=85.5
协方差矩阵:
对矩阵来说,我们可以看做是n*m (n行,m列)矩阵 ,我们的协方差矩阵 我们可以看成是m 向量之间的相互关联,那么m个向量之间的关联关系,任意的两个向量之间都存在关系,所以我们可以知道协方差矩阵的维度为m*m
那么任意两个向量之间都是存在协方差,,比如一个3*2的矩阵
那么我们可以其协方差矩阵的维度为2*2
int matSize = 2;
Mat covar = new Mat(matSize, matSize, CvType.CV_8UC1);
Mat mean = new Mat(1, matSize, CvType.CV_8UC1);
Mat src = new Mat(new Size(2,3),CvType.CV_32FC1);
src.put(0, 1, new double[] {1,2,3,4,5});
System.out.println(src.dump());
Core.calcCovarMatrix(src, covar, mean, Core.COVAR_ROWS | Core.COVAR_NORMAL);
System.out.println(covar.dump());
输出协方差矩阵为:
那么到底是否正确:
协方差中矩阵对应的元素
dst(i,j)=
向量X:第i列的所有元素减去第i列元素的均值
向量Y:第j列所有的元素减去第j列所有元素的均值
向量X和向量Y的内积
dst(1,1)=
第一列的均值:(0+2+4)/3=2 第二列均值:(1+3+5)/3=3
向量1=(0-2,2-2,4-2)=(-2,0,2)
向量2=(0-2,2-2,4-2)=(-2,0,2)
向量1和向量2的内积(-2,0,2)*(-2,0,2)=-2*(-2)+0*0+2*2=8
利用同样的方法我们可以计算对应的dst(1,2) dst(2,1),dst(2,2) 最后这些元素按照左边组成矩阵
就是我们上面输出的协方差矩阵了
上面就是对协方差矩阵的简单的理解
希望对你有所帮助!