線性回歸及隨機(jī)梯度下降

流程:給定麥子可以產(chǎn)出一定量的面包,然后做一元回歸,進(jìn)行預(yù)測(cè)。
程序:在迭代次數(shù)中不斷求解成本函數(shù)(cost function)對(duì)b和m的偏導(dǎo),然后根據(jù)偏導(dǎo)更新b和m,來(lái)使得b和m 達(dá)到合適的位置,盡量使的cost function足夠小。

如圖
J就是cost function,θ可代表m或b

代碼

wheat_and_bread = [[0.5, 5], [0.6, 5.5], [0.8, 6], [1.1, 6.8], [1.4, 7]]#麥子產(chǎn)生出面包量的數(shù)據(jù)
#y=m*x+b
#梯度下降 給定b 和 m  訓(xùn)練數(shù)據(jù) 學(xué)習(xí)率
def step_gradient(b_current, m_current, points, learningRate):
    b_gradient = 0
    m_gradient = 0
    N = float(len(points))
    for i in range(0, len(points)):
        x = points[i][0]
        y = points[i][1]
        #loss function (y - ((m_current * x) + b_current))^2
        #分別對(duì) b 和 m 求偏導(dǎo),然后求平均 所有訓(xùn)練數(shù)據(jù)對(duì)b,m產(chǎn)生梯度的平均
        b_gradient += -(2 / N) * (y - ((m_current * x) + b_current))
        m_gradient += -(2 / N) * x * (y - ((m_current * x) + b_current))
    #梯度下降 沿著梯度找最合適的 b和m
    new_b = b_current - (learningRate * b_gradient)
    new_m = m_current - (learningRate * m_gradient)
    return [new_b, new_m]

#數(shù)據(jù) 初始 b,m 學(xué)習(xí)率 迭代次數(shù)
def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):
    b = starting_b
    m = starting_m
    for i in range(num_iterations):
        b, m = step_gradient(b, m, points, learning_rate)
    return [b, m]

b,m=gradient_descent_runner(wheat_and_bread, 1, 1, 0.01, 100)

畫出損失函數(shù)和擬合函數(shù)

擬合函數(shù)

cost function和迭代次數(shù)的關(guān)系

完整版

這里用了plotly包,作圖流程類似R語(yǔ)言中的ggplot,便于人的理解。

wheat_and_bread = [[0.5, 5], [0.6, 5.5], [0.8, 6], [1.1, 6.8], [1.4, 7]]#麥子產(chǎn)生出面包量的數(shù)據(jù)
#y=m*x+b
#梯度下降 給定b 和 m  訓(xùn)練數(shù)據(jù) 學(xué)習(xí)率
import plotly
import plotly.plotly as py
import plotly.graph_objs as go
plotly.tools.set_credentials_file(username='username', api_key='api_key')
def step_gradient(b_current, m_current, points, learningRate):
    b_gradient = 0
    m_gradient = 0
    N = float(len(points))
    for i in range(0, len(points)):
        x = points[i][0]
        y = points[i][1]
        #loss function (y - ((m_current * x) + b_current))^2
        #分別對(duì) b 和 m 求偏導(dǎo),然后求平均 所有訓(xùn)練數(shù)據(jù)對(duì)b,m產(chǎn)生梯度的平均
        b_gradient += -(2 / N) * (y - ((m_current * x) + b_current))
        m_gradient += -(2 / N) * x * (y - ((m_current * x) + b_current))
    #梯度下降 沿著梯度找最合適的 b和m
    new_b = b_current - (learningRate * b_gradient)
    new_m = m_current - (learningRate * m_gradient)
    return [new_b, new_m]

#數(shù)據(jù) 初始 b,m 學(xué)習(xí)率 迭代次數(shù)
def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):
    b = starting_b
    m = starting_m
    cost_list=[]
    for i in range(num_iterations):
        b, m = step_gradient(b, m, points, learning_rate)
        cost_function = 0.0
        for x,y in points:
            cost_function+=(y-m*x-b)*(y-m*x-b)/len(points)
        cost_list.append(cost_function)
    #cost_function 不斷下降的散點(diǎn)圖
    trace = go.Scatter(
        x = list(range(num_iterations)),
        y = cost_list,
        mode = 'markers'
    )
    data=[trace]
    py.iplot(data, filename='basic-scatter')
    return [b, m]

b,m=gradient_descent_runner(wheat_and_bread, 1, 1, 0.01, 100)


#畫預(yù)測(cè)的圖
x=[]
y=[]
for i in range(0, len(wheat_and_bread)):
    x.append(wheat_and_bread[i][0])
    y.append(wheat_and_bread[i][1])
trace0=go.Scatter(
    x = x,
    y = y,
    mode = 'markers',
    name = 'markers'
)
x_predict=[]
y_predict=[]
for i in range(0, len(wheat_and_bread)):
    x_predict.append(wheat_and_bread[i][0])
    y_predict.append((wheat_and_bread[i][0])*m+b)
trace1=go.Scatter(
    x=x_predict,
    y=y_predict,
    mode='lines+markers',
    name='lines+markers'
)

data = [trace0, trace1]
py.iplot(data, filename='combine')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容