优化算法——坐标上升法

一、坐标上升法算法原理

坐标上升法(Coordinate Ascent)每次通过更新函数中的一维,通过多次的迭代以达到优化函数的目的。

假设需要求解的优化问题的具体形式如下:

m a x α W ( α 1 , α 2 , ⋯   , α m ) \underset{\alpha }{max}W\left ( \alpha _1,\alpha _2,\cdots ,\alpha _m \right ) αmaxW(α1,α2,,αm)

其中, W W W是向量 α ⃗ \vec{\alpha } α 的函数。

更新过程为每次固定除 α i \alpha _i αi以外的参数,求得满足条件的 α i \alpha _i αi,直到算法收敛,具体的算法过程如下所示:

这里写图片描述
(图片来自参考文献1)

下面以如下的优化问题为例:

f ( x 1 , x 2 ) = − x 1 2 − 3 x 2 2 + 2 x 1 x 2 + 6 f\left ( x_1,x_2 \right )=-x_1^2-3x_2^2+2x_1x_2+6 f(x1,x2)=x123x22+2x1x2+6

在迭代的过程中,每次固定 x 2 x_2 x2更新 x 1 x_1 x1,在确定了 x 1 x_1 x1的条件下,固定 x 1 x_1 x1,更新 x 2 x_2 x2,即:

∂ f ∂ x 1 = − 2 x 1 + 2 x 2 \frac{\partial f}{\partial x_1}=-2x_1+2x_2 x1f=2x1+2x2

令其为 0 0 0,得到:

x 1 = x 2 x_1 = x_2 x1=x2

再固定 x 2 x_2 x2,得到:

∂ f ∂ x 2 = − 6 x 2 + 2 x 1 \frac{\partial f}{\partial x_2}=-6x_2+2x_1 x2f=6x2+2x1

得到:

x 2 = 1 3 x 1 x_2 = \frac{1}{3}x_1 x2=31x1

不断按照上述的过程,直到算法收敛。下图是算法在整个过程中的更新曲线:

这里写图片描述

代码如下:

'''
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()

二、坐标上升法在函数优化中的应用

下面考虑求解如下的最大值问题:

a r g m a x x 1 , x 2 , x 3 f ( x 1 , x 2 , x 3 ) = − x 1 2 − 2 x 2 2 − 3 x 3 2 + 2 x 1 x 2 + 2 x 1 x 3 − 4 x 2 x 3 + 6 \underset{x_1,x_2,x_3}{argmax}f\left ( x_1,x_2,x_3 \right )\\=-x_1^2-2x_2^2-3x_3^2+2x_1x_2+2x_1x_3-4x_2x_3+6 x1,x2,x3argmaxf(x1,x2,x3)=x122x223x32+2x1x2+2x1x34x2x3+6

将上述函数分别对 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3求偏导,并令其为 0 0 0,得到如下的等式:

x 1 = x 2 + x 3 x_1=x_2+x_3 x1=x2+x3

x 2 = 1 2 x 1 − x 3 x_2=\frac{1}{2}x_1-x_3 x2=21x1x3

x 3 = 1 3 x 1 − 2 3 x 2 x_3=\frac{1}{3}x_1-\frac{2}{3}x_2 x3=31x132x2

最终的结果为:

这里写图片描述

代码如下:

#!/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

参考文章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值