深刻理解協方差

協方差的意義和計算公式

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

很顯然,均值描述的是樣本集合的中間點,它告訴咱們的信息是頗有限的,而標準差給咱們描述的則是樣本集合的各個樣本點到均值的距離之平均。以這兩個集合爲例,[0,8,12,20]和[8,9,11,12],兩個集合的均值都是10,但顯然兩個集合差異是很大的,計算二者的標準差,前者是8.3,後者是1.8,顯而後者較爲集中,故其標準差小一些,標準差描述的就是這種「散佈度」。之因此除以n-1而不是除以n,是由於這樣能使咱們以較小的樣本集更好的逼近整體的標準差,即統計上所謂的「無偏估計」。而方差則僅僅是標準差的平方。函數

爲何須要協方差?

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

 

來度量各個維度偏離其均值的程度,標準差能夠這麼來定義:3d

 

協方差的結果有什麼意義呢?若是結果爲正值,則說明二者是正相關的(從協方差能夠引出「相關係數」的定義),也就是說一我的越猥瑣就越受女孩子歡迎,嘿嘿,那必須的~結果爲負值就說明負相關的,越猥瑣女孩子越討厭,可能嗎?若是爲0,也是就是統計上說的「相互獨立」。code

從協方差的定義上咱們也能夠看出一些顯而易見的性質,如:htm

協方差多了就是協方差矩陣blog

上一節提到的猥瑣和受歡迎的問題是典型二維問題,而協方差也只能處理二維問題,那維數多了天然就須要計算多個協方差,好比n維的數據集就須要計算 n! / ((n-2)!*2) 個協方差,那天然而然的咱們會想到使用矩陣來組織這些數據。給出協方差矩陣的定義:get

 

這個定義仍是很容易理解的,咱們能夠舉一個簡單的三維的例子,假設數據集有三個維度,則協方差矩陣爲數學

 

可見,協方差矩陣是一個對稱的矩陣,並且對角線是各個維度上的方差。it

Matlab協方差實戰

上面涉及的內容都比較容易,協方差矩陣彷佛也很簡單,但實戰起來就很容易讓人迷茫了。必需要明確一點,協方差矩陣計算的是不一樣維度之間的協方差,而不是不一樣樣本之間的。這個我將結合下面的例子說明,如下的演示將使用Matlab,爲了說明計算原理,不直接調用Matlab的cov函數(藍色部分爲Matlab代碼)。

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

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

根據公式,計算協方差須要計算均值,那是按行計算均值仍是按列呢,我一開始就總是困擾這個問題。前面咱們也特別強調了,協方差矩陣是計算不一樣維度間的協方差,要時刻牢記這一點。樣本矩陣的每行是一個樣本,每列爲一個維度,因此咱們要按列計算均值。爲了描述方便,咱們先將三個維度的數據分別賦值:

>> 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)  %獲得 -147.0667
>> sum((dim1 - mean(dim1)) .* (dim3 - mean(dim3))) / (size(mysample, 1) - 1)  %獲得  -82.2667
>> sum((dim2 - mean(dim2)) .* (dim3 - mean(dim3))) / (size(mysample, 1) - 1)  %獲得   76.5111

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

>> var(dim1)  %獲得 227.8778
>> var(dim2)  %獲得 179.8222
>> var(dim3)  %獲得 156.7111

 這樣,咱們就獲得了計算協方差矩陣所須要的全部數據,調用Matlab自帶的cov函數進行驗證:

>> cov(mysample)

 把咱們計算的數據對號入座,是否是一摸同樣?

Update

今天忽然發現,原來協方差矩陣還能夠這樣計算,先讓樣本矩陣中心化,即每一維度減去該維度的均值,使每一維度上的均值爲0,而後直接用新的到的樣本矩陣乘上它的轉置,而後除以(N-1)便可。其實這種方法也是由前面的公式推導而來,只不過理解起來不是很直觀,但在抽象的公式推導時仍是很經常使用的!一樣給出Matlab代碼實現:

>> temp = mysample - repmat(mean(mysample), 10, 1);
>> result = temp' * temp ./ (size(mysample, 1) - 1)

總結

理解協方差矩陣的關鍵就在於牢記它計算的是不一樣維度之間的協方差,而不是不一樣樣本之間,拿到一個樣本矩陣,咱們最早要明確的就是一行是一個樣本仍是一個維度,心中明確這個整個計算過程就會順流而下,這麼一來就不會迷茫了~ 

轉載http://www.cnblogs.com/ywl925/p/3210822.html

相關文章
相關標籤/搜索