gpt4 book ai didi

python - Coursera ML - 在 python 中实现正则化逻辑回归成本函数

转载 作者:行者123 更新时间:2023-11-30 08:54:05 24 4
gpt4 key购买 nike

我正在 Coursera 上学习 Andrew Ng 的机器学习,方法是使用 Python 而不是 MATLAB 实现所有代码。

在编程练习 3 中,我以向量化形式实现了正则化逻辑回归成本函数:

def compute_cost_regularized(theta, X, y, lda):
reg =lda/(2*len(y)) * np.sum(theta**2)
return 1/len(y) * np.sum(-y @ np.log(sigmoid(X@theta))
- (1-y) @ np.log(1-sigmoid(X@theta))) + reg

在以下测试输入上:

theta_test = np.array([-2,-1,1,2])
X_test = np.concatenate((np.ones((5,1)),
np.fromiter((x/10 for x in range(1,16)), float).reshape((3,5)).T), axis = 1)
y_test = np.array([1,0,1,0,1])
lambda_test = 3

上述成本函数输出3.734819396109744。但是,根据提供给我们的 MATLAB 框架代码,正确的输出应该是 2.534819。我很困惑,因为我找不到我的成本函数有任何问题,但我相信它有一个错误。其实我也implemented it在编程练习 2 中的二元分类情况下,它工作得很好,给出了 result close to the expected value

我认为原因之一可能是我错误地构建了 *_test 输入数组,这是基于对所提供的 MATLAB 框架代码的误解,这些代码是:

theta_t = [-2; -1; 1; 2];
X_t = [ones(5,1) reshape(1:15,5,3)/10];
y_t = ([1;0;1;0;1] >= 0.5);
lambda_t = 3;

但是,我通过 Octave 解释器运行了它们,看看它们到底是什么,并确保我可以在 python 中完全匹配它们。

此外,使用我自己的矢量化和正则化梯度函数基于这些输入计算梯度也是正确的。最后,我决定继续计算并检查预测结果。我的预测准确度远低于预期准确度,因此更有理由怀疑我的成本函数出了问题,导致其他一切都错了。

请帮忙!谢谢。

最佳答案

如果您还记得正则化,那么您没有正则化偏差系数。您不仅在执行梯度下降时将梯度设置为零,而且不将其包含在成本函数中。您在将此作为总和的一部分包含在内时犯了一个小错误(请参阅您链接的笔记本上的单元格 #18 - 总和应从 j = 1 开始,但您将其作为 j = 0 )。因此,您需要从第二个元素到 theta 的末尾求和。 ,不是第一个。您可以在ex2.pdf的第9页验证这一点。您的 Github 存储库上可以看到 PDF 作业。这解释了当您将偏差单元作为正则化的一部分时,成本会膨胀。

因此,在reg中计算正则化时,索引theta这样您就可以从第二个元素开始:

def compute_cost_regularized(theta, X, y, lda):
reg =lda/(2*len(y)) * np.sum(theta[1:]**2) # Change here
return 1/len(y) * np.sum(-y @ np.log(sigmoid(X@theta))
- (1-y) @ np.log(1-sigmoid(X@theta))) + reg

完成此操作后,定义您的测试值并定义您的 sigmoid函数,我得到了您期望的正确答案:

In [8]: def compute_cost_regularized(theta, X, y, lda):
...: reg =lda/(2*len(y)) * np.sum(theta[1:]**2)
...: return 1/len(y) * np.sum(-y @ np.log(sigmoid(X@theta))
...: - (1-y) @ np.log(1-sigmoid(X@theta))) + reg
...:

In [9]: def sigmoid(z):
...: return 1 / (1 + np.exp(-z))
...:

In [10]: theta_test = np.array([-2,-1,1,2])
...: X_test = np.concatenate((np.ones((5,1)),
...: np.fromiter((x/10 for x in range(1,16)), float).reshape((3,5)).T), axis = 1)
...: y_test = np.array([1,0,1,0,1])
...: lambda_test = 3
...:

In [11]: compute_cost_regularized(theta_test, X_test, y_test, lambda_test)
Out[11]: 2.5348193961097438

关于python - Coursera ML - 在 python 中实现正则化逻辑回归成本函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44753116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com