斯坦福机器学习3之Logistic建模

代码和word版笔记下载地址:
http://download.csdn.net/detail/misscoder/9381035
一:模型引入
对于分类问题,最终预测值是离散的,线性回归不能很好地对这类问题进行建模。Logistic模型是对于y∈{0,1}分类问题的可靠模型,其可靠性在GLM理论中得到验证和说明。
二:模型说明
1)该模型不是直接对变量x对应的类别号进行预测,而是对其属于类别1的概率进行预测。显然,如果这个概率大于0.5,我们则可以认为x属于类别1,否则属于类别0。
2)模型参数的求解方法是,从概率的角度出发,寻找参数θ使得概率P(y ⃗|X;θ)最大,其中[X( y) ⃗]是训练样本,即使得训练样本的预测类别刚好是其实际类别的概率最大,即所谓的极大似然性。最后基于梯度上升法求解极大似然性
三:算法步骤
遍历样本,在每个样本处重复下述步骤直到算法收敛:
1:沿梯度上升方向更新参数theta
2:计算此参数下的评价函数Jtheta
3: 判断此样本处算法是否收敛。若是,停止迭代;否则,遍历下一个样本
四:MATLAB实现代码
1、算法实现核心函数

% Function: 使用随机梯度上升法基于极大似然性求解logistic回归模型 
% Create Time:2015/12/27
% Parameter:
%   tX--训练样本输入
%   tY--训练样本输出
%   x --输入变量
%   t --步长
% Steps:
%遍历样本,在每个样本处重复下述步骤直到算法收敛
%   1:沿梯度上升方向更新参数theta
%   2:计算此参数下的评价函数Jtheta
%   3: 判断此样本处算法是否收敛。若是,停止迭代;否则,遍历下一个样本
function [ y mytheta ] = LogisticR( tX,tY,x,t )
%UNTITLED 此处显示有关此函数的摘要
%   此处显示详细说明
%% 一:准备工作
m = size(tX,1);
n = size(tX,2);
tX_0 = ones(m,1);
tX = [tX_0 tX];
theta = zeros(n+1,1);
Jtheta = 0;

%% 二:logistic 回归建模
for i = 1:1:m           %遍历样本
%   1:沿梯度上升方向更新此样本处参数theta
    OldTheta = theta;
    for j = 1:1:n+1
        theta(j)=theta(j)+t*(tY(i)-LogisticR_h(tX(i,:),OldTheta)*tX(i,j));
    end
%   2:计算此样本在该参数下的评价函数Jtheta
    OldJtheta = Jtheta;
    Jtheta = LogisticR_J(tX,tY,theta);
%   3: 判断此样本处算法是否收敛。若是,停止迭代;否则,遍历下一个样本
    if abs((Jtheta - OldJtheta)/OldJtheta)<0.001
        i
        break;
    end
end
%% 三:logistic 预测
if nargout == 1
    y =LogisticR_h(theta,[1 x]);
end
if nargout == 2
    y =LogisticR_h(theta,[1 x]);
    mytheta =theta;
end

end

2、算法实现相关函数

function y = LogisticR_h(x,theta)
%   此处x与theta均是n+1向量,所以预测时注意对输入变量添加值为1的首个特征
    y = (1+exp(-1*dot(x,theta)))^-1;
end
function J = LogisticR_J(tX,tY,theta)
    J=0;
    for i = 1:1:size(tX,1)
        J = J +(LogisticR_h(tX(i,:),theta)-tY(i))^2/2;
    end
end

3、算法测试函数

% Function: 测试使用随机梯度上升法基于极大似然性求解logistic回归模型[ y LogisticR_theta ] = LogisticR( tX,tY,x,t )
% Create Time:2015/12/27
% % Parameter:


clc;
clear all;
close all;

% 1 构造样本矩阵和参数矩阵框架
m = 50;
n = 1;
X = zeros(m,n);
Y = zeros(m,1);
theta = [0.3 0.5];%实际模型参数

% 2 完成样本矩阵和参数矩阵构建
for i=1:1:m
    x1 = randi([-20 20],1,1);%r = randi([iMin,iMax],m,n)
    %x1 = 10*randn(1);
    X(i,:) = x1;
    Y(i)=LogisticR_h([1 x1],theta)+0.01*randn(1,1);

end
% 3 基于训练样本构建时选择的具体模型求取x的实际值
x = 3;
real_x = LogisticR_h([1 x ],theta)
% 4 建模并预测x
t = 0.1;
[predict_x,h_theta]=LogisticR(X,Y,t,x);

% 4 作图反映建模结果
% 4_1 描述训练样本
C = sortrows([X,Y]);%排序以方便后续绘图
figure; hold on; 
plot(C(:,1),C(:,2),'rx','linewidth',5);
% 4_2 使用线性回归模型预测各个样本
pm = size(C,1);%预测变量的个数
pC = zeros(pm,1);%存储各个变量的预测值
for ip = 1:1:pm
    pC(ip) = laNormalEquations(X,Y,C(ip,1));
end
plot(C(:,1),pC,'g','linewidth',5);
% 4_3 使用Logistic回归模型预测各个样本,并对模型波形参数进行探讨

pix = zeros(pm,1);
for ix = 1:1:pm;%第二层对样本中的每一个输入变量进行预测
   x = C(ix,1);
   pix(ix)=LogisticR(X,Y,x,t);
end
plot(C(:,1),pix,'b','linewidth',5 );

legend('训练样本','线性模型','Logistic模型');

五:实验现象
实验结果如下图,Logistic回归建模时注意梯度上升的步长t的选取。
Logistic回归效果图

PS:构造训练样本时,也可以这样对Y进行取值

    if x1>10
        Y(i)=1;
    else
        Y(i)=0;
    end

猜你喜欢

转载自blog.csdn.net/MissCoder/article/details/50414811