逻辑回归实现不收敛

数据挖掘 逻辑回归
2022-02-16 21:22:55

根据 C. Bishop 的“模式识别和机器学习”,我目前正在尝试通过迭代地重新加权 LS 来实现逻辑回归。在第一种方法中,我尝试在 C# 中实现它,我使用高斯算法来解决 eq. 4.99。对于单个功能,它给出了非常有希望(几乎完全正确)的结果,但是每当我尝试使用多个功能运行它时,我的系统矩阵就会变得奇异,并且权重不会收敛。我一开始以为这是我的实现,但当我在 SciLab 中实现它时,结果持续存在。我使用的 SciLab(由于矩阵运算符而更简洁)代码是

phi = [1; 0; 1; 1];
t = [1; 0; 0; 0];
w= [1];

w' * phi(1,:)'

for in=1:100
    y = [];
    R = zeros(size(phi,1));
    R_inv = zeros(size(phi,1));

    for i=1:size(phi,1)
        y(i) = 1/(1+ exp(-(w' * phi(i,:)')));
        R(i,i) = y(i)*(1 - y(i));
        R_inv(i,i) = 1/R(i,i);
    end

    z = phi * w - R_inv*(y - t)
    w = inv(phi'*R*phi)*phi'*R*z
end

使用 phi(输入/特征)和 t(输出/类)的值,它产生的权重为 -0.6931472,几乎是 1/3,这对我来说似乎很好,因为有 1/3 的概率被分配到第 1 类,如果存在功能 1(如果我的条款不完全符合 ML 语言,请原谅我,因为我是一名软件开发人员)。如果我现在添加一个拦截功能,这将符合

phi = [1, 1; 1, 0; 1, 1; 1, 1];
w = [1; 1];

我的 R 矩阵变成奇异的,最后的权重值为

w  =
  - 5.8151677  
  1.290D+30  

在我看来,这意味着,如果特征 1 在其余部分中出现约 3%,则属于第 1 类的概率将接近 1。我一定有任何错误,但我不知道是哪一个。对于这两种实现产生相同的结果,我怀疑有些地方我遗漏了或弄错了,但我不明白是哪一个。

1个回答

在 CrossValidated 上已经提出并回答了这个问题。请参阅https://stats.stackexchange.com/questions/11109/how-to-deal-with-perfect-separation-in-logistic-regressionhttps://stats.stackexchange.com/questions/45803/logistic-regression -in-r-resulted-in-hauck-donner-phenomenon-now-what对于两个相关的答案(还有其他相关问题可以在那里探索)。逻辑回归可能会爆炸是计算统计中的一个已知效应。

此外,在 exp(-30) 大致为您提供 double 类型的相对准确度的情况下,您需要非常小心舍入误差的累积,因为 1+exp(-30)=1:将似然贡献可能会遇到数值问题,尤其是当您开始计算数值导数和梯度时。关于统计计算中典型问题的应用问题及其容易遇到的具体问题的简要介绍,请参见http://www.stata.com/meeting/nordic-and-baltic14/abstracts/materials/dk14_gould。 .pdf _