UFLDL新版教程与编程练习(二):Logistic Regre
2019-08-06 本文已影响3人
赖子啊
UFLDL是吴恩达团队编写的较早的一门深度学习入门,里面理论加上练习的节奏非常好,每次都想快点看完理论去动手编写练习,因为他帮你打好了整个代码框架,也有详细的注释,所以我们只要实现一点核心的代码编写工作就行了,上手快!
第二节是:Logistic Regression(逻辑回归)
我们之前看过的Linear Regression(线性回归)是争对连续值预测的,但是这并不能很好地处理二分类问题,也就是的问题。我们就需要使用另外一个“hypothesis class”来预测当给了一个样本,有多少的可能性它是属于0还是属于1,其实“逻辑回归”名字上有回归二字,其实是一个分类算法。以下是要学习的函数:
其中的就是大名鼎鼎的sigmoid函数,输出介于0和1之间,所以我们也可以把理解为的概率,就是的概率。
我们要优化的目标函数是这样的,是一个二分类的交叉熵:
可以分析得到,当的时候,要减少cost的值的话,那就得让增大,即让是1的概率增大;的时候亦然。
我们可以推导出梯度的表达式和线性回归里面一样,一开始我也很惊讶,后来推了一下确实是如此的,大伙可以自己推一下,实在不明白下面留言。只是这里的hypothesis function是,不再是线性回归里面的:
向量化的写法就是:
之后也是在logistic_regression.m文件中编写好损失函数和梯度,然后分别赋给和就可以运行ex1/ex1b_logreg.m了。
这是我的代码,里面的路径自己改一下,我用的是MATLAB2016a:
function [f,g] = logistic_regression(theta, X,y)
%
% Arguments:
% theta - A column vector containing the parameter values to optimize.
% X - The examples stored in a matrix.
% X(i,j) is the i'th coordinate of the j'th example.
% y - The label for each example. y(j) is the j'th example's label.
%
m=size(X,2);
n=size(X,1);
% initialize objective value and gradient.
f = 0;
g = zeros(size(theta));
%
% TODO: Compute the objective function by looping over the dataset and summing
% up the objective values for each example. Store the result in 'f'.
%
% TODO: Compute the gradient of the objective by looping over the dataset and summing
% up the gradients (df/dtheta) for each example. Store the result in 'g'.
%
%%% MY CODE HERE %%%
h = inline('1./(1+exp(-z))');
% Calculate f
temp = zeros(1,m);
for i=1:m
for j=1:n
temp(i) = temp(i) + theta(j) * X(j,i);
end
end
h_temp = h(temp);
for i = 1:m
f = f - (y(i) * log(h_temp(i)) + (1-y(i)) * log(1-h_temp(i)));
end
% Calculate g
for j=1:n
for i=1:m
g(j) = g(j) + X(j,i) * (h_temp(i) - y(i));
end
end
运行结果:
逻辑回归(非向量化).png
有理解不到位之处,还请指出,有更好的想法,可以在下方评论交流!