关闭

coursera Machine Learning ex2

标签: courseramachine learning
2416人阅读 评论(0) 收藏 举报
分类:

这次的作业为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);

1.2.3 Learning paramters using fminunc

并无需要我们自己写的代码,只是讲解了一下如何使用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);

最后的效果如下:


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9574次
    • 积分:164
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档