Python 坐标上升法

之前在CSDN看了几篇关于坐标上升算法的博客,都用了这个例子,但是代码实现里面的迭代部分几乎都是错的,例如

优化算法——坐标上升法
坐标上升/下降算法
坐标下降/上升算法(Coordinate Decsent/Ascent)
Python实现坐标上升算法

导致最终结果错误。现在把修改后的代码放上来供大家参考 😉

例题

以如下的优化问题为例:


在迭代时,先将其他参数固定,每次只更新一个参数。在本例中,先固定x2,更新x1,之后固定x1,更新x2,不断重复。

假设我们首先固定x2,更新x1:


令其为0,得到:

再固定x1:

令其为0,得到:

不断按照上述的过程重复,直到算法收敛或达到预先设定的迭代次数。

修改后的代码

import numpy as np
import matplotlib.pyplot as plt

#绘制等高线
delta=0.01
x1=np.arange(-3.0,3.0,delta)
x2=np.arange(-3.0,3.0,delta)
X1,X2=np.meshgrid(x1,x2)
# F = -X_1^2 - 3X_2^2 + 2X_1X_2 + 6
F = -X1**2 - 3*X2**2 + 2*X1*X2 + 6.0
plt.figure()
CS=plt.contour(X1,X2,F)

#初始化X1, X2
x1 = []
x2 = []
x1.append(2)
x2.append(2)

#迭代100次
for i in range(100):

	# 更新X1, X1 = X2
    x1_tmp = x2[i]
    x1.append(x1_tmp)
    
    # 更新X2, X2 = X1/3
    x2_tmp = x1[i] / 3
    x2.append(x2_tmp)
     
#绘制坐标更新路径
plt.plot(x1,x2)
plt.title('Coordinate Ascent')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()

# 打印结果
max_x1=x1[-1]
max_x2=x2[-1]
print ('x1的取值为:', max_x1)
print ('x2的取值为:', max_x2)
print ('最大值为: ',-max_x1**2 - 3*max_x2**2 + 2*max_x1*max_x2 + 6)

修改后结果:

x1的取值为: 2.785911138197077e-24
x2的取值为: 2.785911138197077e-24
最大值为: 6.0

这里写图片描述
修改后结果

这里写图片描述
修改后结果(-0.01<xlim, ylim<0.01)

这里写图片描述
修改前结果(-0.1<xlim, ylim<0.1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值