logistic回归算法及其matlib实现
一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大。如果非要使用回归算法,可以使用logistic回归。
logistic回归本质上是线性回归,只是在特征到结果的映射中多加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)作为假设函数来预测,g(z)可以将连续值映射到0和1上。
logistic回归的假设函数如下,线性回归假设函数只是θTx。
hθ(x)=g(θTx)=11+e−θTx
g(z)=11+e−z
g′(z)=ddz11+e−z=1(1+e−z)2e−z=1(1+e−z)(1−1(1+e−z))=g(z)(1−g(z))
g函数一般称作logistic函数,图像如下,z很小时,g(z)趋于0,z很大时,g(z)趋于1,z=0时,g(z)=0.5
x = linspace(-5, 5, 11)
plot(x,1./(1+exp(-x)))
logistic回归用来分类0/1问题,也就是预测结果属于0或者1的二值分类问题。这里假设了二值满足伯努利分布,也就是
P(y=1|x;θ)=hθ(x)
P(y=0|x;θ)=1−hθ(x)
可以简写成:
p(y|x;θ)=(hθ(x))y(1−hθ(x))1−y
参数的似然性:
L(θ)=p(→y|X;θ)=m∏i=1p(y(i)|x(i);θ)=m∏i=1(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)
求对数似然性:
l(θ)=logL(θ)=m∑i=1(y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))
为了使似然性最大化,类似于线性回归使用梯度下降的方法,求对数似然性对θ的偏导,即:
θ:=θ+α▽θl(θ)
因为求最大值,此时为梯度上升。
偏导数展开:
∂∂θjl(θ)=(y1g(θTx)−(1−y)11−g(θTx))∂∂θjg(θTx)=(y1g(θTx)−(1−y)11−g(θTx))g(θTx)(1−g(θTx))∂∂θjθTx=(y(1−g(θTx)−(1−y)g(θTx))xj=(y−hθ(x))xj
则:
一个采样中计算θj,随机梯度上升法
θj:=θj+α(y(i)−hθ(x(i)))x(i)j
从所有采样中计算θj,批量梯度上升法,这和我们前面推导的线性回归的梯度下降法公式是一致的。
θj:=θj+α1mm∑i=1(y(i)−hθ(x(i)))x(i)j
梯度上升法和梯度下降法是等价的,比如在上面公式推导中,可以令J(θ)=−l(θ),求导数后,得到梯度下降法的迭代公式
θj:=θj−α(hθ(x(i))−y(i))x(i)j
数据下载:
ex4x.dat 第一列 | ex4x.dat 第二列 | ex4y.dat |
成绩1分数 | 成绩2分数 | 是否被录取,1是,0否 |
和前面实现线性回归一样(http://www.cnblogs.com/mikewolf2002/p/7634571.html),我们也可以用矩阵来实现批量梯度上升法(或下降法)的迭代求解。
θj:=θj+α1mm∑i=1(y(i)−hθ(x(i)))x(i)j
对上面的公式,可以转化为矩阵,在matlib中,大致如下:A=θTx,其中,x是m×(n+1)维矩阵,m是样本数,n是特征数目,x中我们额外增加了1列,以便和θ0对应。
θ是(n+1)×1矩阵,则A为是m×1矩阵,然后x的转置再点乘以(g(A)−y)得到梯度,最后乘以学习率α×1m,其中g表示logistic函数。
A = x*theta; grad = (1/m).* x' * (g(A) - y);%求出梯度 theta = theta - alpha .* grad;%更新theta
代码:

clear all; close all; clc x = load('ex4x.dat'); y = load('ex4y.dat'); [m, n] = size(x); x = [ones(m, 1), x]; % 输入特征增加一列,x0=1 figure pos = find(y); neg = find(y == 0);%find是找到的一个向量,其结果是find函数括号值为真时的值的行号 plot(x(pos, 2), x(pos,3), '+') hold on plot(x(neg, 2), x(neg, 3), 'o') hold on xlabel('Exam 1 score') ylabel('Exam 2 score') theta = zeros(n+1, 1);%初始化theta值 g = inline('1.0 ./ (1.0 + exp(-z))'); %定义logistic函数 MAX_ITR = 605000;%最大迭代数目 alpha = 0.1; %学习率 i = 0; while(i<MAX_ITR) A = x*theta; grad = (1/m).* x' * (g(A) - y);%求出梯度 theta = theta - alpha .* grad;%更新theta if(i>2) delta = old_theta-theta; delta_v = delta.*delta; if(delta_v<0.0000001)%如果两次theta的内积变化很小,退出迭代 break; end %delta_v end old_theta = theta; %theta i=i+1; end i old_theta theta %theta=[-16.378;0.1483;0.1589]; prob = g([1, 80, 80]*theta) plot_x = [min(x(:,2))-2, max(x(:,2))+2]; % 画出概率g(theta^Tx)=0.5的分界线,解出对应的theta值 plot_y = (-1./theta(3)).*(theta(2).*plot_x +theta(1)); plot(plot_x, plot_y) legend('Admitted', 'Not admitted', 'Decision Boundary')
我们也可以用牛顿迭代法实现logistica回归。牛顿迭代法原理见:http://www.cnblogs.com/mikewolf2002/p/7642989.html
我们要求l′(θ)=0时候的偏导数,换成牛顿迭代公式则为:
θ:=θ−l′(θ)l″(θ)
θ:=θ−H−1▽θl(θ)
其中▽θl(θ)为目标函数的梯度。H为Hessian矩阵,规模是n×n,n是特征的数量,它的每个元素表示一个二阶导数。
上述公式的意义就是,用一个一阶导数的向量乘以一个二阶导数矩阵的逆。优点:若特征数和样本数合理,牛顿方法的迭代次数比梯度上升要少得多。缺点:每次迭代都要重新计算Hessian矩阵,如果特征很多,则H矩阵计算代价很大。
Hij=∂2l(θ)∂θi∂θj
H=XT[g(x1)⋅[1−g(x1)]0⋯00g(x2)⋅[1−g(x2)]⋯0⋮⋮⋱⋮00⋯g(xm)⋅[1−g(xm)]]X
推导看这儿:牛顿法解机器学习中的Logistic回归
代码:
clear all; close all; clc
x = load('ex4x.dat');
y = load('ex4y.dat');
[m, n] = size(x);
x = [ones(m, 1), x]; % 输入特征增加一列,x0=1
figure
pos = find(y); neg = find(y == 0);%find是找到的一个向量,其结果是find函数括号值为真时的值的行号
plot(x(pos, 2), x(pos,3), '+')
hold on
plot(x(neg, 2), x(neg, 3), 'o')
hold on
xlabel('Exam 1 score')
ylabel('Exam 2 score')
theta = zeros(n+1, 1);%初始化theta值
g = inline('1.0 ./ (1.0 + exp(-z))'); %定义logistic函数
% Newton's method
MAX_ITR = 7;
J = zeros(MAX_ITR, 1);
for i = 1:MAX_ITR
% Calculate the hypothesis function
z = x * theta;
h = g(z);%转换成logistic函数
% Calculate gradient and hessian.
% The formulas below are equivalent to the summation formulas
% given in the lecture videos.
grad = (1/m).*x' * (h-y);%梯度的矢量表示法
%diag(h),返回向量h为对角线元素的方阵
H = (1/m).*x' * diag(h) * diag(1-h) * x;%hessian矩阵的矢量表示法
% Calculate J (for testing convergence)
J(i) =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h));%损失函数的矢量表示法
theta = theta - H\grad;%H\逆矩阵
end
% Display theta
theta
% Calculate the probability that a student with
% Score 20 on exam 1 and score 80 on exam 2
% will not be admitted
prob = 1 - g([1, 20, 80]*theta)
%画出分界面
% Plot Newton's method result
% Only need 2 points to define a line, so choose two endpoints
plot_x = [min(x(:,2))-2, max(x(:,2))+2];
% 画出概率g(theta^Tx)=0.5的分界线,解出对应的theta值
plot_y = (-1./theta(3)).*(theta(2).*plot_x +theta(1));
plot(plot_x, plot_y)
legend('Admitted', 'Not admitted', 'Decision Boundary')
hold off
% Plot J
figure
plot(0:MAX_ITR-1, J, 'o--', 'MarkerFaceColor', 'r', 'MarkerSize', 8)
xlabel('Iteration'); ylabel('J')
% Display J
J
View Code

clear all; close all; clc x = load('ex4x.dat'); y = load('ex4y.dat'); [m, n] = size(x); x = [ones(m, 1), x]; % 输入特征增加一列,x0=1 figure pos = find(y); neg = find(y == 0);%find是找到的一个向量,其结果是find函数括号值为真时的值的行号 plot(x(pos, 2), x(pos,3), '+') hold on plot(x(neg, 2), x(neg, 3), 'o') hold on xlabel('Exam 1 score') ylabel('Exam 2 score') theta = zeros(n+1, 1);%初始化theta值 g = inline('1.0 ./ (1.0 + exp(-z))'); %定义logistic函数 % Newton's method MAX_ITR = 7; J = zeros(MAX_ITR, 1); for i = 1:MAX_ITR % Calculate the hypothesis function z = x * theta; h = g(z);%转换成logistic函数 % Calculate gradient and hessian. % The formulas below are equivalent to the summation formulas % given in the lecture videos. grad = (1/m).*x' * (h-y);%梯度的矢量表示法 %diag(h),返回向量h为对角线元素的方阵 H = (1/m).*x' * diag(h) * diag(1-h) * x;%hessian矩阵的矢量表示法 % Calculate J (for testing convergence) J(i) =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h));%损失函数的矢量表示法 theta = theta - H\grad;%H\逆矩阵 end % Display theta theta % Calculate the probability that a student with % Score 20 on exam 1 and score 80 on exam 2 % will not be admitted prob = 1 - g([1, 20, 80]*theta) %画出分界面 % Plot Newton's method result % Only need 2 points to define a line, so choose two endpoints plot_x = [min(x(:,2))-2, max(x(:,2))+2]; % 画出概率g(theta^Tx)=0.5的分界线,解出对应的theta值 plot_y = (-1./theta(3)).*(theta(2).*plot_x +theta(1)); plot(plot_x, plot_y) legend('Admitted', 'Not admitted', 'Decision Boundary') hold off % Plot J figure plot(0:MAX_ITR-1, J, 'o--', 'MarkerFaceColor', 'r', 'MarkerSize', 8) xlabel('Iteration'); ylabel('J') % Display J J
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程