问题描述
我正在通过在Coursera上使用Andrew Ng的机器学习来实现所有的代码,而不是用MatLab。
在编程练习3中,我以向量化的形式实现了我的正则化Logistic回归成本函数:
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
。我很困惑,因为我找不到我的成本函数有任何错误,但我相信它有一个错误。事实上,我在二进制分类的编程练习2中也使用过implemented it,它工作得很好,给出了一个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
进行从第二个元素到末尾的求和,而不是第一个。您可以在Github资源库上看到的ex2.pdf
PDF作业的第9页上验证这一点。这解释了成本膨胀的原因,因为您将偏置单位作为正则化的一部分。
因此,当计算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
这篇关于Coursera ML--在Python语言中实现正则化Logistic回归代价函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!