# 假设多元函数是二维形式
# x_init 是一个二维向量(x1, x2)
def newton_dou(step, x_init, obj):
i=1 # 记录迭代次数的变量
而我=步骤:
如果我==1:
grandient_obj=np.array([diff(obj, x1).subs(x1, x_init[0]).subs(x2, x_init[1]), diff(obj, x2).subs(x1, x_init[0]) .subs(x2, x_init[1])], dtype=float) #初始点的梯度值
hessian_obj=np.array([[diff(obj, x1, 2), diff(diff(obj, x1), x2)], [diff(diff(obj, x2), x1), diff(obj, x2, 2) )]], dtype=float) #初始点的Hessian矩阵
inverse=np.linalg.inv(hessian_obj) # Hessian 矩阵求逆
x_new=x_init - np.matmul(inverse, grandient_obj) #第一次迭代公式
打印(x_new)
# print("迭代%d次: %.5f" %(i, x_new))
我=我+1
否则:
grandient_obj=np.array([diff(obj, x1).subs(x1, x_new[0]).subs(x2, x_new[1]), diff(obj, x2).subs(x1, x_new[0]) .subs(x2, x_new[1])], dtype=float) #当前点的梯度值
hessian_obj=np.array([[diff(obj, x1, 2), diff(diff(obj, x1), x2)], [diff(diff(obj, x2), x1), diff(obj, x2, 2) )]], dtype=float) #当前点的Hessian矩阵
inverse=np.linalg.inv(hessian_obj) # Hessian 矩阵求逆
x_new=x_new - np.matmul(inverse, grandient_obj) #迭代公式
打印(x_new)
# print("迭代%d次: %.5f" % (i, x_new))
我=我+1
返回x_new
x0=np.array([0, 0], dtype=float)
x1=符号("x1")
x2=符号("x2")
newton_dou(5, x0, x1**2+2*x2**2-2*x1*x2-2*x2)
1.2 牛顿法的结果分析
程序执行结果如下:
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
进程结束,退出代码为0 经过实际计算,函数的极值点为,只需要迭代1次就可以收敛到极值点。
2 最速下降法
2.1 最速下降法的Python程序
#!/usr/bin/python
# -*- 编码:utf-8 -*-
从sympy 导入*
将numpy 导入为np
将matplotlib.pyplot 导入为plt
def sinvar(有趣):
s_p=solve(diff(fun)) #驻点
返回s_p
def value_enter(乐趣, x, i):
值=fun[i].subs(x1, x[0]).subs(x2, x[1])
返回值
def grandient_l2(grand, x_now):
grand_l2=sqrt(pow(value_enter(grand, x_now, 0), 2)+pow(value_enter(grand, x_now, 1), 2))
返回grand_l2
def msd(x_init, obj):
我=1
grandient_obj=np.array([diff(obj, x1), diff(obj, x2)])
错误=grandient_l2(grandient_obj, x_init)
plt.plot(x_init[0], x_init[1], "ro")
而(错误0.001):
如果我==1:
grandient_obj_x=np.array([value_enter(grandient_obj, x_init, 0), value_enter(grandient_obj, x_init, 1)])
t=符号("t")
x_eta=x_init - t * grandient_obj_x
eta=sinvar(obj.subs(x1, x_eta[0]).subs(x2, x_eta[1]))
x_new=x_init - eta*grandient_obj_x
打印(x_new)
我=我+1
错误=grandient_l2(grandient_obj, x_new)
plt.plot(x_new[0], x_new[1], "ro")
否则:
grandient_obj_x=np.array([value_enter(grandient_obj, x_new, 0), value_enter(grandient_obj, x_new, 1)])
t=符号("t")
x_eta=x_new - t * grandient_obj_x
eta=sinvar(obj.subs(x1, x_eta[0]).subs(x2, x_eta[1]))
x_new=x_new - eta*grandient_obj_x
打印(x_new)
我=我+1
错误=grandient_l2(grandient_obj, x_new)
plt.plot(x_new[0], x_new[1], "ro")
plt.show()
x_0=np.array([0, 0], dtype=float)
x1=符号("x1")
x2=符号("x2")
结果=msd(x_0, x1**2+2*x2**2-2*x1*x2-2*x2)
print(result)
2.2 最速下降法结果分析
程序执行结果如下:
[0 0.500000000000000]
[0.500000000000000 0.500000000000000]
[0.500000000000000 0.750000000000000]
[0.750000000000000 0.750000000000000]
[0.750000000000000 0.875000000000000]
[0.875000000000000 0.875000000000000]
[0.875000000000000 0.937500000000000]
[0.937500000000000 0.937500000000000]
[0.937500000000000 0.968750000000000]
[0.968750000000000 0.968750000000000]
[0.968750000000000 0.984375000000000]
[0.984375000000000 0.984375000000000]
[0.984375000000000 0.992187500000000]
[0.992187500000000 0.992187500000000]
[0.992187500000000 0.996093750000000]
[0.996093750000000 0.996093750000000]
[0.996093750000000 0.998046875000000]
[0.998046875000000 0.998046875000000]
[0.998046875000000 0.999023437500000]
[0.999023437500000 0.999023437500000]
[0.999023437500000 0.999511718750000]
没有任何
过程结束,退出代码为0 最速下降法选择的停止条件是,如果迭代的梯度值小于0.001,则停止迭代。从结果可以看出,当设置停止条件时,极值点并没有完全收敛到点,迭代的极值点是用Python绘制的(如图1所示)。如果继续缩小停止条件,程序会延长时间并增加迭代次数,最终极值点达到。
OK,关于高效数值优化算法:Python实现牛顿法与最速下降法详解和的内容到此结束了,希望对大家有所帮助。
【高效数值优化算法:Python实现牛顿法与最速下降法详解】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于见到Python实现牛顿法和最速下降法了!
有13位网友表示赞同!
这两种算法一直想了解一下实际应用,好借鉴一下代码。
有17位网友表示赞同!
想要优化函数,这两个算法都是不错的选择啊。
有13位网友表示赞同!
学习机器学习相关知识的时候,这些算法经常会用到。
有12位网友表示赞同!
这篇文章刚好可以补充我书本上的知识点。
有7位网友表示赞同!
代码实现非常清晰易懂!
有8位网友表示赞同!
我之前一直在用梯度下降法,想要尝试一下别的优化方法。
有11位网友表示赞同!
感谢分享这个实用的代码例子,方便很多新手学习。
有8位网友表示赞同!
看了代码,真的感觉牛顿法的效率更高一些,对吗?
有10位网友表示赞同!
最速下降法更加通俗易懂,适合初学者慢慢练习。
有18位网友表示赞同!
这两者在性能上差别很大么?有什么场景比较适合用哪种算法?
有20位网友表示赞同!
文章讲得很详细,让我了解了这两个算法背后原理。
有16位网友表示赞同!
学习Python编程也能用到这些优化算法啊!
有15位网友表示赞同!
收藏起来了,以后可能要用到。
有7位网友表示赞同!
希望能看到更多关于优化算法的分享,例如AdaGrad、RMSprop等等。
有18位网友表示赞同!
这种代码实现方法也很实用,可以直接拿来自己修改测试一下了。
有6位网友表示赞同!
我正在学习深度学习,这些基础算法非常重要!
有6位网友表示赞同!
这篇文章让我对数值计算有了更深刻的理解。
有5位网友表示赞同!
学习这种优化方法对实践项目很有帮助!
有14位网友表示赞同!