机器学习第五周-梯度下降

梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(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()

你可能感兴趣的:(机器学习第五周-梯度下降)