python 代码中线性回归的梯度下降

gradient descent for linear regression in python code

def computeCost(X, y, theta):
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))

def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    params = int(theta.ravel().shape[1]) #flattens
    cost = np.zeros(iters)

    for i in range(iters):
        err = (X * theta.T) - y

        for j in range(params):
            term = np.multiply(err, X[:,j])
            temp[0, j] = theta[0, j] - ((alpha / len(X)) * np.sum(term))

        theta = temp
        cost[i] = computeCost(X, y, theta)

    return theta, cost

这是我在教程中找到的线性回归成本函数和梯度下降的代码,但我不太清楚它是如何工作的。

首先我了解了 computeCost 代码是如何工作的,因为它只是 (1/2M),其中 M 是数据的数量。

对于 gradientDescent 代码,我只是不明白它一般是如何工作的。我知道更新 theta 的公式类似于

theta = theta - (learningRate) * derivative of J(cost function)。但我不确定 alpha / len(X)) * np.sum(term) 这来自更新 temp[0,j].

请帮我理解!

如果你不是像 ((alpha / len(X)) * np.sum(term)) 这样写,而是像 (alpha * (np.sum(term) / len(X))) 这样写,你可以这样做,因为乘法和除法是可交换的(如果我没记错的话)那么你只需将 alpha 乘以平均误差,因为 term 无论如何都是长度 X。

这意味着你减去学习率 (alpha) 乘以平均误差,它类似于 X[j] * tetha (actual) - y (ideal) ,顺便说一下,它也足够接近 ( X*tetha - y)^2

我会为您分解。所以在你的 gradientDescent 函数中,你正在接受预测变量(X),目标变量(y), 权重矩阵(theta)和另外两个参数(alphaiters),它们是训练参数。该功能的工作是弄清楚应该有多少 预测变量 (X) 集中的每一列应在相加之前乘以得到目标变量 (y) 的预测值。 在函数的第一行中,您将一个名为 temp 的权重矩阵初始化为零。这基本上是 函数最终输出的最终权重矩阵(theta)。 params 变量基本上是权重数或预测变量数。 在创建特征抽象的神经网络上下文中,这条线更有意义。

在线性回归中,权重矩阵大多是一维数组。在典型的前馈神经网络中,我们采用了 5 个特征, 通过使用权重矩阵等将其转换为 4 或 6 或 n 个特征。在线性回归中,我们简单地提取所有输入 特征合并为一个输出特征。所以 theta 本质上等同于一个行向量(由行 temp[0,j]=... 可以看出),而 params 将是特征的数量。我们 cost 数组只是存储 每次迭代时的那个数组。现在进入两个循环。在第一个 for 循环下的行 err = (X * theta.T) - y 中,我们正在计算预测 每个训练示例的错误。 err 变量的形状为 number of examples,1。在第二个 for 循环中,我们正在训练模型, 那就是我们正在逐步更新我们的 term 矩阵。我们运行第二个for循环iters 次数。在神经网络上下文中,我们通常称其为 epoch。它基本上是你想要训练模型的次数。

现在是 term = np.multiply(err, X[:,j]) 行:这里我们正在计算应该对 temp 矩阵中的每个权重进行的单独调整。 我们将成本定义为 (y_predicted-y_actual)**2/number_of_training_points,其中 y_predicted = X_1*w_1 + X_2*w_2 + X_3*w_3 +... 如果我们根据 一个特定的权重(比如 W_i)我们得到 (y_predicted-y_actual)*(X_i)/number_of_training_points 其中 X_i 是 W_i 相乘的列和。所以 term = 行 基本上计算那个微分部分。我们可以将 term 变量乘以学习率并从 W_i 中减去。 但是您可能会注意到 term 变量是一个数组。但这在下一行中得到了解决。 在下一行中,我们取 term 的平均值(将其相加然后除以 len(X)) 并从 temp 矩阵中相应的权重中减去它。更新和存储权重以及 temp 矩阵后, 我们用 temp 替换原来的 theta。我们重复这个过程 iters