什麼是協方差,怎麼計算?為什麼需要協方差?

2021-10-11 18:49:20 字數 2953 閱讀 5940

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

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

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

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

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

這個定義還是很容易理解的,我們可以舉乙個簡單的三維的例子,假設資料集有三個維度,則協方差矩陣為

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

上面涉及的內容都比較容易,協方差矩陣似乎也很簡單,但實戰起來就很容易讓人迷茫了。必須要明確一點,協方差矩陣計算的是不同維度之間的協方差,而不是不同樣本之間的。這個我將結合下面的例子說明,以下的演示將使用matlab,為了說明計算原理,不直接呼叫matlab的cov函式(藍色部分為matlab**)。

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

根據公式,計算協方差需要計算均值,那是按行計算均值還是按列呢,我一開始就老是困擾這個問題。前面我們也特別強調了,協方差矩陣是計算不同維度間的協方差,要時刻牢記這一點。樣本矩陣的每行是乙個樣本,每列為乙個維度,所以我們要按列計算均值。為了描述方便,我們先將三個維度的資料分別賦值:

>> 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函式進行驗證:

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

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

什麼是viewport,為什麼需要viewport

以一代iphone下的safari來說就是 在iphone的320px物理螢幕上 視覺視窗 visual viewport 建立出了乙個980px的虛擬視窗 布局視窗 layout viewport 在視覺視窗 visual viewport 中我們可以拖動橫向豎向滑動條或者放大縮小網頁,來達到最佳...

什麼是鏈結,為什麼需要鏈結?

在實際開發中,我們一定是多檔案程式設計,所有檔案在編譯後,需要合在一起,合在一起的過程就是鏈結的過程。每乙個原始檔 就是.c檔案,上圖中的程式1 都有對應的零碎檔案 就是.件 通過預編譯 通過 include實現 把.c和.件整合成乙個組合c檔案,這個組合c檔案的擴充套件名為.i。把組合c檔案編譯成...

什麼是dtd檔案,為什麼需要

dtd為英文document type definition,中文意思為 文件類定義 dtd肩負著兩重任務 一方面它幫助你編寫合法的 另一方面它讓瀏覽器正確地顯示器 也許你會問它們居然有這樣的能力?如是你是乙個個網頁製作者,你會很清楚地知道乙個html文件的基本結構可分為兩個主要部分 html 頭部...