吴恩达机器学习——线性回归梯度下降
1、基本理论
代价函数(线性回归的优化目标)
线性回归梯度下降步骤:
!所有参数集体更新后再开始下一轮迭代
2、代码展示
#X表示训练的属性集矩阵;
#Y表示监督训练中的标签值矩阵;
#theta表示参数矩阵,各参数均保存于此;
#alpha表示学习率;
#times表示梯度下降的执行次数,
#在代码中是通过设置times来达到让theta参数收敛的目的;
import numpy as np
def costfun(X,Y,theta): #定义代价值,表示此时曲线与各点的“代价”
cost = np.sum(np.multiply((X*theta.T - Y),(X*theta.T - Y)))/(2*len(X))
return cost
#######################################
cost = np.zeros(1000) #保存每次更新的代价值
def gradient_descent(X,Y,theta,alpha,times):
temp = np.matrix(np.zeros(theta.shape[1])) #temp矩阵用于临时保存上一次theta矩阵
for i in range(times):
D_value = (X*theta.T - Y).T #这里转置提前了,没啥特殊含义,本质都是为了算后面的term
for j in range(theta.shape[1]):
term = D_value*X[:,j]
temp[0,j] = theta[0,j] - (alpha/len(X))*np.sum(term)
#之所以使用np.sum()(其作用是计算矩阵中各元素的和),如果直接带入
#term,numpy会将term视为矩阵,无法参数和theta[0,j]的相减运算,会报错
theta = temp #更新theta矩阵
cost[i] = costfun(X,Y,theta)
3、 拓展
X矩阵的处理
在运行上述代码时,为了让X与theta矩阵对齐,需要在X矩阵的第一列添加一列1,具体可以去看吴老师的课程,另外西瓜书上也是类似的思想,方便矩阵操作和运算。
归一化
如果各个特征之间的值差距过大,比如属性X1的范围为[1000,2000],而属性X2的范围为[0.01,0.02],这样的情况不利于梯度下降的算法,为了加快梯度下降,一般对各个特征进行归一化,具体方法如下:
X = (X - X.mean())/X.std()
Andrew Wu 建议让属性的值保持在[-3,3]即可。
多项式回归
有时候线性的模型并不能保证能够拟合训练集,如下图:
处理方式十分简单:
例如上图,如果需要拟合三次多项式,可以进行以上操作,但这样的操作可能导致属性的值差距过大,可能会需要归一化的操作。