梯度下降法和牛顿法求最优解

问题描述

深度截图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)创建num个start~stop之间的等差数列
# meshgrid()产生格点矩阵,用于三维曲面的分格线座标
# meshgrid(range(-3,4),range(-2,3))产生两个都是5*7的矩阵X和Y,其中X是由第一个行向量产生,Y是由第二个行向量产生
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

# 如果这样定义代价方程,计算出的结果有些问题,暂时还没搞明白
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容