逻辑回归算法无法工作

数据挖掘 机器学习 逻辑回归 梯度下降 成本函数
2022-02-24 07:08:22

我正在尝试使用 Andrew NG 使用 Octave 的机器学习来编写我自己的逻辑回归算法。讲座。所以我所做的是制作一个 csv 文件,第一行是一些参数,第二行是结果:

121,1
124,0
97,0
104,0
110,0
...

总的来说只有 24 个例子,但我选择了一些可以遵循某些模式的点。

这是我的代码:

data = load('data.dat');
x = data(:, 1);

y = data(:, 2)
m = length(y);

#plot(x, y, 'rx', 'MarkerSize', 10);
#xlabel('IQ');
#ylabel('Pass/Fail');
#title('Logistic Regression');

x = [ones(size(x, 1), 1) x];
alpha = 0.00001;
i = 15000;

g = inline("1 ./ (1 + exp(-z))")

theta = zeros(size(x(1, :)))';
j = zeros(i, 1);

for num = 1:i
  z = x * theta;
  h = g(z);
  j = (1./m) * ( -y' * log( h ) - ( 1 - y' ) * log ( 1 - h))
  grad = 1./m * x' * (h - y);
  theta = theta - alpha * grad;
end

然而,sigmoid 函数的输出显示每个值都低于 0.5……这肯定是错误的。我也尝试过不同的学习率和迭代,但无济于事。代码或数据有什么问题?

帮助将不胜感激。

2个回答

考虑到您正在执行向量操作,请将您的成本函数更改为以下内容:

(1 / m) * sum(((-y) .* (log(h)) - ((1 - y) .* log((1-h)))));

和你的渐变到以下:

grad = (1./m) * (x' * (h - y))

虽然后者只是为了优先安抚。


根据聊天中的讨论,虽然代码计算成本的方式错误,但成本没有下降的原因是数据不是线性可分的。逻辑回归是一种简单的算法,可以成功地对线性可分数据进行分类。看看这里

一般来说,调用 sigmoid 的输出在下面没有任何问题0.5sigmoid 所做的只是将数据“压缩”到与概率值一致的紧密范围内(必须介于01) 在下一步拟合模型之前。

现在,如果您说值无法收敛,或者在迭代期间卡在某个较小的值上,那么我猜想您的损失/成本/误差函数、其梯度和相关数量的实现中存在错误。

您绝对应该在这一行中将矩阵*运算更新为逐元素: .*

j = (1./m) * ( -y' * log( h ) - ( 1 - y' ) * log ( 1 - h))

另外,我对以下等式中的加号和减号有点怀疑。您应该根据原始数学方程仔细检查它们以确保,因为我认为这些符号看起来并不完全正确:

j = (1./m) * ( -y' * log( h ) - ( 1 - y' ) * log ( 1 - h))
grad = 1./m * x' * (h - y);