梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。
顾名思义,梯度下降法的计算过程就是沿梯度下降的方向求解极小值(也可以沿梯度上升方向求解极大值)。梯度方向我们可以通过对函数求导得到,步长的确定比较麻烦,太大了的话可能会发散,太小收敛速度又太慢。一般确定步长的方法是由线性搜索算法来确定,即把下一个点的坐标看做是ak+1的函数,然后求满足f(ak+1)的最小值的ak+1即可。因为一般情况下,梯度向量为0的话说明是到了一个极值点,此时梯度的幅值也为0.而采用梯度下降算法进行最优化求解时,算法迭代的终止条件是梯度向量的幅值接近0即可,可以设置个非常小的常数阈值。
利用吴学恩机器学习课里的数据集进行代码实现
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
def readData(path,name=[]):
data =pd.read_csv(path,names=name)
data =(data - data.mean()) / data.std()
data.insert(0,'First',1)
returndata
def costFunction(X,Y,theta):
inner =np.power(((X * theta.T) - Y.T), 2)
returnnp.sum(inner) / (2 * len(X))
def gradientDescent(data,theta,alpha,iterations):
eachIterationValue = np.zeros((iterations,1))
temp=np.matrix(np.zeros(theta.shape))
X =np.matrix(data.iloc[:,0:-1].values)
print(X)
Y=np.matrix(data.iloc[:,-1].values)
m =X.shape[0]
colNum=X.shape[1]
for i inrange(iterations):
error= (X * theta.T)-Y.T
for jin range(colNum):
term =np.multiply(error,X[:,j])
temp[0,j] =theta[0,j]-((alpha/m) * np.sum(term))
theta=temp
eachIterationValue[i,0]=costFunction(X,Y,theta)
returntheta,eachIterationValue
if __name__ == "__main__":
data =readData('ex1data2.txt',['Size', 'Bedrooms', 'Price'])
#data =(data - data.mean()) / data.std()
theta=np.matrix(np.array([0,0,0]))
iterations=1500
alpha=0.01
theta,eachIterationValue=gradientDescent(data,theta,alpha,iterations)
print(theta)
plt.plot(np.arange(iterations),eachIterationValue)
plt.title('CostFunction')
plt.show()