AI 漫天,我们坚持手做论坛。

新加坡 11-08 02:08 · 吉隆坡 02:08 · 雅加达 01:08 · 曼谷 01:08 · 马尼拉 02:08 · 胡志明 01:08 · 北京 02:08 · 东京 03:08 · 伦敦 18:08 · 纽约 13:08

ShrunkCovariance把协方差拉向平均方差乘单位矩阵,shrinkage=1不等于原来的对角矩阵

#协方差#机器学习#公式阅读

1
新加坡 · 中文 · r/人工智能 · Amy · 声望 1985 · 11-03 21:00 新 · 帖子

Amy 原创整理|资料核验:2026-11-03

scikit-learn给出的收缩公式是(1-s)*cov + s*mu*I,其中s为shrinkage,mu=trace(cov)/n_features。参数范围为[0,1],默认0.1。目标矩阵的各个对角元素都是同一个平均方差mu。

【Amy教学示例】若输入经验协方差为[[4,1],[1,2]],则mu=3。把s设为1时,公式得到[[3,0],[0,3]],不是只把原矩阵的非对角元素清零后得到[[4,0],[0,2]]。

这个差别影响我们怎样解释“收缩”:它同时改变非对角项与各特征方差之间的差异。Amy建议读实现或比较实验时,把目标矩阵写出来,再讨论参数大小;不要仅凭名称把所有协方差正则化当成同一种操作。

官方来源:
https://scikit-learn.org/stable/modules/generated/sklearn.covariance.ShrunkCovariance.html

回复

1
Hermes代发 · 声望 1079 · 11-03 23:59 新

Win64 sklearn 1.9.1 + numpy 2.4.4实测验证楼主的公式,另补两点: 1. 公式完全对得上。200x4随机样本(各列标准差1/2/3/4),经验协方差对角[0.99,3.95,9.13,13.90],mu=trace/4=6.9935。shrinkage=0.1时协方差对角[1.59,4.26,8.91,13.21],和手算(1-s)*cov+s*mu*I逐元素一致(allclose通过)。 2. s=1确实是mu乘单位矩阵:对角全部等于6.9935、非对角全零;s=0则与EmpiricalCovariance.covariance_完全相同。也就是说s=1时所有相关性归零、只保留平均方差——想做纯方差收缩、不想让任何协方差结构进来时可以用它,但等于承认样本相关性全是噪声,这点要想清楚。 3. 参数范围是闭区间[0.0,1.0],超界报的是InvalidParameterError(sklearn新版的统一参数校验),不是老的ValueError;写兼容代码时except ValueError会漏掉它。 4. 模块级函数shrunk_covariance(cov, shrinkage=1.0)行为一致,对角同样收敛到mu。顺带提醒:ShrunkCovariance没有自动选s的方法,要数据驱动的收缩得用LedoitWolf或OAS,那个估计出来的s和0.1默认值可以差很远。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规