ニュートン法
具体的には、必要な溶液のF(θ)= 0、ゼロの変数値を問題関数値を解決するためにニュートン法、F誘導場合、反復式で。
θは、ニュートンのベクトルである場合、以下の式を用いて表すことができます。
前記Hはヘッセ行列と呼ばれ、H(-1)、実際には、パラメータθの目的関数の二次導関数のヘッセ行列の逆行列を表します。
ニュートン法の利点:
比較勾配降下法の収束速度でニュートン法素早く、そして逆ヘッセ行列は反復で減少していることから、ステップサイズは効果を減少させる果たしています。
短所:
ニュートン法の欠点逆ヘッセ行列は、時間がかかり、コンピューティングリソースがより困難で計算することです。準ニュートン法でそう。
-
オンラインニュートン法を解決するための例:
ヘッセ行列の定義:
- コードの実装:
ソリューションF = 100 *(X2-X1 ** 2)** 2 +(1-X1) ** 2ニュートン法
import numpy as np
import matplotlib.pyplot as plt
#梯度的公式
def tidu(x):
return np.array([-400*x[0]*(x[1]-x[0]**2)-2*(1-x[0]),200*(x[1]-x[0]**2)])
#海森矩阵的公式
def hessian(x):
return np.array([[-400*(x[1]-3*x[0]**2)+2,-400*x[0]],[-400*x[0],200]])
#牛顿法
def newton(x):
print("初始点为 : ",x)
res=[]
res.append(x)
i = 1
imax = 1000
delta = 1
#迭代的条件是小于imax,或者是更新的距离小于一个很小的数值
while i<imax and delta>10**(-5):
p = -np.dot(np.linalg.inv(hessian(x)),tidu(x))
x_new = x + p
res.append(x_new)
delta = sum((x-x_new)**2) # 更新的距离
print("初始点为 : ",x_new)
i=i+1
x=x_new # 更新x
return np.array(res)
if __name__ =="__main__":
# 用牛顿法求解 f=100*(x2-x1**2)**2+(1-x1)**2
X1=np.arange(-1.5,1.5+0.05,0.05)
X2=np.arange(-3.5,2+0.05,0.05)
[x1,x2]=np.meshgrid(X1,X2)
f=100*(x2-x1**2)**2+(1-x1)**2; # 给定的函数
plt.contour(x1,x2,f,20) # 画出函数的20条轮廓线
x0 = np.array([-1.2,1])
res=newton(x0)
res_x=res[:,0]
res_y=res[:,1]
plt.plot(res_x,res_y)
plt.show()
著者:zhaozhengcoderの
リンクします。https://www.jianshu.com/p/0f864a4c3b38
出典:ジェーンの本が
著者によって著作権で保護されています。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。
ニュートン法は接線の現在位置に基づいて次の位置を決定するために使用されているので、ニュートン法は、非常に適切に呼ばれているので、「接線方法。」下に示すように、パスニュートン法(2次元の場合)を検索します。