梯度下降法和牛頓法求最優(yōu)解

問題描述

深度截圖20170423135325.png

思路

  1. 梯度下降法


    深度截圖20170423135233.png
  2. 牛頓法


    深度截圖20170423135205.png

    深度截圖20170423135217.png

求解過程

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)創(chuàng)建num個start~stop之間的等差數(shù)列
# meshgrid()產(chǎn)生格點矩陣,用于三維曲面的分格線座標
# meshgrid(range(-3,4),range(-2,3))產(chǎn)生兩個都是5*7的矩陣X和Y,其中X是由第一個行向量產(chǎn)生,Y是由第二個行向量產(chǎn)生
X, Y = np.meshgrid(np.linspace(-5, 10, 100), np.linspace(-5, 10, 100))

A = np.matrix([[4.0,2.0],[1.0,3.0]])
B = np.matrix([[3.0],[2.0]])

R = A.T.dot(A)
P = A.T.dot(B)

print(R)
print(P)
print(B.T.dot(B))

# 定義代價方程
# 不明白這個代價方程怎么來的
def cost_func(X,Y):
    return R[0,0]*(X**2)+R[1,1]*(Y**2)+(R[0,1]+R[1,0])*X*Y-2*P[0,0]*X-2*P[1,0]*Y

# 如果這樣定義代價方程,計算出的結(jié)果有些問題,暫時還沒搞明白
def cost_func2(X):
    return X.T.dot(R).dot(X) - X.T.dot(P) - P.T.dot(X) + B.T.dot(B)

z = cost_func(X,Y)
[[ 17.  11.]
 [ 11.  13.]]
[[ 14.]
 [ 12.]]
[[ 13.]]
# w, w_n分別用來存最速下降和牛頓法的迭代過程
w=np.matrix([[0],[-4]])
w_n=np.matrix([[0],[-4]])

# 梯度下降法
for i in range(100):
    w_t = w[:,-1]
    w=np.hstack((w,w_t-0.01*(R.dot(w_t)-P)))

# NewTon法 

#Hessian matrix,這里不明白    
H=np.matrix([[2.0*R[0,0],R[0,1]+R[1,0]],[R[0,1]+R[1,0],2.0*R[1,1]]])

for _ in range(30):
    w_t = w_n[:,-1]
    w_n=np.hstack((w_n,w_t-H.I.dot(R.dot(w_t)-P)))
    
w = np.array(w)
w_n = np.array(w_n)

# 學習曲線
L=cost_func(w[0,:], w[1,:])
L_n=cost_func(w_n[0,:], w_n[1,:])


# 輸出圖形
# 2d plot

f, (ax1, ax2) = plt.subplots(1, 2)
CS = ax1.contour(X, Y, z)
ax1.plot(w[0,:], w[1,:], 'bo',w_n[0,:],w_n[1,:], 'ro')

ax1.clabel(CS, inline=1, fontsize=10)
ax1.set_title('contour')
ax1.set_xlabel('w0')
ax1.set_ylabel('w1')
ax1.legend(('grad', 'Newton'))
ax1.grid(True)


ax2.plot(range(101),L,'b',range(31),L_n,'r')
ax2.set_title('cost learn curve')
ax2.set_ylabel('cost')
ax2.legend(('grad', 'Newton'))
ax2.grid(True)


# 3d plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 先畫出整個大曲面,然后在大曲面上畫出迭代過程中的每個點
ax.plot_surface(X,Y, z, rstride=4, cstride=4, color='b')
ax.plot(w[0,:],w[1,:],L,'ro')
ax.plot(w_n[0,:],w_n[1,:],L_n,'go')
ax.legend(('grad', 'Newton'))

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

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

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