MATLAB 逻辑斯蒂回归:实现与正则化
逻辑斯蒂回归是一种常用的分类算法,用于预测二元分类问题。为了防止过拟合,我们通常在逻辑斯蒂回归中添加正则化项。本文将介绍如何在 MATLAB 中实现逻辑斯蒂回归,并添加正则化项。
- 数据准备
首先,我们需要准备训练数据和测试数据。本例中,我们使用 MATLAB 自带的鸢尾花数据集,其中包含 150 个样本,每个样本具有四个特征和一个二元分类标签。
load fisheriris
X = meas(:, 1:4);
y = strcmp(species, 'setosa');
y = double(y);
我们将前四列作为特征,最后一列作为标签。其中,我们将 'setosa' 标签设为 1,其余标签设为 0。
- 定义模型
我们采用 S 形函数作为模型的输出:
$$h_\theta(x) = \frac{1}{1 + e^{-\theta^Tx}}$$
其中,$\theta$ 是模型参数,$x$ 是样本的特征。
添加正则化项后,模型的代价函数变为:
$$J(\theta) = -\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}log(h_\theta(x^{(i)})) + (1-y^{(i)})log(1-h_\theta(x^{(i)}))] + \frac{\lambda}{2m}\sum_{j=1}^{n}\theta_j^2$$
其中,$\lambda$ 是正则化系数,$n$ 是特征数。
我们可以使用梯度下降法来最小化代价函数:
$$\theta_j = \theta_j - \alpha\frac{\partial J(\theta)}{\partial \theta_j}$$
其中,$\alpha$ 是学习率。
- 编写代码
以下是在 MATLAB 中编写逻辑斯蒂回归并添加正则化项的代码:
function [theta, J_history] = logisticRegression(X, y, lambda, alpha, num_iters)
% 初始化参数
[m, n] = size(X);
theta = zeros(n, 1);
J_history = zeros(num_iters, 1);
% 梯度下降
for iter = 1:num_iters
h = sigmoid(X * theta);
theta(1) = theta(1) - alpha * (1 / m) * sum(h - y);
theta(2:end) = theta(2:end) - alpha * ((1 / m) * sum((h - y) .* X(:,2:end), 1)' + (lambda / m) * theta(2:end));
J_history(iter) = computeCost(X, y, theta, lambda);
end
end
function J = computeCost(X, y, theta, lambda)
m = length(y);
h = sigmoid(X * theta);
J = (-1 / m) * sum(y .* log(h) + (1 - y) .* log(1 - h)) + (lambda / (2 * m)) * sum(theta(2:end).^2);
end
function g = sigmoid(z)
g = 1 ./ (1 + exp(-z));
end
我们定义了三个函数:逻辑斯蒂回归函数 logisticRegression、代价函数 computeCost 和 S 形函数 sigmoid。
在 logisticRegression 函数中,我们首先初始化参数 theta 和代价函数历史值 J_history。然后,使用梯度下降法更新 theta,并计算每次迭代后的代价函数值。更新 theta 时,我们需要对第一项进行特殊处理,对其他特征添加正则化项。
在 computeCost 函数中,我们计算每次迭代后的代价函数值。其中,第一项为逻辑斯蒂回归的代价函数,第二项为正则化项。请注意,我们不对第一项的偏置项添加正则化项。
最后,sigmoid 函数用来计算样本属于 1 类的概率。
- 运行程序
我们可以使用以下代码调用 logisticRegression 函数:
lambda = 1;
alpha = 0.01;
num_iters = 1000;
[theta, J_history] = logisticRegression(X, y, lambda, alpha, num_iters);
其中,lambda 是正则化系数,alpha 是学习率,num_iters 是迭代次数。
运行程序后,我们可以得到 theta 的值和每次迭代后的代价函数值 J_history。我们可以使用以下代码绘制代价函数的收敛图:
plot(1:num_iters, J_history, '-b', 'LineWidth', 2);
xlabel('迭代次数');
ylabel('代价 J');
代价函数的收敛图如下所示:
[代价函数收敛图]
通过观察收敛图,我们可以发现代价函数在迭代过程中逐渐收敛,表明模型的训练效果良好。
- 总结
本文介绍了如何在 MATLAB 中编程实现逻辑斯蒂回归,并添加正则化项。逻辑斯蒂回归是一种常用的分类算法,可以用来预测二元分类问题。在实际应用中,为了避免过拟合,我们通常会在逻辑斯蒂回归中添加正则化项。通过本文的学习,希望读者能够掌握逻辑斯蒂回归的基本原理和编程实现方法。
原文地址: https://www.cveoy.top/t/topic/nu4t 著作权归作者所有。请勿转载和采集!