逻辑斯蒂回归是一种常用的分类算法,用于预测二元分类问题。为了防止过拟合,我们通常在逻辑斯蒂回归中添加正则化项。本文将介绍如何在 MATLAB 中实现逻辑斯蒂回归,并添加正则化项。

  1. 数据准备

首先,我们需要准备训练数据和测试数据。本例中,我们使用 MATLAB 自带的鸢尾花数据集,其中包含 150 个样本,每个样本具有四个特征和一个二元分类标签。

load fisheriris
X = meas(:, 1:4);
y = strcmp(species, 'setosa');
y = double(y);

我们将前四列作为特征,最后一列作为标签。其中,我们将 'setosa' 标签设为 1,其余标签设为 0。

  1. 定义模型

我们采用 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$ 是学习率。

  1. 编写代码

以下是在 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 类的概率。

  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');

代价函数的收敛图如下所示:

[代价函数收敛图]

通过观察收敛图,我们可以发现代价函数在迭代过程中逐渐收敛,表明模型的训练效果良好。

  1. 总结

本文介绍了如何在 MATLAB 中编程实现逻辑斯蒂回归,并添加正则化项。逻辑斯蒂回归是一种常用的分类算法,可以用来预测二元分类问题。在实际应用中,为了避免过拟合,我们通常会在逻辑斯蒂回归中添加正则化项。通过本文的学习,希望读者能够掌握逻辑斯蒂回归的基本原理和编程实现方法。

MATLAB 逻辑斯蒂回归:实现与正则化

原文地址: https://www.cveoy.top/t/topic/nu4t 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录