PRML/PRMLT项目中的二元逻辑回归实现解析
概述
本文将深入分析PRML/PRMLT项目中logitBin.m
文件的实现细节,这是一个用于二元分类的逻辑回归模型,采用牛顿-拉夫森(Newton-Raphson)优化方法进行训练。逻辑回归是机器学习中最基础且重要的分类算法之一,尽管名称中有"回归"二字,但它实际上是一种分类方法。
算法原理
逻辑回归通过sigmoid函数将线性回归的输出映射到(0,1)区间,表示样本属于正类的概率。对于二元分类问题,给定输入特征x,预测概率可以表示为:
P(y=1|x) = σ(wᵀx) = 1/(1+exp(-wᵀx))
其中w是模型参数,σ是sigmoid函数。
代码实现解析
输入参数处理
if nargin < 4
alpha = 1e-1; % 默认学习率
end
if nargin < 3
lambda = 1e-4; % 默认正则化系数
end
代码首先处理输入参数,为学习率alpha和正则化系数lambda设置默认值。正则化用于防止过拟合,学习率控制优化步长。
数据预处理
X = [X; ones(1,size(X,2))]; % 添加偏置项
[d,n] = size(X); % d:特征维度+1, n:样本数
在特征矩阵X上添加一行1,相当于为模型添加偏置项(bias term),这是线性模型中常见的做法。
初始化
tol = 1e-4; % 收敛阈值
epoch = 200; % 最大迭代次数
llh = -inf(1,epoch); % 记录对数似然
w = rand(d,1); % 随机初始化权重
设置优化过程的控制参数,包括收敛阈值、最大迭代次数,并随机初始化模型权重。
牛顿-拉夫森优化
for t = 2:epoch
a = w'*X; % 线性预测值
llh(t) = (dot(a,y)-sum(log1pexp(a))-0.5*lambda*dot(w,w))/n; % 计算对数似然
if abs(llh(t)-llh(t-1)) < tol; break; end % 检查收敛
z = sigmoid(a); % 计算sigmoid输出
g = X*(z-y)'+lambda*w; % 计算梯度
r = z.*(1-z); % 计算Hessian矩阵的对角元素
Xw = bsxfun(@times, X, sqrt(r));
H = Xw*Xw'+lambda*eye(d); % 计算Hessian矩阵
w = w-alpha*(H\g); % 更新权重
end
这是算法的核心部分,采用牛顿-拉夫森方法进行优化:
- 计算线性预测值a = wᵀX
- 计算对数似然函数值,包含正则化项
- 检查收敛条件
- 计算sigmoid输出z = σ(a)
- 计算梯度g
- 计算Hessian矩阵H
- 更新权重w
对数似然计算
对数似然函数的计算对应于PRML书中的公式4.90,并添加了L2正则化项:
llh = (aᵀy - ∑log(1+exp(a)) - 0.5λwᵀw)/n
其中a=wᵀX,y是标签向量,λ是正则化系数。
梯度计算
梯度计算对应于PRML书中的公式4.96:
g = X(z-y)ᵀ + λw
其中z是sigmoid输出,y是真实标签。
Hessian矩阵计算
Hessian矩阵计算对应于PRML书中的公式4.97:
H = XRXᵀ + λI
其中R是对角矩阵,对角线元素为z(1-z),对应于公式4.98。
技术亮点
- 数值稳定性:使用
log1pexp
函数计算log(1+exp(a)),避免了数值溢出问题。 - 正则化:实现了L2正则化,防止模型过拟合。
- 优化方法:采用牛顿-拉夫森方法,相比梯度下降法收敛更快。
- 收敛判断:基于对数似然的变化量自动判断收敛。
使用建议
- 对于高维数据,Hessian矩阵的计算和求逆可能成为性能瓶颈,可考虑使用共轭梯度法等近似方法。
- 正则化系数λ和学习率α需要根据具体问题调整,可通过交叉验证选择最优值。
- 对于大规模数据集,可考虑使用随机梯度下降(SGD)或其变种进行优化。
总结
logitBin.m
实现了一个完整的二元逻辑回归模型,采用牛顿-拉夫森优化方法,并加入了正则化项以提高模型泛化能力。该实现简洁高效,很好地体现了PRML书中相关章节的理论内容,是学习逻辑回归和优化算法的优秀示例。