视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
courseraMachineLearningex2
2020-11-09 07:28:01 责编:小采
文档


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

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);

最后的效果如下:

下载本文
显示全文
专题