Maison > Article > base de données > coursera Machine Learning ex2
这次的作业为Logistic Regression的具体实现。 1 Logistic Regression 1.2 Implementatiion 1.2.1 Warm up 既然都说是热身了,那么也就一扫而过吧。在sigmoid.m中添加如下代码: g = 1./(1 + e.^-z); 这段代码就是sigmoid函数的具体实现,对矩阵同样适用。 1
这次的作业为Logistic Regression的具体实现。
1 Logistic Regression
1.2 Implementatiion
1.2.1 Warm up
既然都说是热身了,那么也就一扫而过吧。在sigmoid.m中添加如下代码:
g = 1./(1 + e.^-z);
这段代码就是sigmoid函数的具体实现,对矩阵同样适用。
1.2.2 Cost Function and gradient
和ex1类似,接下里就是实现代价函数和梯度下降的公式,只要注意好矩阵的操作即可,在costfunction.m中添加如下代码:
Hx = sigmoid(X * theta); J = 1/m * (-y'*log(Hx)-(1-y')*log(1-Hx)); grad = 1/m * ((Hx - y)' * X);
并无需要我们自己写的代码,只是讲解了一下如何使用octave自带的fminunc来找到使得代价函数J最小的参数θ,给出的具体代码如下:
% Set options for fminunc options = optimset('GradObj', 'on', 'MaxIter', 400); % Run fminunc to obtain the optimal theta % This function will return theta and the cost [theta, cost] = ... fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);稍微解释一下这段代码,第一句话是在设置fminunc的一些参数,把'GradObj'这个参数设置为on,这样就告诉了fminunc函数要同时返回具体的代价函数的值和梯度,也让fminunc函数在寻找最小化参数的时候可以使用梯度;后面把'MaxIter'参数设置为400,这样fminunc函数最多迭代400次。第二句话就是在具体调用fminunc函数,@(t)可以认为是将我们的代价函数作为一个参数传递了进去,t在代价函数中的位置就是theta的位置。
最后fminunc函数返回的参数构成的直线分割的效果如下:
1.2.4 Evaluating logistic regression
可以看到我们已经完成了找到那条最好的划分曲线,那么我们将如何来评价我们找到的这条曲线的好坏呢?一种方法就是用这条曲线来对所有训练集中的元组进行判断,统计其正确率,于是我们在predict.m中添加如下代码:
Hx = sigmoid(X * theta); for iter = 1:m if Hx(iter) >= 0.5 p(iter) = 1; else p(iter) = 0; end; end;这里是一个简单的循环,把结果根据阀值0.5进行二值化。
2 Regularized logistic regression
如果我们在碰到这种问题的分类的时候,只有2个参数只能用直线进行划分的话显然不好,我们就不得不增加参数,比如x1*x2以及x1^2等,增加参数虽然能够更好的划分训练集,但是也会带来过度匹配(overfitting)的问题,下面的练习就会解决这个问题。
按照之前在正规化中的介绍,将会在代价函数中添加参数本身大小的影响,从而使得参数的大小都比较接近0,修改过的公式在视频和pgf都已列出,我们需要做的就是用Matlab语言实现之。代码如下(costFunctionReg.m):
Hx = sigmoid(X * theta); J = 1/m * (-y'*log(Hx)-(1-y')*log(1-Hx)) + lambda/(2*m) * (theta(2:end)' * theta(2:end)); grad = 1/m * ((Hx - y)' * X) + lambda/m * theta'; grad(1) = grad(1) - lambda/m * theta(1);