用Python写的梯度上升的代码示例

以下代码实现的具体需求是使用梯度上升算法来优化逻辑回归模型的参数,以最大化似然函数。给定训练数据$x$和对应的目标变量$y$,通过迭代更新参数向量$\theta$的值,使得模型能够以最大可能性拟合训练数据。

在实现过程中,使用sigmoid函数将输入值映射到0~1之间,计算预测值,并使用交叉熵损失函数评估模型的拟合效果。同时,需要注意特征向量$x$需要包含截距项,调整学习率$\alpha$和迭代次数$num_iters$的值可以影响模型的训练结果。

以下是一个使用Python实现简单的梯度上升算法的示例代码:

import numpy as np

def gradient_ascent(x, y, alpha=0.01, num_iters=1000):
    """
    实现梯度上升算法,用于优化线性模型的参数

    参数:
    x - 特征向量(包含截距项)
    y - 目标变量
    alpha - 学习率,默认为0.01
    num_iters - 迭代次数,默认为1000

    返回:
    theta - 学习后的参数向量
    cost_history - 每次迭代计算出的损失函数值
    """
    m, n = x.shape   # m为样本数量,n为特征数量
    theta = np.zeros((n, 1))  # 初始化参数向量为0
    cost_history = []  # 记录每次迭代计算出的损失函数值

    for i in range(num_iters):
        h = sigmoid(np.dot(x, theta))  # 计算假设函数h(x)
        error = y - h  # 计算误差
        theta += alpha * np.dot(x.T, error)  # 更新参数向量
        cost = compute_cost(theta, x, y)  # 计算损失函数
        cost_history.append(cost)

    return theta, cost_history

def sigmoid(z):
    """
    实现sigmoid函数

    参数:
    z - 输入值

    返回:
    sigmoid(z)的值
    """
    return 1 / (1 + np.exp(-z))

def compute_cost(theta, x, y):
    """
    计算Logistic回归的损失函数

    参数:
    theta - 参数向量
    x - 特征向量(包含截距项)
    y - 目标变量

    返回:
    损失函数的值
    """
    m = len(y)
    h = sigmoid(np.dot(x, theta))
    cost = (-1/m) * np.sum(y*np.log(h) + (1-y)*np.log(1-h))
    return cost

使用示例:

import numpy as np

# 构造训练数据
x = np.array([
    [1, 2],
    [1, 3],
    [1, 4],
    [1, 5]
])
y = np.array([[0], [0], [1], [1]])

# 调用梯度上升算法进行训练
theta, cost_history = gradient_ascent(x, y, alpha=0.1, num_iters=100)

# 输出学习到的参数向量和损失函数的历史记录
print('Theta:', theta)
print('Cost History:', cost_history)

以上代码是一个简单的逻辑回归模型中使用梯度上升算法进行参数优化的示例。以下是对代码的说明:

  • 梯度上升算法:对于给定的初始参数向量$\theta$,将其不断通过迭代更新,每轮迭代都沿着目标函数(损失函数)的梯度方向移动一步,直到达到最大值。在逻辑回归模型中,这一最大值指的是似然函数的最大值,也就是模型参数能以最大可能性拟合训练数据。
  • sigmoid函数:sigmoid函数将输入值映射到0~1之间,它在逻辑回归中用于计算概率。sigmoid函数具体定义为$sigmoid(z) = \frac{1}{1+e^{-z}}$。
  • 计算损失函数:逻辑回归模型使用交叉熵作为损失函数,损失函数可以参考以下公式: $$ 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)}))]$$ 其中$m$为样本数量,$h_\theta(x^{(i)})$表示预测值,$y^{(i)}$为真实值。

在使用以上代码时需要注意以下几点:

  • 特征向量$x$需要包含截距项;
  • 模型的训练结果取决于学习率$\alpha$和迭代次数$num_iters$,需要根据具体情况进行调整;
  • 逻辑回归模型通常用于二分类问题,如果需要解决多分类问题,可以考虑使用softmax回归模型。