【发布时间】:2013-07-15 19:54:33
【问题描述】:
我用 numpy 写了代码(theta, X 是 numpy 数组):
def CostRegFunction(X, y, theta, lambda_):
m = len(X)
# add bias unit
X = np.concatenate((np.ones((m,1)),X),1)
H = np.dot(X,theta)
J = (1 / (2 * m)) * (np.sum([(H[i] - y[i][0])**2 for i in range(len(H))])) + (lambda_ / (2 * m)) * np.sum(theta[1:]**2)
grad_ = list()
grad_.append((1 / m) * np.sum([(H[j] - y[j][0]) for j in range(len(H))]))
for i in range(len(theta)-1):
grad_.append((1 / m) * np.sum([(H[j] - y[j]) * X[j][i+1] for j in range(len(H))]) + (lambda_ / m) * theta[i+1])
return J, grad_
def TrainLinearReg(X, y, theta, lambda_, alpha, iter):
JHistory = list()
for i in range(iter):
J, grad = CostRegFunction(X, y, theta, Lambda_)
JHistory.append(J)
for j in range(len(theta)):
theta[j] = theta[j] - alpha * grad[j]
return theta, JHistory
Theta, JH = TrainLinearReg(X, y, th, Lambda_, 0.01, 50)
但是当我尝试学习 theta 时,这段代码让我的 theta 和 J 值有了非常大的增长。 例如第一次迭代 grad = [-15.12452, 598.435436] - 这是正确的。 J 是 303.3255 第二次迭代 - grad = [10.23566,-3646.2345] J = 7924 以此类推,J 增长得越来越快,但在 LR 的概念上,它必须更低。
但如果我使用正态线性方程,我会得到一个很好的 Theta。
那段代码有什么问题?
【问题讨论】:
-
您检查过各种
alpha值吗? -
是的.. 我之前尝试过 alpha = 0.001,但它在每次迭代时给了我恒定的 J = 141。但我现在尝试了 varios 值,它给了我正确的答案!(alpha = 0.001)我是想知道,真的。也许我发现了一个错误并修复它,但不再尝试 varios alpha。谢谢。
-
你能解释一下你的回归函数是什么吗?什么是 X、Y、θ 等?每件东西的形状是什么?因为我认为对于 j in range(len(... 语句,你会使很多事情复杂化
标签: python algorithm numpy machine-learning linear-regression