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.

参考博文:
elastic net及机器学习正则化
机器学习算法与python实践:弹性网络(elastic net)
LARS算法

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sarah ฅʕ•̫͡•ʔฅ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值