matlab - MATLAB glmnet 中的逻辑回归参数有什么问题?
问题描述
我在 Macbook 上的 MATLAB 2019a 中使用glmnet进行逻辑回归。
算法:
对数(pi/(1-pi))=b0+X*b
pi=P(Y=2|X_i)=1-P(Y=1|X_i)
代码:
Y = [2;1;2;1;2;1;2;1;1;2];
X = [0.1451 0.1176 0.0872 0.0544 0.0197 -0.0164 -0.0533 -0.0907;
0.5096 0.7240 0.9038 1.0515 1.1694 1.2599 1.3253 1.3681;
-0.0593 -0.1683 -0.2738 -0.3754 -0.4730 -0.5660 -0.6543 -0.7376;
-1.0128 -0.9539 -0.9004 -0.8522 -0.8089 -0.7701 -0.7355 -0.7047;
0.7533 0.5640 0.4054 0.2752 0.1709 0.0900 0.0302 -0.0109;
0.2014 0.2595 0.3070 0.3444 0.3724 0.3918 0.4032 0.4074;
0.9174 0.8706 0.8260 0.7834 0.7423 0.7025 0.6636 0.6253;
0.7643 0.6115 0.4789 0.3653 0.2693 0.1897 0.1252 0.0744;
-0.3299 -0.5078 -0.6507 -0.7615 -0.8430 -0.8981 -0.9294 -0.9399;
-0.2141 -0.1472 -0.0818 -0.0179 0.0443 0.1045 0.1626 0.2183];
lambda=0.5;
family='binomial';
options.weights = [];
options.alpha = 1;
options.nlambda = 100;
options.lambda_min = 0;
options.lambda = lambda;
options.standardize = false;%true
options.thresh = 1E-4;
options.dfmax = 0;
options.pmax = 0;
options.exclude = [];
options.penalty_factor = [];
options.maxit = 100;
options.HessianExact = false;
options.type = 'naive';
fit = glmnet(X,Y,family,options);
结果:
a0 0
label [1;2]
beta [0;0;0;0;0;0;0;0]
dev 0
nulldev 13.8629
df 0
lambda 0.5000
npasses 1
jerr 0
dim [8,1]
class 'lognet'
无论我如何更改输入和输出,该函数总是返回全为 0 的系数。我仔细选择了这些选项,所以我真的很困惑如何得出这个结果。
是因为我选的数据特殊还是参数不对?
解决方案
我刚刚发现问题出在哪里。这里的数据很小,因此lambda=0.5
对其实施了过强的惩罚。
将 lambda 更改为小于 0.01 可以解决问题。另外,options.pmax = 0
应该删除,否则它要求所有系数为0。
推荐阅读
- blockchain - 什么是证明证明 (PoP)?
- r - 多个ggplots的for循环中的Y轴标签显示第一个数据点而不是列名R
- postgresql - PL/pgSQL“for循环”+选择基本示例(“hello world”)
- angular - “订阅”类型上不存在属性“更新”——尝试更新 Firebase 数据时
- azure - 如何在 Azure Web 应用的本地开发中通过 IConfiguration 对象读取密钥保管库机密
- google-cloud-platform - Cloud PubSub - NACKed 消息是否保留超过 7 天?
- slack - 让 Slack Bot 根据特定条件回答“是”或“否”
- jquery - 来自 Nuget 包的 Font Awesome 和来自 BundleConfig.cs 的参考
- sql - 我正在尝试创建一个查询,按商店列表列出客户进行的最大商店访问次数
- docker - 支持 Crystal Reports 的 Docker 容器