根据 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。我一定有任何错误,但我不知道是哪一个。对于这两种实现产生相同的结果,我怀疑有些地方我遗漏了或弄错了,但我不明白是哪一个。