使用梯度下降演算法來求解線性迴歸模型
阿新 • • 發佈:2019-01-10
廢話
求解線性迴歸模型的解析解可以直接使用公式,這節可以使用梯度下降演算法來求解這類問題的優化問題:
原理的東西不想說了 ,總之機器學習的一般思路都是:
構建模型(也就是你想建立什麼樣的預測函式 y=blabla)
—-》
接著就是你想對你要建立的模型使用什麼樣的損失函式求解最優化問題(此處使用的是最小二乘的原理也就是預測值和真實值的差平方和 ,最後除以樣本數cost=blabla)
—-》
最後一步就是求解最優化問題(引數更新的方式)
程式碼
# 好了這是最後一遍!!
import numpy as np
import random
#首先要生成一系列資料,三個引數分別是要生成資料的樣本數,資料的偏差,以及資料的方差
def getdata(samples,bias,variance):
X=np.zeros(shape=(samples,2)) #初始化X
Y=np.zeros(shape=samples)
for i in range(samples):
X[i][0]=1
X[i][1]=i
Y[i]=(i+bias)+random.uniform(0,1)*variance
return X,Y
#梯度下降演算法來解決最優化問題,一般都是求損失函式的最小值
def gradient(X,Y,alpha,m,iter_numbers) :
theta=np.ones(2) #初始化theta的值 初始化要求解模型中引數的值
X_trans=X.transpose() #後面求解損失函式的倒數會用到
for i in range(iter_numbers): #對於每一次迭代
Y_hat=np.dot(X,theta) #也就是機器學習中的模型,預測的函式
loss=Y_hat-Y #其實得到的仍然是一個m*1的列向量
cost=np.sum(loss**2)/(2*m) #自己定義的損失函式 最小二乘??
print("iteration:%d / Cost:%f" %(i,cost)) #打印出每一次迭代的損失函式值,正常情況下得到的損失函式隨著迭代次數的增加該損失函式值會逐漸減少
gradient=np.dot(X_trans,loss)/m #損失函式的對theta引數求導後的結果,後面梯度下降演算法更新引數theta的值時會用到這一項的值
theta=theta-alpha*gradient
return theta
if __name__=="__main__":
X,Y=getdata(100,25,10)
m=np.shape(X)[0] #得到樣本數
theta=gradient(X,Y,0.0005,m,100000)
print("最後求得模型的引數theta為:\n",theta)
結果
結束語
好久沒寫程式碼了,明顯不如以前了,雖然以前也是個弱寶寶~ ~
堅持
今天就先到這,我要回宿舍啦~~~