码迷,mamicode.com
首页 > 其他好文 > 详细

Classification and logistic regression

时间:2015-08-05 18:33:10      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:机器学习   logistic   newton迭代法   逻辑回归   线性分类   

logistic 回归

1.问题:

在上面讨论回归问题时,讨论的结果都是连续类型,但如果要求做分类呢?即讨论结果为离散型的值。

2.解答:

  • 假设:技术分享
    其中:技术分享
    g(z)的图形如下:
    技术分享
    由此可知:当hθ(x)<0.5时我们可以认为为0,反之为1,这样就变成离散型的数据了。

  • 推导迭代式:

    • 利用概率论进行推导,找出样本服从的分布类型,利用最大似然法求出相应的θ
    • 技术分享
    • 因此:技术分享
      技术分享
  • 结果:技术分享

  • 注意:这里的迭代式增量迭代法

Newton迭代法:

1.问题:

上述迭代法,收敛速度很慢,在利用最大似然法求解的时候可以运用Newton迭代法,即θ := θ?f(θ)f(θ)

2.解答:

  • 推导:

    • Newton迭代法是求θ,且f(θ)=0,刚好:l(θ)=0
    • 所以可以将Newton迭代法改写成:技术分享
  • 定义:

    • 其中:l(θ) = 技术分享
    • 技术分享
      因此:H矩阵就是l′′(θ),即H?1 = 1/l′′(θ)
    • 所以:技术分享
  • 应用:

    • 特征值比较少的情况,否则H?1的计算量是很大的

代码实现:

1.自己设定迭代次数

  自己编写相应的循环,给出迭代次数以及下降坡度alpha,进行增量梯度下降。
主要函数及功能:

  • Logistic_Regression 相当于主函数
  • gradientDecent 梯度下降更新θ函数
  • computeCost 计算损失J函数

Logistic_Regression


%%  part0: 准备
data = load(‘ex2data1.txt‘);
x = data(:,[1,2]);
y = data(:,3);
pos = find(y==1);
neg = find(y==0);

x1 = x(:,1);
x2 = x(:,2);
plot(x(pos,1),x(pos,2),‘r*‘,x(neg,1),x(neg,2),‘co‘);
pause;


%% part1: GradientDecent and compute cost of J
[m,n] = size(x);
x = [ones(m,1),x];
theta = zeros(3,1);
J = computeCost(x,y,theta);

theta = gradientDecent(x, y, theta);
X = 25:100;
Y = ( -theta(1,1) - theta(3,1)*X)/theta(2,1);
plot(x(pos,2),x(pos,3),‘r*‘,x(neg,2),x(neg,3),‘co‘, X, Y, ‘b‘);
pause;

gradientDecent

function theta = gradientDecent(x, y, theta)

%% compute GradientDecent 更新theta,利用的是增量梯度下降
m = size(x,1);
alph = 0.001;
for iter = 1:150000
    for j = 1:3
        dec = 0;
        for i = 1:m
            dec = dec + (y(i) - sigmoid(x(i,:)*theta))*x(i,j);
        end
        theta(j,1) = theta(j,1) + dec*alph/m;
    end
end
end

sigmoid

function g = sigmoid(z)

%% SIGMOID Compute sigmoid functoon

g = 1/(1+exp(-z));

end

computeCost

function J = computeCost(x, y, theta)

%% compute cost: J

m = size(x,1);
J = 0;
for i = 1:m
   J =  J + y(i)*log(sigmoid(x(i,:)*theta)) + (1 - y(i))*log(1 - sigmoid(x(i,:)*theta));
end
J = (-1/m)*J;
end

结果如下:

技术分享

技术分享

2. 利用fminunc函数:

  给出损失J的计算方式和θ的计算方式,然后调用fminunc函数计算出最优解

主要函数及功能:

  • Logistics_Regression 相当于主函数
  • computeCost给出Jθ的计算方式
  • sigmoid函数

Logistics_Regression


%%  part0: 准备
data = load(‘ex2data1.txt‘);
x = data(:,[1,2]);
y = data(:,3);
pos = find(y==1);
neg = find(y==0);

x1 = x(:,1);
x2 = x(:,2);
plot(x(pos,1),x(pos,2),‘r*‘,x(neg,1),x(neg,2),‘co‘);
pause;


%% part1: GradientDecent and compute cost of J
[m,n] = size(x);
x = [ones(m,1),x];
theta = zeros(3,1);
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)(computeCost(x,y,t)), theta, options);
X = 25:100;
Y = ( -theta(1,1) - theta(3,1)*X)/theta(2,1);
plot(x(pos,2),x(pos,3),‘r*‘,x(neg,2),x(neg,3),‘co‘, X, Y, ‘b‘);
pause;

sigmoid

function g = sigmoid(z)

%% SIGMOID Compute sigmoid functoon

g = zeros(size(z));
g = 1.0 ./ (1.0 + exp(-z));

end

computeCost

function [J,grad] = computeCost(x, y, theta)

%% compute cost: J

m = size(x,1);
grad = zeros(size(theta));
hx = sigmoid(x * theta);  
 J = (1.0/m) * sum(-y .* log(hx) - (1.0 - y) .* log(1.0 - hx));  
 grad = (1.0/m) .* x‘ * (hx - y);
end

结果

技术分享

技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。

Classification and logistic regression

标签:机器学习   logistic   newton迭代法   逻辑回归   线性分类   

原文地址:http://blog.csdn.net/neu_chenguangq/article/details/46576109

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!