一、坐标上升法算法原理
坐标上升法(Coordinate Ascent)每次通过更新函数中的一维,通过多次的迭代以达到优化函数的目的。
假设需要求解的优化问题的具体形式如下:
其中,是向量的函数。
更新过程为每次固定除以外的参数,求得满足条件的,直到算法收敛,具体的算法过程如下所示:
(图片来自参考文献1)
下面以如下的优化问题为例:
在迭代的过程中,每次固定更新,在确定了的条件下,固定,更新,即:
令其为,得到:
再固定,得到:
得到:
不断按照上述的过程,直到算法收敛。下图是算法在整个过程中的更新曲线:
代码如下:
'''
Date: 20160406
@author: zhaozhiyong
'''
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = -(X**2)
Z2 = -(Y**2)
Z = 1.0 * (Z1 + 3 * Z2 + 2 * X * Y)+6.0
plt.figure()
CS = plt.contour(X, Y, Z)
a = []
b = []
a.append(2.0)
b.append(2.0)
j = 1
for i in xrange(200):
a_tmp = b[j-1]
a.append(a_tmp)
b.append(b[j-1])
j = j+1
b_tmp = a[j-1] / 3
a.append(a[j-1])
b.append(b_tmp)
plt.plot(a,b)
plt.title('Coordinate Ascent')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
二、坐标上升法在函数优化中的应用
下面考虑求解如下的最大值问题:
将上述函数分别对求偏导,并令其为,得到如下的等式:
最终的结果为:
代码如下:
#!/bin/python
'''
Date: 20160406
@author: zhaozhiyong
'''
def f(x):
x_1 = x[0]
x_2 = x[1]
x_3 = x[2]
result = -(x_1*x_1)-2*(x_2*x_2)-3*(x_3*x_3)+2*x_1*x_2+2*x_1*x_3-4*x_2*x_3+6
return result
if __name__ == "__main__":
#print "hello world"
err = 1.0e-10
x = [1.0, 1.0, 1.0]
f_0 = f(x)
while 1:
#print "Hello"
x[0] = x[1] + x[2]
x[1] = x[0] / 2 - x[2]
x[2] = x[0] / 3 - 2 * x[1] / 3
f_t = f(x)
if (abs(f_t - f_0) < err):
break
f_0 = f_t
print "max: " + str(f_0)
print x
参考文章
- 坐标上升算法(Coordinate Ascent)及C++编程实现
- 机器学习算法与Python实践之(四)支持向量机(SVM)实现