接上篇部落格
題目描述:
自定義乙個可微並且存在最小值的一元函式,用梯度下降法求其最小值。並繪製出學習率從0.1到0.9(步長0.1)時,達到最小值時所迭代的次數的關係曲線,根據該曲線給出簡單的分析。
**:
# -*- coding: utf-8 -*-
"""created on tue jun 4 10:19:03 2019
@author: administrator
"""import numpy as np
import matplotlib.pyplot as plt
plot_x=np.linspace(-1
,6,150
)#在-1到6之間等距的生成150個數
plot_y=
(plot_x-
2.5)**2
+3# 同時根據plot_x來生成plot_y(y=(x-2.5)²+3)
plt.plot(plot_x,plot_y)
plt.show(
)###定義乙個求二次函式導數的函式dj
defdj
(x):
return2*
(x-2.5
)###定義乙個求函式值的函式j
defj
(x):
try:
return
(x-2.5)**
2+3except
:return
float
('inf')x=
0.0#隨機選取乙個起始點
eta=
0.1#eta是學習率,用來控制步長的大小
epsilon=1e-
8#用來判斷是否到達二次函式的最小值點的條件
history_x=
[x]#用來記錄使用梯度下降法走過的點的x座標
count=
0min=0
while
true
: gradient=dj(x)
#梯度(導數)
last_x=x
x=x-eta*gradient
count=count+1if
(abs
(j(last_x)
-j(x)
):#用來判斷是否逼近最低點
min=x
break
plt.plot(plot_x,plot_y)
plt.plot(np.array(history_x)
,j(np.array(history_x)
),color=
'r',marker=
'*')
#繪製x的軌跡
plt.show(
)print
'min_x =',(
min)
print
'min_y ='
,(j(
min)
)#列印到達最低點時y的值
print
'count ='
,(count)
sum_eta=
result=
for i in
range(1
,10,1
):x=
0.0#隨機選取乙個起始點
eta=i*
0.1 epsilon=1e-
8#用來判斷是否到達二次函式的最小值點的條件
num=
0min=0
while
true
: gradient=dj(x)
#梯度(導數)
last_x=x
x=x-eta*gradient
num=num+1if
(abs
(j(last_x)
-j(x)
):#用來判斷是否逼近最低點
min=x
break
#記錄學習率從0.1到0.9(步長0.1)時,達到最小值時所迭代的次數
plt.scatter(sum_eta,result,c=
'r')
plt.plot(sum_eta,result,c=
'r')
plt.title(
"relation"
)plt.xlabel(
"eta"
)plt.ylabel(
"count"
)plt.show
print
(result)
執行結果:
結果分析:
函式y=(x-2.5)²+3從學習率和迭代次數的關係圖上我們可以知道當學習率較低時迭代次數較多,隨著學習率的增大,迭代次數開始逐漸減少,當學習率為0.5時迭代次數最少,之後隨著學習率的增加,迭代次數開始增加,當學習率為0.9時迭代次數和0.1時相等。關於0.5成對稱分布。
梯度下降法和隨機梯度下降法
批量梯度下降法 batch gradient descent 在更新引數時使用所有的樣本來進行更新 隨機梯度下降法 stochastic gradient descent 求梯度時沒有用所有的m個樣本的資料,而是僅僅選取乙個樣本j來求梯度。小批量梯度下降法 mini batch gradient d...
梯度下降法
梯度下降法 是乙個一階 最優化演算法 通常也稱為 最速下降法 我之前也沒有關注過這類演算法。最近,聽史丹福大學的機器學習課程時,碰到了用梯度下降演算法求解線性回歸問題,於是看了看這類演算法的思想。今天只寫了一些入門級的知識。我們知道,函式的曲線如下 程式設計實現 c code cpp view pl...
梯度下降法
回歸 regression 梯度下降 gradient descent 發表於332 天前 技術,科研 被圍觀 1152 次 前言 這個系列主要想能夠用數學去描述機器學習,想要學好機器學習,首先得去理解其中的數學意義,不一定要到能夠輕鬆自如的推導中間的公式,不過至少得認識這些 式子吧,不然看一些相關...