1. 程式人生 > 其它 >優化演算法——座標上升法

優化演算法——座標上升法

一、座標上升法演算法原理

更新過程為每次固定除αialpha _i以外的引數,求得滿足條件的αialpha _i,直到演算法收斂,具體的演算法過程如下所示:

(圖片來自參考文獻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

參考文章