# 通过梯度下降法,来对参数进行调整
# x : 样本数据中的(x0, x1)
# y :样本数据中的目标标量
# theta :参数θ ,是个 1 * 2 的矩阵,分别是参数b、w
# learn_rate :学习率。学习率设置也很关键。为简单起见,这里依然采用常数
# m :样本数据的个数,本例子中是100个
# num_Iterations : 最大迭代次数,一般地,我们判断模型是否可以输出,是根据误差函数足够小。
# 但是,为了防止因为误差函数无法收敛导致的死循环。所以,我们会设置最大迭代次数,
def gradient_descent(x, y, theta, learn_rate, m, num_Iterations):
print(num_Iterations)
for i in range(0, num_Iterations):
# 计算损失函数,
loss = caculate_loss(x, y, m, theta)
# loss 是一个 1 * 100 的矩阵, x是个 100 * 2的矩阵
gradient = np.dot(loss.transpose(), x) / m #这里改成np.dot(loss, x) / m也没问题
# 更新参数
theta = theta - learn_rate * gradient
if i % 10000 == 0:
print("θ : {0}, cost: {1} ".format(theta, np.sum(loss ** 2) / (2 * m)))
return theta
数学里,对横向量和列向量是有区别的,为何np.dot(loss.transpose(), x) / m 这里不区分loss是横向量还是列向量。正在看李明军的《TensorFlow深度学习实战大全》,这个公式死活过不去,不知道怎么来的。我自己按照书前面的说法,写程序实现了100个点拟合成直线。但是 必须设置学习率是learn_rate = 0.0000001,将近100万次循环后才达到比较理想的结果( while (abs(误差变动) > 0.001)),他这里简单的将矩阵 loss和x 相乘,怎么就行了呢?谢谢大牛指点。。。
--
FROM 120.242.253.*