我知道解决方案,但我不明白以下等式是如何转换为代码的。
解决方案
grad = (1/m) * ((sigmoid(X * theta)-y)' * X);
答案 0 :(得分:1)
原始行J(theta)代表逻辑回归的成本函数。
您展示的代码grad = ...
是J(theta)相对于参数的渐变;也就是说,grad
是d / dtheta J(theta)的实现。导数是重要的,因为它用于梯度下降,以将参数移向其最佳值(以最小化成本J(theta))。
以下为渐变的公式,以红色标出,取自下面的第一个link。注意,J(theta)与上面的公式相同,h(x)表示sigmoid函数。
所有训练样例的总梯度需要m的总和。在上面grad
的代码中,由于省略了求和,您在一个训练示例中计算梯度;因此,您的代码可能会计算stochastic gradient descent的渐变,而非全梯度下降。
有关详细信息,您可以谷歌搜索"逻辑回归成本函数衍生物",这会导致以下链接:
这个特别具备您需要的一切:http://feature-space.com/2011/10/28/logistic-cost-function-derivative/
这些显然是Andrew Ng的课程中关于机器学习和梯度下降的逻辑回归的一些讲义:http://www.holehouse.org/mlclass/06_Logistic_Regression.html
如何逐步计算衍生物的说明:https://math.stackexchange.com/questions/477207/derivative-of-cost-function-for-logistic-regression
答案 1 :(得分:1)
如上所述,您发布的数学表达式是成本函数,而您显示的代码片段是渐变。
但是,总和并没有丢失。让我们分解吧。
使用X * theta
,您会得到一个向量,其中包含所有数据点和参数向量的点积。
使用sigmoid(X * theta)
评估每个点积的sigmoid。
使用X * theta)-y
,您会得到一个包含所有预测与实际标签之间差异的向量。
使用sigmoid(X * theta)-y)' * X
转换sigmoid评估向量并使用数据集的每个列计算其点积(即每个数据点的每个x_j)。
考虑一下,你会看到这与表达式中的总和完全相同,但是对参数向量的所有条目进行了评估,而不只是j
。