随机梯度上升算法的过程

随机梯度上升算法是一种基于梯度优化的算法,用于求解逻辑回归模型的参数。与常规的批量梯度上升算法不同,随机梯度上升算法每次只使用一个样本来更新模型的参数,从而可以在较短时间内获得较好的模型性能。

以下是随机梯度上升算法的具体实现过程:

  1. 初始化参数向量$\theta$;
  2. 对样本集中的每个样本进行迭代,直到达到指定的迭代次数或者收敛:
    • 选择一个样本$x^{(i)}$和对应的目标变量$y^{(i)}$;
    • 计算预测值$h_\theta(x^{(i)})$;
    • 计算误差$y^{(i)} - h_\theta(x^{(i)})$;
    • 更新参数向量$\theta_j := \theta_j + \alpha(y^{(i)} - h_\theta(x^{(i)}))x_j^{(i)}$,其中$j$表示参数向量$\theta$的索引,$\alpha$为学习率;
  3. 返回最终更新后的参数向量$\theta$。

需要注意的是,在使用随机梯度上升算法时,样本集需要进行随机化处理,以避免数据顺序对模型训练结果造成影响。同时,学习率$\alpha$和迭代次数$num_iters$的设置也需要进行适当的调节,以获得最佳的模型性能。

import numpy as np

def sigmoid(z):
    """
    定义sigmoid函数
    """
    return 1 / (1 + np.exp(-z))

def stoc_grad_ascent(x, y, alpha=0.01, num_iters=100):
    """
    实现随机梯度上升算法,用于优化逻辑回归模型的参数

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

    返回:
    theta - 学习后的参数向量
    """
    m, n = x.shape   # m为样本数量,n为特征数量(包括截距项)
    theta = np.zeros((n, 1))  # 初始化参数向量为0

    for i in range(num_iters):
        for j in range(m):
            rand_idx = np.random.randint(0, m)  # 随机选择一个训练样本
            h = sigmoid(np.sum(x[rand_idx] * theta))  # 计算预测值
            error = y[rand_idx] - h  # 计算误差
            theta += alpha * error * x[rand_idx].reshape(n, 1)  # 更新参数向量

    return theta

在以上代码中,我们使用随机化的方式选择样本并更新模型参数。每次迭代时,从样本集中随机选择一个样本$x^{(i)}$和对应的目标变量$y^{(i)}$,然后根据当前的参数向量$\theta$计算预测值$h_\theta(x^{(i)})$和误差$y^{(i)} - h_\theta(x^{(i)})$,最后通过更新参数向量来优化模型。重复执行上述步骤直到达到指定的迭代次数或者收敛。