您的位置:首页 > 其它

机器学习(4)——logistic regression

2015-07-24 16:49 459 查看

【一、逻辑回归模型】

逻辑回归不同于线性回归,它实际上一种分类方法,用于二分类问题(y=0或者1)。逻辑回归模型如下:



即当

>=0.5时,预测输出值y=1;否则预测输出值y=0;且有:



【二、决策边界】

所谓Decision Boundary就是能够将所有数据点进行很好地分类的h(x)边界。

例1



由图可知:



对应的线性回归模型为:



决策边界为粉色直线:



【例2】



由图可知:



对应的线性回归模型为:



决策边界为粉色曲线:



【三、代价函数】





代价函数 J(θ)的推导如下:

对于每个样本:



于是似然函数为:



则对数似然函数为:



那么代价函数J(θ)取为

,即



因为最大似然估计是求使l(θ)最大的θ,那么这个θ也是使代价函数J(θ)最小的θ。

【四、梯度下降法求最佳theta】



其中α为学习率。

偏导的推导过程如下:



将偏导代入:



【五、利用matlab自带优化函数求最佳theta】

除了gradient descent 方法之外,我们还有很多方法可以使用,如下图所示,左边是另外三种方法,右边是这三种方法共同的优缺点,无需选择学习率α,更快,但是更复杂。



matlab中已经帮我们实现好了一些优化参数θ的方法,那么这里我们需要完成的事情只是写好cost function,并告诉系统,要用哪个方法进行最优化参数。比如我们用‘GradObj’, Use the GradObj option to specify that FUN also returns a second output argument G that is the partial derivatives of the function df/dX, at the point

伪代码:



cost function具体实现如下:

function [J, grad] = costFunction(theta, X, y)
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta));

J=-sum(y.*(log(sigmoid(X*theta)))+(1.0-y).*(log(1.0-sigmoid(X*theta))))/m;

for j=1:size(theta)
grad(j)=sum((sigmoid(X*theta)-y).*X(:,j))/m;
end

=============================================================

end


%  Set options for fminunc
options = optimset('GradObj', 'on', 'MaxIter', 400);

%  Run fminunc to obtain the optimal theta
[theta, cost]=fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);


【六、使用逻辑回归解多类问题】



即对于一个输入样本x,获得最大hθ(x)的类就是x所分到的类。



对于每一个类,训练得到相对应的一组theta

function [all_theta] = oneVsAll(X, y, num_labels, lambda)
%ONEVSALL trains multiple logistic regression classifiers and returns all
%the classifiers in a matrix all_theta, where the i-th row of all_theta
%corresponds to the classifier for label i

m = size(X, 1);
n = size(X, 2);
all_theta = zeros(num_labels, n + 1);
% Add ones to the X data matrix
X = [ones(m, 1) X];

% ====================== YOUR CODE HERE ======================

initial_theta = zeros(n + 1, 1);
options = optimset('GradObj', 'on', 'MaxIter', 50);
for i=1:num_labels
theta=fmincg (@(t)(lrCostFunction(t, X, (y == i), lambda)), initial_theta, options);
all_theta (i,:)=theta';
end

% =========================================================================
end


那么对于未知样本x,分别计算每一类的相应输出,最大输出的哪一类即为x所属的类

function p = predictOneVsAll(all_theta, X)
%PREDICT Predict the label for a trained one-vs-all classifier. The labels
%are in the range 1..K, where K = size(all_theta, 1).

m = size(X, 1);
num_labels = size(all_theta, 1);

% You need to return the following variables correctly
p = zeros(size(X, 1), 1);

% Add ones to the X data matrix
X = [ones(m, 1) X];

% ====================== YOUR CODE HERE ======================
% Instructions: Complete the following code to make predictions using
%               your learned logistic regression parameters (one-vs-all).
%               You should set p to a vector of predictions (from 1 to
%               num_labels).
%

all_predict=sigmoid(all_theta*X');
[C,I]=max(all_predict);
p=I';

% =========================================================================

end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: