likes
comments
collection
share

机器学习基础-监督学习-逻辑回归之多元逻辑回归

作者站长头像
站长
· 阅读数 8

多元逻辑回归是逻辑回归在多类分类问题上的扩展。在多元逻辑回归中,我们通过使用 softmax 函数将输入特征映射到多个类别的概率分布。

假设我们有 m 个训练样本,每个样本有 n 个特征,共有 K 个类别。我们用 X 表示一个 m × n 的矩阵,其中每一行表示一个样本的特征向量,用 Y 表示一个 m × K 的矩阵,其中每一行表示一个样本的类别标签。

对于每个样本 i,我们引入一个 K 维的权重向量 W,其中第 k 个元素表示样本 i 属于类别 k 的概率。我们的目标是找到最优的权重向量 W 来最大化训练样本的似然函数。

多元逻辑回归模型的假设函数为:

hθ(x)=softmax(θTx)h_\theta(x) = \text{softmax}(\theta^Tx)hθ(x)=softmax(θTx)

其中,θ\thetaθ 是一个 (n+1) × K 的参数矩阵,包含了每个特征对于每个类别的权重。x 是一个 (n+1) 维特征向量,其中第一个元素固定为 1,以对应偏置项。

softmax 函数定义如下:

softmax(zi)=e≈i∑k=1Ke≈k\text{softmax}(z_i) = \frac{e^{\approx i}}{\sum_{k=1}^{K}e^{\approx k}}softmax(zi)=k=1Kekei

其中,ziz_{i}zi 表示样本属于类别 i 的得分。

我们的目标是最大化似然函数,可以使用最大似然估计或交叉熵损失函数来求解参数。

代码示例(使用 Python 和 NumPy):

import numpy as np

def softmax(z):
    # 避免数值溢出,减去最大值
    e_z = np.exp(z - np.max(z, axis=1, keepdims=True))
    return e_z / np.sum(e_z, axis=1, keepdims=True)

def multiclass_logistic_regression(X, Y, learning_rate, num_iterations):
    m, n = X.shape
    K = Y.shape[1]

    # 添加偏置项
    X = np.hstack((np.ones((m, 1)), X))

    # 初始化参数
    theta = np.zeros((n + 1, K))

    # 梯度下降迭代更新参数
    for i in range(num_iterations):
        # 计算模型预测值
        h = softmax(np.dot(X, theta))

        # 计算损失函数的梯度
        grad = np.dot(X.T, (h - Y))

        # 更新参数
        theta -= learning_rate * grad

    return theta

# 示例用法
X = np.array([[2.5, 3.0],
              [1.5, 2.2],
              [3.5, 2.5],
              [3.0, 3.5],
              [2.0, 2.5]
              [2.8, 2.1],
              [3.2, 3.0]])
Y = np.array([[1, 0, 0],  # 样本1属于类别1
              [1, 0, 0],  # 样本2属于类别1
              [0, 1, 0],  # 样本3属于类别2
              [0, 1, 0],  # 样本4属于类别2
              [0, 0, 1],  # 样本5属于类别3
              [0, 0, 1]]) # 样本6属于类别3

learning_rate = 0.1
num_iterations = 1000

theta = multiclass_logistic_regression(X, Y, learning_rate, num_iterations)
print("Optimal parameters:")
print(theta)

在上面的代码中,我们首先定义了一个简单的样本集合 X 和对应的类别标签 Y。然后,我们选择了学习率和迭代次数,并调用 multiclass_logistic_regression 函数来训练模型并获得最优的参数矩阵 theta。最后,打印输出最优参数。

请注意,这只是一个简单的示例,实际应用中可能需要更复杂的特征工程和模型选择来取得更好的结果。

以下是代码的扩展,其中包括预测和评估步骤:

def predict(X, theta):
    m, n = X.shape
    X = np.hstack((np.ones((m, 1)), X))
    h = softmax(np.dot(X, theta))
    return np.argmax(h, axis=1)

def accuracy(y_pred, y_true):
    return np.mean(y_pred == y_true) * 100

# 预测
X_test = np.array([[1.8, 2.5],
                   [3.6, 2.0],
                   [2.7, 3.2]])

y_true = np.array([0, 1, 2])  # 真实标签

# 使用训练得到的参数进行预测
y_pred = predict(X_test, theta)
print("Predicted labels:", y_pred)
print("True labels:     ", y_true)
print("Accuracy:        ", accuracy(y_pred, y_true), "%")

在上面的代码中,我们定义了两个辅助函数:predict 用于根据训练得到的参数进行预测,accuracy 用于计算预测的准确率。

在示例中,我们使用了一个测试集 X_test,并将其传入 predict 函数,得到预测的类别标签 y_pred。然后,我们将真实标签 y_true 与预测标签进行比较,并计算准确率。

请注意,以上代码仅作为示例,实际应用中可能需要更多的数据预处理、交叉验证和模型调优来获取更可靠和准确的结果。

转载自:https://juejin.cn/post/7249913673216589882
评论
请登录