之前在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)