1. 程式人生 > >sklearn(三) sklearn.covariance 協方差估計 *

sklearn(三) sklearn.covariance 協方差估計 *

首先對協方差有個總體認識:協方差主要是用來估計資料中不同特徵之間的相互關係的一個統計量,除協方差以外,"相關係數”也可以用來估計資料中不同特徵的相互關係。
“相關係數”是在協方差的基礎上進一步計算而得到的。二者計算公式分別如下:

由公式可以看出,協方差與相關係數的區別在於,協方差沒有排除兩個不同特徵本身方差對於二者相互關係的影響,而“相關性”則排除兩個特徵本身方差的干擾,更加徹底的研究了不同特徵之間的相互關係。

以下介紹sklearn.covariance中提及的幾種協方差估計 方法:

sklearn.covariance.EmpiricalCovariance

在python中可以用numpy.cov()和dataframe.cov()計算資料的協方差。而當我們不想用全部的資料計算協方差,只想抽取其中一部分資料估計協方差時,此時,可以選用EmpiricalCovariance estimator,他假設用於估計協方差的資料服從Guassion distribution,通過最大似然法來估計協方差。EmpiricalCovariance estimator不僅可以估計訓練樣本的協方差,還可以根據得出的協方差矩陣,估計測試樣本的似然值,用於檢測測試樣本是否為異常點(初略設想,具體細節暫不考慮)。empiricalcovariance可通過如下兩個function求解:

#way1
from sklearn.covariance import empirical_covariance(X,assume_centered=False)
#X:為訓練樣本
#assume_centered=True:if ture,data don't centered before computation;
#empirical_covariance()返回empirical covariance
#way2
from sklearn.covariance import EmpiricalCovariance
object = EmpiricalCovariance(store_precision=
True,assume_centered=False) cov = object.fit(X) #返回一個covariance object cov.covariance_ #返回擬合的經驗協方差矩陣 cov.score(X_test) #擬合符合Guassion分佈的X_test的似然值。(Computes the log-likelihood of a Gaussian data set with self.covariance_ as an estimator of its covariance matrix.

參考博文

sklearn.covariance.ShrunkCovariance

當樣本量遠遠大於特徵量時,不用ShrunkCovariance也可以得到較好的結果,但是,當樣本量<特徵量時,雖然“經驗協方差估計”是一個好的估計方法,但是,對於協方差矩陣特徵值的估計來說,他並不是一個好的演算法,所以由“經驗協方差估計”得到的precision matrix(協方差矩陣的逆矩陣)精確度也不高,甚至有時,因為一些數值原因(比如:樣本數量<特徵數量,無法求協方差矩陣的逆陣),無法求取precision matrix。為了避免求逆時出現一些問題,學者又引入了ShrunkCovariance:如果說“經驗協方差估計”採用的是“最大似然法估計”,那麼ShrunkCovariance就是採用“帶有l2懲罰項的正則化的最大似然估計”,懲罰項的引入,相當於是給協方差矩陣的特徵值添加了一個偏移量,從而降低了原最大似然估計中得到的協方差矩陣的最大,最小特徵值的差距。
ShrunkCovariance的估計可由兩個function實現:

#way1
from sklearn.covariance import shrunk_covariance
shrunk_covariance(emp_cov,shrinkage=0.1)
#emp_cov 用於收縮的協方差矩陣
#shrinkage:用於計算收縮矩陣的係數
#return: 收縮協方差矩陣
#way2
from sklearn.covariance import ShrunkCovariance
object = ShrunkCovariance(store_precision=True,assume_centered=False,shrinkage=0.1)
object.fit(X) #訓練資料
object.covariance_ #給出擬合的收縮協方差矩陣
object.score(X_test) #給出服從Guassian分佈的測試集的似然值(Computes the log-likelihood of a Gaussian data set with self.covariance_ as an estimator of its covariance matrix.)
#way3 Ledoit-Wolf提出了一個公式,能夠計算出最優的收縮係數,來計算收縮協方差矩陣
from sklearn.covariance import ledoit_wolf
ledoit_wolf(X,assume_conetered=False,block_size=1000)
#return Shrunk Covariance
#way4 
from sklearn.covariance import LedoitWolf
object = LedoitWolf(store_precision=True,assume_centered=False,block_size=1000)
object.fit(X)
object.covariance_ #獲得收縮協方差矩陣
object.score(X_test) #Computes the log-likelihood of a Gaussian data set with self.covariance_ as an estimator of its covariance matrix.
#way5 Cheng et.al設計了一個公式,能夠產生一個“收縮係數”,使通過該係數得到的平方誤差(between estimated covariance and real covariance )能夠小於Ledoit和Wolf得到的。
from sklearn.covariance import oas
oas(X,assume_centered=False)
#return : shrunk covariance  and  shrunkage coefficient
#way6
from sklearn.covariance import OAS
object = OAS(store_precision=True,assume_centered=False)
object.fit(X)
object.covariance_ #返回shrunk covariance matrix
object.score(X_test) #返回服從Guassion分佈的X_test的似然值。(Computes the log-likelihood of a Gaussian data set with self.covariance_ as an estimator of its covariance matrix.

對下面這段話其實並不是很理解,如果有高手路過,歡迎探討

下圖為“通過cross_validation得到最優的shrunkage coefficient”,‘LediotWolf coefficient’,“OAS coefficient”,三者產生的誤差值大小:

下圖為"Lediot Wolf ","OAS"隨著樣本數量增加,square error和shrinkage的變化曲線:

sparse inverse covariance

precision matrix(the inverse of covariance matrix)與partial correlation matrix 是成一定比例的,也就是說,precision matrix給出了原始資料部分特徵之間是否相互獨立的描述,對於兩個特徵,如果其與其他的特徵相互獨立,則在precision matrix的相應位置,其值為0。這樣一來,可以通過資料特徵之間的相關關係,來構造一個稀疏的precision matrix,從而使得covariance matrix的計算有更好的條件基礎。這種基於資料特徵相關關係計算covariance matrix的方法也被稱為covariance selection,他以資料特徵相關關係為依據,有選擇的計算covariance。
在“當樣本量與特徵數量為同一數量級”或者‘更小的樣本數量’中,sparse inverse covariance較shrunk covariance具有更好的表現,但是,當資料集特徵之間極度相關時,sparse inverse covariance會表現出很大的不穩定性。
除此以外,sparse inverse covariance能夠還原資料集的"非對角線結構”,如下圖所示:

可通過如下function實現sparse inverse covariance:

#way1 GraphLasso用1l懲罰項來獲得稀疏矩陣,alpha越大,矩陣越稀疏
from sklearn.covariance import GraphLasso(alpha=0.01,mode='cd',tol=0.0001,enet_tol=0.0001,max_iter=100,verbose=False,assume_centered=False)
#alpha:1l 的正則化係數,值越高,正則化越多,獲得的矩陣越稀疏;
#mode{'cd','lars'}:the lasso solver to use.{coordinate descent , **LARS**}
#tol:the tolerance to delcare convergence,如果兩次迭代過程之間的差值<tol,停止迭代;
#enet_tol:The tolerance for the **elastic net** solver used to calculate the descent direction. This parameter controls the accuracy of the search direction for a given column update, not of the overall parameter estimate. Only used for mode=’cd’.
#max_iter:最大迭代次數
object = GraphLasso()
object.fit(X)
object.covariance_ #Estimated covariance matrix
object.score(X_test) #Computes the log-likelihood of a Gaussian data set with self.covariance_ as an estimator of its covariance matrix.
#way2 GraphLassoCV用cross_validation自動選擇alpha,來獲得estimated covariance matrix
from sklearn.covariance import GraphLassoCV(alpha=4,n_refinements=4,cv=None,tol=0.0001,enet_tol=0.0001,max_iter=100,mode='cd',n_jobs=1,verbose=False,assume_centered=False)
#n_refinements:the number of times the grid is refined
#cv:{None: 預設為3,int:cv folds,cv generator:產生cv,iterable:an iterable yielding train/test split}
#mode{cd,LARS},當特徵數量遠大於樣本數量時,用LARS;否則,用cd(more numerically stable)
object=GraphLassoCV()
object.fit(X)
object.covariance_ #Estimated covariance matrix.
object.score(X_test) #Computes the log-likelihood of a Gaussian data set with self.covariance_ as an estimator of its covariance matrix.

Robost Covariance Estimation

在實際中,往往由於測量錯誤,或記錄錯誤而使獲得的資料集包含一些異常點。“經驗協方差估計”和“收縮協方差估計”對於異常點的存在是非常敏感的,針對有異常點的這種情況,我們可以採用robost covariance estimator來檢測異常點,通過discard/down weight observations的方式來對資料做進一步處理。從而得到一個魯棒性更好的covariance。
Minimum covariant determinant estimator 是一個魯棒性極好的covariance 估計器。他的核心思想是,首先找出inlier(good) observations,根據這些樣本點進行“經驗協方差估計”,然後在對該協方差矩陣進行一定縮放,以補償selection of observation所帶來的影響(consistency step)。在產生Minimum covariant determinant estimator後,我們可以根據樣本點的馬氏距離,對其賦予一定權重,從而求得一個reweighting estimation of covariance matrix(reweighting step)。
值得一提的是,robost covariance estimation不僅能得到covariance,同時也能獲得樣本點的location。
robost covariance estimation可以通過下面function獲得:

from sklearn.covariance import MinCovDet(store_precision=True,assume_centered=False,support_fraction=None,random_state=None)
#support_fraction:用於應用MCD估計的樣本比例(The proportion of points to be included in the support of the raw MCD estimate. Default is None, which implies that the minimum value of support_fraction will be used within the algorithm: [n_sample + n_features + 1] / 2)
object = MinCovDet()
object.fit(X) #Fits a Minimum Covariance Determinant with the FastMCD algorithm.
object.covariance_ #Estimated robust covariance matrix
object.score(X_test) #Computes the log-likelihood of a Gaussian data set with self.covariance_ as an estimator of its covariance matrix.
#該object有很多類似的attribute,method,更多檢視文件。

下面給出outlier對於covariance,location的影響圖示:

官方文件:Covariance estimation