最近小夥伴面試的時候,好多面試官都會問給定乙個方程如何求解? 比如x + sinx + 1 = 0的, 小夥伴們大多都回答的用牛頓法或者用隨機梯度下降, 當然面試官會問原理....
牛頓法和sgd作為最常見優化方法平時總是聽到,也略知一二,除了在數值分析這門課上手動推過之後,再也沒仔細研究過,平時用tensorflow都是自動優化的,所以我簡單用實現了這兩個優化方法加深理解.
先說牛頓法, 牛頓法是求解方程的方法!!而不是求極值的方法!!
牛頓法就是隨機選一點帶入方程,
比如對x + sinx + 1 =0來說, 我先隨機選一點x0 = 0, 帶入方程得到y0 = 1, 並計算在x0這一點的導數為2(導數1 + cosx), 然後根據(x0, y0), 以及這一點的導數, 求出和x軸的交點(x1, 0), 在把x1帶入方程, 以此類推.
xn+1 = xn - f(xn)/f'(xn)
再說sgd, sdg是求極值的方法!!!直到沒有導數那一點才停止,也就是極值點,這個就容易理解了,隨機一點,向它的負導數方向尋找最小值(也可以說是損失函式的最優解),也就是x每次減去它的導數(再乘以學習率:步長).
再多說一點,只有凸函式才能用梯度下降找到極值點.
xn+1 = xn - learning_rate * delta
from math import *
import random
def newton(x):
"""用牛頓法對s+sinx+1=0求解
接收乙個x,返回乙個更接近解的新x
"""y = func(x)
x_dev = derivative(x) # x這一點的導數
x = x - y/x_dev # 公式xn+1 = xn - f(xn)/f'(xn)
return x
def func(x): # 函式在這裡定義
# return x + sin(x) + 1
return x**6 + x**4 + x**2
def derivative(x): # 函式對應的導數,要自己求
# return 1 + cos(x)
return 6*x**5 + 4*x**3 + 2*x
def sgd(x): # 只有凸函式才能用隨機梯度下降
delta = derivative(x) # 導數
x = x - 0.1 * delta #更新x, 0.1為學習率也就是步長
return x
if __name__ == "__main__":
x = random.random()
print("初始化:x={}".format(x))
epoch = 0
while true:
print("***************==迭代 epoch {}***************==".format(epoch))
y = func(x)
d = derivative(x)
print("導數:d={}".format(round(d, 4)))
if abs(d) > 0.0001:
new_x = sgd(x)
new_y = func(new_x)
print("更新前 x={}, y={}".format(round(x, 4), round(y, 4)))
print("更新後 x={}, y={}".format(round(new_x, 4), round(new_y, 4)))
x = new_x
y = new_y
else:
print("導數小於規定值,退出")
break
epoch += 1
**中簡單試了兩個函式
其中用sgd求解x^6+x^4+x^2的最小值(x, y):
1.592530218637264e-162 5e-324
1.5893451581999895e-162 5e-324
1.5861664678835894e-162 5e-324
1.5829941349478224e-162 5e-324
1.5798281466779268e-162 5e-324
1.5766684903845709e-162 5e-324
1.5735151534038018e-162 5e-324
1.5703681230969941e-162 5e-324
0 0.0
用牛頓法求解x+sinx+1=0的解:
-1.2338353780412281 3.236183711178369
-0.3488353398261531 -1.1775991728137907
-0.5083186322504978 0.3093611350170926
-0.5109725124871591 0.0049722146816819635
-0.5109734293884594 1.716686188979466e-06
-0.5109734293885692 2.0550228185811648e-13
-0.5109734293885692 0.0
使用「牛頓迭代法」求解方程
使用牛頓迭代法求解方程 儘管通過因式分解和利用求根公式可以很方便的得出多項式方程的根,但大多數時候這個多項式的次數都很高,計算將變得非常複雜,因此,我們必須轉向一些近似解法。牛頓迭代法是其中最好的方法之一。從根本上說,牛頓迭代法通過一系列的迭代操作使得到的結果不斷逼近方程的實根。首先,要選擇乙個初始...
3 牛頓迭代法求解方程的根
引題 用牛頓迭代法求下列方程在值等於x附近的根 2x3 4x2 3x 6 02 x3 4 x2 3 x 6 0輸入 輸入x。輸出 方程在值等於x附近的根,佔1行。輸入示例 1.5 輸出例項 2 1.牛頓迭代公式推導 設多項式f x f x 設r是f x f x 的根。選取x0x0 作為r的初始近似值...
計算方法 迭代法 牛頓法求解方程組
迭代法 給定乙個 方程 f x 0 可以用多種方式來構造它的等價方程 x p x 取定根的乙個近似值 x0,構造序列 xk 1 p xk k 0,1 2 迭代法演算法 1.給定初始值 x0 和精度要求 e 以及最大迴圈次數 k 2.計算 xk 1 p xk 3.xk 1 xk e 如果成立則說明達到...