python實現梯度下降代碼問題?

#Training data set
#each element in x represents (x0,x1,x2)
x = [(1,0.,3) , (1,1.,3) ,(1,2.,3), (1,3.,2) , (1,4.,4)]
#y[i] is the output of y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]
y = [95.364,97.217205,75.195834,60.105519,49.342380]

epsilon = 0.0001
#learning rate
alpha = 0.01
diff = 0
error1 = 0
error0 =0
m = len(x)

#init the parameters to zero
theta0 = 0
theta1 = 0
theta2 = 0

while True:
#calculate the parameters
for i in range(m):
diff = y[i]-(theta0 + theta1 * x[i][1] + theta2 * x[i][2])

theta0 = theta0 + alpha * diff * x[i][0]
theta1 = theta1 + alpha * diff* x[i][1]
theta2 = theta2 + alpha * diff* x[i][2]
#calculate the cost function
error1 = 0
for lp in range(len(x)):
error1 += (y[i]-(theta0 + theta1 * x[i][1] + theta2 * x[i][2]))**2/2
if abs(error1-error0) &< epsilon: break else: error0 = error1 print(" theta0 : %f, theta1 : %f, theta2 : %f, error1 : %f"%(theta0,theta1,theta2,error1)) print("Done: theta0 : %f, theta1 : %f, theta2 : %f"%(theta0,theta1,theta2))

在研究此段梯度下降演算法的代碼是遇到兩個問題,

1. epsilon = 0.0001在此段代碼中的作用是什麼?在Minimize(Jtheta)以及Cost Function的公式用,都沒有看到一個叫epsilon標識

2. 對於求出訓練集的值後,theta0,1,2改如何使用?


如一樓所言,這段代碼存在很多問題。

『Data Science from Scratch』一書專門列了一章書來講解Python實現梯度下降和隨機梯度下降演算法,非常值得學習。

我在個人博客中寫了這一章的學習筆記,增加了一些理論解釋,僅供參考。

參考鏈接:梯度下降演算法的Python實現


epsilon是你設置的用於結束迭代的誤差閾值。

theta是用於帶到擬合的原函數裡面做測試用的,梯度下降一般有兩個數據集:訓練集和測試集。

前面K神已經指出來了,這是初學者自己寫的,缺陷很大。實現上的缺陷K神已經提到了,我提兩個其他的 1 沒有用矩陣寫。使用for循環的效率是比較低的,而且使用矩陣更清晰明了。 2 自造的數據集,最後不一定收斂。

要學習的話建議去找一門公開課,想看代碼的話可以去github上找,看這種錯誤很多的代碼是學不到東西的,


用經典的房屋價格使用梯度下降法的 python 代碼實現及推導過程參考博客 : http://blog.lisp4fun.com/2017/11/02/gradient-desent


這段代碼實現梯度下降演算法是沒有什麼問題的。這種演算法的缺陷如下:

1.訓練數據的選取,必須為有固定或內在規律的數據,而不能為一些隨機選取的,否則演算法無法收斂。

2.學習權重的選取。權重過大,則演算法震蕩不收斂;權重過小,則迭代次數過多。

回到你的問題,epsilon為前後兩次迭代誤差的差值閾值,當搜索到局部最優值時,前後兩次迭代的誤差值應該趨近於0;theta0,theta1,...thetaN求出來之後,對應的擬合方程為H(x)=theta0*x0+theta*x1+theta2*x2+...,其中,x0自動取1.

上述兩位老兄轉載的代碼有一個前提,必須包含Numpy模塊,這個是矩陣計算的模塊,在標準的python程序中是沒有的, 個人鄙見,在計算機程序中做矩陣的求逆運算不是很好的工程應用。


epsilon就是收斂條件

theta012就是得出的最優(且讓我這麼稱)擬合曲線多項式的各個係數,然並卵,因為你這個數據是自己臆想出來的,得出的結果價值不大

我這裡也有一份梯度下滑的實現,你可以看看

https://github.com/racaljk/pyann/blob/master/network/perceptron.py


epislon跳出循環標誌,判斷是否收斂


推薦閱讀:

為什麼深度神經網路要使用權值來連接神經元?
大數據與深度學習區別?
hadoop與機器學習,這兩個是相輔相成的必須學習完hadoop才能學習機器學習,還是可以單獨去學習?
機器學習中如何用交叉驗證來驗證是否過擬合?
機器學習方面高質量的論文怎麼找?

TAG:Python | 機器學習 | 最優化 | 梯度下降 |