从均值,标准差到方差、协方差、协方差矩阵的一些简要说明。还有用matlab计算协方差矩阵,包括自己编程实现和自带函数实现的说明。
设有样本集合\(a=[a_1,a_2,\cdots,a_m]\)。【注意,下文所述的如向量\(a=[a_1,a_2,\cdots,a_m]\),并不意味着就是一个样本,代表其中有m个特征,而是有m个样本,由每个样本的第一个特征组成的向量\(a\),具体看下文就知道了。】
均值(mean)
均值描述的是一个样本集合的中间点。
\[\mu=\frac 1m \sum_{i=1}^{m}a_i
\]
标准差(standard deviation)
标准差可以用来描述单个点到均值的距离的平均值,或者说其描述的就是一种分散程度。【注意:标准差和方差中求平均时除以m-1而不是m,是因为这样能使我们以较小的样本集更好的逼近总体的标准差,即统计上所谓的“无偏估计”,若除以m则为有偏】
\[s=\sqrt{ \frac 1{m-1}.\sum_{i=1}^{m} {(a_i-\mu)^2}}
\]
- 如两个向量[0,5,10]和[4,5,6].两者均值都是5,但是可以看出两者有很大的差别,计算得到标准差分别为5和1。也可以明显看出,后者较前者数据更为集中,所以其标准差也更小。
方差 (variance):单个向量
方差用来描述数值的分散(离散)程度,也即数据偏离均值的程度。某个向量的方差可以用该向量的每个元素减去均值的完全平方再求平均来求得。方差仅仅是标准差的平方,则有
\[s^2=Var(a) = \frac 1{m-1}.\sum_{i=1}^{m} {(a_i-\mu)^2}
\]
零均值化(也叫中心化)处理是将原数据集减去该数据集的均值,即\(a=a-\mu\),这样数据\(a\)的均值就是零了。再说一句,零均值化不是简单的将均值令为零,而是要减去均值,这样才有零均值,这里之所以看到还是\(a_i\)是因为相减后还令为了\(a_i\),即\(a_i=a_i-\mu\),或者说将下文中的\(a_i\)还是要视为$a_i=a_i-\mu $。 则将向量零均值化处理,可以有
\[Var(a) = \frac 1{m-1}.\sum_{i=1}^{m} {a_i^2}
\]
协方差(covariance):两个向量
协方差可以用来表示两个向量之间的相关性,如在PCA降维中,我们希望降维后的向量可以保存更多的原始信息,所以尽可能的减少向量之间的相关性,因为相关性越大,则就代表着两个变量不是完全独立的,也即必然有重复的信息。
\[Cov(a,b) = \frac 1{m-1}.\sum_{i=1}^{m} {(a_i-\mu_a)(b_i-\mu_b)}
\]
同样,若零均值化,则有
\[Cov(a,b) = \frac 1{m-1}.\sum_{i=1}^{m} {a_ib_i}
\]
协方差可以衡量两个向量(变量)同时变化的程度,若协方差cov(a,b)>0,则表示a若增大,b也增大;小于0时,a增大,b减小。
后话:当协方差为0的时候,也即表示两个变量之间不相关。在PCA降维时,就是选择几个基,使得原始数据变换到该组基上时,各变量之间的协方差为零,而变量的方差却很大。
而为了让协方差为0,选择第二个基的时候,与第一个基正交,第三个与第二个正交,这样两两正交的基,最后的相关性就是0。
协方差矩阵(covariance matrix):多个向量之间
上述只是单个向量的方差和两个向量之间的协方差,若有多个向量,则可以用矩阵来表示两两的相关性。如有向量a,b,c【注意:这里不要误解为一个向量就代表着一个样本数据,其实在这里更贴合的说,向量a等表示的是不同样本数据的同一位置(如第一个特征)的特征,而\((a_1,b_1,c_1)\)才代表一个样本数据。具体看后文matlab计算就清楚了,之所以这样表示是在计算均值等表达上有方便之处】,用矩阵X表示这三个向量,则其两两之间的协方差可以用矩阵来表示。
\[X=\begin{pmatrix} a\\b\\c\end{pmatrix}=\begin{pmatrix} a_1 & a_2&...&a_m \\ b_1& b_2 &...&b_m \\c_1&c_2&...&c_m \end{pmatrix}
\]
计算的均值是所有样本相同位置的特征求均值,则有:
\[\mu_a=\frac 1m \sum_{i=1}^{m}a_i \mu_b=\frac 1m \sum_{i=1}^{m}b_i \mu_c=\frac 1m \sum_{i=1}^{m}c_i
\]
则有均值矩阵(向量):
\[\mu=\begin{pmatrix} \mu_a\\\mu_b\\\mu_c\end{pmatrix}
\]
对原样本矩阵去均值化(零均值化),则有:
\[X=X-\hat{\mu} \\这里的\hat{\mu}是每列均为\mu,列数与矩阵X相同的矩阵。因为\mu是个列向量,不能直接与矩阵X相减,所以才有的这步
\]
则可以得到协方差矩阵
\[cov(X)=\begin{pmatrix} cov(a,a)&cov(a,b)&cov(a,c)\\ cov(b,a)&cov(b,b)&cov(b,c) \\cov(c,a)&cov(c,b)&cov(c,c)\end{pmatrix}
\]
同时从上文协方差处可以看出,零均值化后的协方差就是向量的内积求平均,所以对于上述协方差矩阵则可以写为
\[\begin{aligned}
cov(X)&=\begin{pmatrix} cov(a,a)&cov(a,b)&cov(a,c)\\ cov(b,a)&cov(b,b)&cov(b,c) \\cov(c,a)&cov(c,b)&cov(c,c)\end{pmatrix}\\
& =\begin{pmatrix} \frac 1{m-1}.\sum_{i=1}^{m} {a_ia_i}&\frac 1{m-1}.\sum_{i=1}^{m} {a_ib_i}&\frac 1{m-1}.\sum_{i=1}^{m} {a_ic_i}\\ \frac 1{m-1}.\sum_{i=1}^{m} {b_ia_i}&\frac 1{m-1}.\sum_{i=1}^{m} {b_ib_i}&\frac 1{m-1}.\sum_{i=1}^{m} {b_ic_i}\\\frac 1{m-1}.\sum_{i=1}^{m} {c_ia_i}&\frac 1{m-1}.\sum_{i=1}^{m} {c_ib_i}&\frac 1{m-1}.\sum_{i=1}^{m} {c_ic_i}\end{pmatrix}\\
& =\frac 1{m-1}XX^T(这是零均值化后的,也即经过了X=X-\hat{\mu})\\
& =\frac 1{m-1}(X-\hat{\mu})(X-\hat{\mu})^T(没有零均值化时,注意维度匹配)
\end{aligned}
\]
若没有零均值化,则有下面的计算,其中的均值也是行向量的均值.
\[设P=\begin{pmatrix}P_{11}& P_{12}&\cdots&P_{1m}\\
P_{21}&P_{22}&\cdots&P_{2m}\\
\vdots&\vdots&&\vdots\\
P_{n1}&P_{n2}&\cdots&P_{nm}\end{pmatrix}
=\begin{pmatrix}P_{1}\\
P_{2}\\
\vdots\\
P_{n}\end{pmatrix} 设\hat\mu=\begin{pmatrix}\mu_{1}&\mu_{1}&\cdots&\mu_{1}\\
\mu_{2}&\mu_{2}&\cdots&\mu_{2}\\
\vdots&\vdots&&\vdots\\
\mu_{n}&\mu_{n}&\cdots&\mu_{n}\end{pmatrix}\\
则计算协方差矩阵,cov(P)=\frac 1{m-1}(P-\hat\mu)(P-\hat\mu)^T\\
=\frac1{m-1}\begin{pmatrix}P_{11}-\mu_1& P_{12}-\mu_1&\cdots&P_{1m}-\mu_1\\
P_{21}-\mu_2&P_{22}-\mu_2&\cdots&P_{2m}-\mu_2\\
\vdots&\vdots&&\vdots\\
P_{n1}-\mu_n&P_{n2}-\mu_n&\cdots&P_{nm}-\mu_n\end{pmatrix}\begin{pmatrix}P_{11}-\mu_1& P_{21}-\mu_2&\cdots&P_{n1}-\mu_n\\
P_{12}-\mu_1&P_{22}-\mu_2&\cdots&P_{n2}-\mu_n\\
\vdots&\vdots&&\vdots\\
P_{1m}-\mu_1&P_{2m}-\mu_2&\cdots&P_{nm}-\mu_n\end{pmatrix}\\
=\frac1{m-1}\begin{pmatrix}\sum_{i=1}^m(P_{1i}-\mu_1)(P_{1i}-\mu_1)&\sum_{i=1}^m(P_{1i}-\mu_1)(P_{2i}-\mu_2)&\cdots&\sum_{i=1}^m(P_{1i}-\mu_1)(P_{ni}-\mu_n)\\\sum_{i=1}^m(P_{2i}-\mu_2)(P_{1i}-\mu_1)&\sum_{i=1}^m(P_{2i}-\mu_2)(P_{2i}-\mu_2)&\cdots&\sum_{i=1}^m(P_{2i}-\mu_2)(P_{ni}-\mu_n)\\
\vdots&\vdots&&\vdots\\\sum_{i=1}^m(P_{ni}-\mu_n)(P_{1i}-\mu_1)&\sum_{i=1}^m(P_{ni}-\mu_n)(P_{2i}-\mu_2)&\cdots&\sum_{i=1}^m(P_{ni}-\mu_n)(P_{ni}-\mu_n)
\end{pmatrix}\\
=\begin{pmatrix}cov(P_1,P_1)&cov(P_1,P_2)&\cdots&cov(P_1,P_n)\\
cov(P_2,P_1)&cov(P_2,P_2)&\cdots&cov(P_2,P_n)\\\vdots&\vdots&\ddots&\vdots\\
cov(P_n,P_1)&cov(P_n,P_2)&\cdots&cov(P_n,P_n)\end{pmatrix}
\]
注注注注注注注注注注注注注注注注注注注注意!!!!!!协方差矩阵计算的是特征之间的相关程度,而不是样本之间的相关程度,如上述协方差矩阵中的一个元素cov(a,b)就是计算在某个样本中,其特征a和特征b之间的相关程度。进一步,如有m个样本,每个样本有k个特征,那么计算得到的协方差矩阵就是k阶方阵,和样本有多少个没有啥关系。
Matlab实现协方差矩阵
下面分别用上述的公式和自带函数实现协方差矩阵的计算,得到的结果是一样的
- 用公式\(cov(X)=\frac{1}{m-1}XX^T\)计算
clc;
clear;
%我们随机产生一个矩阵来作为样本数据,分别用公式自行编程和用matlab自带函数实现协方差计算,
%计算得到结果,两者是相同的
A=rand(3,10);%3行10列的矩阵,这里代表10个样本数据,每个样本有3个特征;
B=mean(A,2);%求取矩阵均值时,按照行求取,也即每个样本的第一个特征相加再平均,得到3行1列的矩阵;
C=zeros(3,10);%创建零矩阵,用来存放去均值后的结果;
for i=1:10
C(:,i)=A(:,i)-B;%矩阵C即为零均值后的样本数据,是3行10列,代表10个样本数据,每个样本有3个特征;
end
cov_C=(C*C')/9%按照公式求取协方差矩阵,是无偏估计,所以除以m-1=10-1=9;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%下面用matlab自带的cov函数求取协方差,注意其输入的矩阵的行数代表着样本的个数,
%列数代表着每个样本的特征数,故下面用转置后的A求取;
cov(A')%自带的函数会自行零均值化等处理,所以只管输入就好;
- 用公式\(cov(X)=\begin{pmatrix} cov(a,a)&cov(a,b)&cov(a,c)\\ cov(b,a)&cov(b,b)&cov(b,c) \\cov(c,a)&cov(c,b)&cov(c,c)\end{pmatrix}\)计算,先把矩阵中的每个元素算出来,最后组合成协方差矩阵。
%%同上,一样要先零均值化,矩阵C即为零均值后的样本数据
A=rand(3,10);%3行10列的矩阵,这里代表10个样本数据,每个样本有3个特征;
B=mean(A,2);%求取矩阵均值时,按照行求取,也即每个样本的第一个特征相加再平均,得到3行1列的矩阵;
C=zeros(3,10);%创建零矩阵,用来存放去均值后的结果;
for i=1:10
C(:,i)=A(:,i)-B;%矩阵C即为零均值后的样本数据,是3行10列,代表10个样本数据,每个样本有3个特征;
end
%与公式保持一致,令矩阵中的行向量为a,b,c
a=C(1,:);
b=C(2,:);
c=C(3,:);
%则计算协方差矩阵中的第一个元素cov(a,a)
cov_aa=(a*a')/9 %这就是向量的内积,除了这样直接向量相乘外,还可以用对应元素相乘,最后再相加计算。
%同理还有其他的几个
cov_ab=(a*b')/9
cov_ac=(a*c')/9
cov_ba=(b*a')/9
cov_bb=(b*b')/9
cov_bc=(b*c')/9
cov_ca=(c*a')/9
cov_cb=(c*b')/9
cov_cc=(c*c')/9
%计算结果与上述相同
References
降维——PCA
浅谈协方差矩阵