2017-08-07 78 views
1

我已經爲python做了一個簡單的梯度下降實現,它對大多數參數都能正常工作,但對於學習速率和迭代次數的某些參數,它會給我一個運行時錯誤。漸變下降運行時錯誤

RuntimeWarning:溢出double_scalars遇到

RuntimeWarning:在double_scalars

遇到無效值

現在我假設,因爲它得到一個地步,因爲有B和M值太大而不能存儲在內存中溢出錯誤,這個假設是否正確?

我該如何防止程序崩潰,因爲主程序中的異常處理似乎不起作用,您能想出一種無異常處理的方式來防止錯誤在邏輯上?

def compute_error(points,b,m): 
    error = 0 
    for i in range(len(points)): 
     y = ponts[i][1] 
     x = points[i][0] 
     error += (y - (m*x + b))**2 
    return error/len(points) 

def gradient_runner(points,LR,num_iter,startB=0,startM=0): 
    b = startB 
    m = startM 
    for i in range(num_iter): 
     b,m = step_gradient(points,b,m,LR) 
    return [b,m] 

def step_gradient(points,b,m,LR): 
    b_gradient = 0 
    m_gradient = 0 
    N = float(len(points)) 
    for i in range(len(points)): 
     x = points[i][0] 
     y = points[i][1] 
     b_gradient+= (-2/N)*(y - ((m*x)+b)) 
     m_gradient+= (-2/N)*x*(y - ((m*x)+b)) 
## print "Value for b_gradient",b_gradient 
## print "Value for b is ",b 
## print "Value for learning rate is ",LR 
    new_b = b - (LR * b_gradient) 
    new_m = m - (LR * m_gradient) 
    return [new_b,new_m]  

import numpy as np 
a = np.array([[1,1],[4,2],[6,3],[8,4],[11,5],[12,6],[13,7],[16,8]]) 

b,m=gradient_runner(a,0.0001,1000) # These parameters work 
# b,m=gradient_runner(a,0.1,10000) #Program Crashes 
yguesses = [m * i + b for i in a[:,0]] 


import matplotlib.pyplot as plt 

guezz= yguesses 

plt.scatter(a[:,0], a[:,1] ,color="green") 
plt.plot(a[:,0],guezz,color="red") 

plt.show() 

回答

0

的問題是在「學習率」 LR(此測試僅通過改變LR - 你會發現,如果你去夠低,算法收斂)。由於LR的值過高,您每次都會採取太大的步驟(想象一下,您在每一步都會跳過正確的值)。有多種方法可以計算最大步長應該是多少。谷歌有一點點(例如「漸變下降步長」)。

但是,正如您所看到的,如果發生溢出,結果很可能是錯誤的。在Python中,您可以使用catch warnings來告訴用戶結果是錯誤的。