1. 程式人生 > >機器學習中的協方差矩陣的深入理解(簡單舉例)

機器學習中的協方差矩陣的深入理解(簡單舉例)

目錄

1、統計學的定義

2、協方差矩陣的由來

3、MATLAB實戰練習

4、心得感悟

注意:一定是一個對稱的方陣,一定是一個對稱的方陣!!!記住就好啦~


最近老師講課還有看論文的時候經常看到協方差矩陣這個破東西,自己還是搞不太清楚,查了協方差矩陣的資料,惡補之後決定馬上記錄下來。研究生數學1考試的概率論與數理統計有此知識,有些忘啦。

1、統計學的定義

學過概率統計的孩子都知道,統計裡最基本的概念就是樣本的均值,方差,或者再加個標準差。首先我們給你一個含有n個樣本的集合X={X1,…,Xn},依次給出這些概念的公式描述,這些高中學過數學的孩子都應該知道吧,一帶而過。

 很顯然,均值描述的是樣本集合的中間點,它告訴我們的資訊是很有限的,而標準差給我們描述的則是樣本集合的各個樣本點到均值的距離之平均。以這兩個集合為例,[0,8,12,20]和[8,9,11,12],兩個集合的均值都是10,但顯然兩個集合差別是很大的,計算兩者的標準差,前者是8.3,後者是1.8,顯然後者較為集中,故其標準差小一些,標準差描述的就是這種“散佈度”。之所以除以n-1而不是除以n,是因為這樣能使我們以較小的樣本集更好的逼近總體的標準差,即統計上所謂的“無偏估計”。而方差則僅僅是標準差的平方。
那麼問題來了,上面介紹的參量難道不能描述統計學所有特性嗎?為啥還要搞出一個協方差出來

上面幾個統計量看似已經描述的差不多了,但我們應該注意到,標準差和方差一般是用來描述一維資料的,但現實生活我們常常遇到含有多維資料的資料集,最簡單的大家上學時免不了要統計多個學科的考試成績。面對這樣的資料集,我們當然可以按照每一維獨立的計算其方差,但是通常我們還想了解更多,,比如,一個男孩子的猥瑣程度跟他受女孩子歡迎程度是否存在一些聯絡啊,嘿嘿~協方差就是這樣一種用來度量兩個隨機變數關係的統計量,我們可以仿照方差的定義:

度量各個維度偏離其均值的程度協方差可以這麼來定義:

那麼,協方差的結果有什麼意義呢?如果結果為正值,則說明兩個隨機變數是正相關的(從協方差可以引出“相關係數”的定義),也就是說一個人越猥瑣就越受女孩子歡迎,嘿嘿,那必須的~結果為負值就說明負相關的,越猥瑣女孩子越討厭,可能嗎?如果為0,也是就是統計上說的“相互獨立”。

從協方差的定義上我們也可以看出一些顯而易見的性質,如:

2、協方差矩陣的由來

好幾十年前,魯迅爺爺就說過,世界上本沒有路,走的人多了也就有了路。協方差矩陣也是這樣,好多協方差湊合到一起就形成了協方差矩陣。當然,數學的定義,不能如我這樣隨意。對於一個二維矩陣,每一個因子都可以視為兩個不同隨機變數的關係,這正好和協方差矩陣多少有點牽連,因此數學家們就把協方差矩陣引入到了二維矩陣中,衡量各個變數之間的緊密程度(就是關係度啦)。根據協方差的性質,我們可以類似的推出協方差矩陣的性質:

1.協方差矩陣一定是個對稱的方陣

2.協方差矩陣對角線上的因子其實就是變數的方差:cov(X,X)=var(X)

這個定義還是很容易理解的,我們可以舉一個簡單的三變數的例子,假設資料集有{x,y,z}{x,y,z}三個維度,則協方差矩陣為:

再一次可以看出,協方差矩陣是一個對稱的矩陣,而且對角線是各個變數上的方差。

3、MATLAB實戰練習

上面涉及的內容都比較容易,協方差矩陣似乎也很簡單,但實戰起來就很容易讓人迷茫了。必須要明確一點,### 協方差矩陣計算的是不同維度之間的協方差,而不是不同樣本之間的

為了說明計算原理,不直接呼叫Matlab的cov函式:

首先,隨機產生一個10*3維的整數矩陣作為樣本集,10為樣本的個數,3為樣本的維數

rand(3,3)是生成3*3的偽隨機數矩陣,每個元素服從(0,1)的均勻分佈,fix是向最近的整數取整

MySample = fix(rand(10,3)*50)

MySample =

     3     8    22
     2    39     4
    26    15    11
    38    26    45
    46     8     7
     6    30    41
    28    13    26
    23    32    49
     0    34     3
    16    37    22

 

注意:根據公式,計算協方差需要計算均值,那是按行計算均值還是按列呢,我一開始就老是困擾這個問題。前面我們也特別強調了,協方差矩陣是計算不同維度間的協方差,要時刻牢記這一點。

樣本矩陣的每行是一個樣本,每列為一個維度,所以我們要按列計算均值。為了描述方便,我們先將三個維度的資料分別賦值:

%A(:,j)獲取矩陣第j列的全部元素,A(i,:)獲取矩陣第i行的全部元素。
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 )  % 得到  -92.1778
sum( (dim1-mean(dim1)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 )  % 得到   57.8889
sum( (dim2-mean(dim2)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 )  % 得到   23.2222

搞清楚了這個後面就容易多了,協方差矩陣的對角線就是各個維度上的方差,下面我們依次計算:

std(dim1)^2 % 得到   257.7333
std(dim2)^2 % 得到   145.7333
std(dim3)^2 % 得到   295.1111

這樣,我們就得到了計算協方差矩陣所需要的所有資料:

C11=257.7333 C12= -92.1778 C13= 57.8889
C21= -92.1778 C22=145.7333 C23=23.2222
C31= 57.8889 C32=23.2222 C33=295.1111

呼叫Matlab自帶的cov函式進行驗證

C11=257.7333 C12= -92.1778 C13= 57.8889
C21= -92.1778 C22=145.7333 C23=23.2222
C31= 57.8889 C32=23.2222 C33=295.1111

4、心得感悟

理解協方差矩陣的關鍵就在於牢記它計算的是不同維度之間的協方差,而不是不同樣本之間,拿到一個樣本矩陣,我們最先要明確的就是一行是一個樣本還是一個維度,心中明確這個整個計算過程就會順流而下,這麼一來就不會迷茫了。其實還有一個更簡單的容易記還不容易出錯的方法:協方差矩陣一定是一個對稱的方陣

注意:一定是一個對稱的方陣,一定是一個對稱的方陣!!!記住就好啦~