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
)和另外两个参数(alpha
,iters
),它们是训练参数。该功能的工作是弄清楚应该有多少
预测变量 (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
次
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
)和另外两个参数(alpha
,iters
),它们是训练参数。该功能的工作是弄清楚应该有多少
预测变量 (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
次