【问题标题】:gradient descent for linear regression in python codepython代码中线性回归的梯度下降
【发布时间】:2017-08-10 17:32:56
【问题描述】:
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]

请帮我理解!

【问题讨论】:

    标签: python gradient-descent


    【解决方案1】:

    我会为你分解这个。所以在你的梯度下降函数中,你正在接受预测变量(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 次数。在神经网络上下文中,我们通常将其称为 epochs。它基本上是您想要训练模型的次数。

    现在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 矩阵, 我们将原来的theta 替换为temp。我们重复这个过程iters 次数

    【讨论】:

    • 感谢您的解释。所以你说“术语=线基本上计算了微分部分”,但我仍然不明白微分是如何在这里工作的。该术语将 X 值与 (X * theta.T) -y 的误差相乘,但这与微分有什么关系?
    • 当您区分与theta 相关的错误时,您会得到X*(X*theta.T-y)
    【解决方案2】:

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

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

    【讨论】:

    • 不是可交换的吗?
    • 我知道我错了。在我发布之前应该检查 wiki
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多