Andrew Ng机器学习作业Python实现:梯度下降算法异常求助
解决梯度下降算法的参数计算错误问题
我一眼就看到你的Python代码里有个大小写敏感的变量名错误,这正是导致梯度下降结果偏离预期的核心原因!
问题定位
你的梯度下降函数参数定义的是小写的x,但在计算误差项的时候却误用了大写的X:
theta = theta - (alpha / m) * np.dot(x.T,(np.dot(X, theta) - y)) # 这里的大写X应该改成小写x!
Python是严格区分大小写的编程语言,x和X会被识别为两个完全独立的变量——你这里调用了未在函数内定义的X,实际计算时大概率误用了全局作用域的X,导致梯度更新的逻辑完全偏离了正确方向。
修正后的代码
把大写的X改成小写的x,同时可以利用已经计算好的hyp变量避免重复矩阵运算,优化代码效率:
def gradientDescent(x, y, theta, alpha, num_iter): m = np.size(x, axis=0) for i in range(num_iter): hyp = np.dot(x, theta) # 复用已计算的hyp,替代重复的np.dot(x, theta) theta = theta - (alpha / m) * np.dot(x.T, (hyp - y)) return theta
逻辑验证
修正后的Python代码逻辑和你给出的Octave实现完全对齐:
- 两者都会先计算假设值
X*theta(对应Python的np.dot(x, theta)) - 接着计算误差项
X*theta - y,再通过转置特征矩阵做乘法,最后按学习率和样本数缩放完成theta更新
你提到正规方程法能得到正确结果,说明特征矩阵X、标签y等数据都是没问题的,修正变量名错误后,梯度下降应该就能输出预期的array([[-3.6303],[1.1664]])了。
内容的提问来源于stack exchange,提问作者Saksham
相关产品推荐
相关产品推荐

