梯度下降法的缺点:
·梯度下降法需要选择学习率α。
·梯度下降需要多次迭代。
梯度下降法的优点:
·当n( 特征量 xi 的个数 )很大时,也能运行的很好。
正规方程的缺点:
·n很大时,运行的速度很慢(对于大多数算法,求解矩阵的逆时的时间复杂度时O(n3))。因此,当n很大时,倾向于使用梯度下降法 ( n = 10000时,可以开始考虑使用梯度下降法 ) 。
·正规方程并不适用于更复杂的算法,届时仍需使用梯度下降法。
**问题:**倘若在使用正规方程法时,矩阵XT * X是不可逆的,该如何解决? ( 即这个矩阵的奇异/退化矩阵 )
尽管矩阵可能会不可逆,但是当在Octave中运行正规方程的公式时,大概率会得到正确的结果。
如果发现XT * X时奇异矩阵:
①看一下特征量中是否有冗余的特征。(如平方英尺和平方米是相同意义的特征,保留一个即可)
②检查特征量是否过多,过多的情况下,如果少一些不影响,可以删除一些特征,或使用正规化的方法。
①首先需要引入numpy库,以方便进行矩阵运算。对于IDLE使用者,需要在windows的cmd指令窗口使用pip install numpy
,而对于Pycharm使用者,需要按顺序操作:File->Settings->Project:XXX(你存储Pycharm编译文件的文件夹)->Python Interpretor->"+"->输入numpy导入,耐心等待安装(通常很快,不会超过二十秒)。
②之后引入numpy,即import numpy as np
③求矩阵的逆与转置:numpy.linalg.inv(a)
或numpy.linalg.pinv(a)
,inv()为求逆,适用于传入的矩阵不是奇异矩阵的情况,pinv()为求伪逆,适用于任何情况。inv()的速度必pinv()快。求转置以矩阵X为例,进行操作X.T
即可。
④矩阵的点乘: Python中用 “@” 实现点乘。
⑤完整代码:
注:参考自csdn博主 koala_cola,原博文地址。
def normalEqn(X, y):
theta = np.linalg.pinv(X.T@X)@X.T@y
return theta