代码和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的选取。
PS:构造训练样本时,也可以这样对Y进行取值
if x1>10
Y(i)=1;
else
Y(i)=0;
end