使用遺傳算法進行曲線擬合

遺傳算法可以做最優化,這是因爲迴歸模型的算法關鍵是最優化,而遺傳算法可以做最優化。

例如,把殘差當成目標函數,形如 :

ming(a,b)=i=0n(f(xi;a,b)yi)2\min g(a,b)=\sum\limits_{i=0}^n (f(x_i;a,b)-y_i)^2

然後針對a,b 做優化

我們使用 scikit-opt來編程實現,需要安裝 scikit-opt

隨機生成訓練數據

import numpy as np
import matplotlib.pyplot as plt
from sko.GA import GA

x_true = np.linspace(-1.2, 1.2, 30)
y_true = x_true ** 3 - x_true + 0.4 * np.random.rand(30)
plt.plot(x_true, y_true, 'o')

構造殘差

def f_fun(x, a, b, c, d):
    return a * x ** 3 + b * x ** 2 + c * x + d


def obj_fun(p):
    a, b, c, d = p
    residuals = np.square(f_fun(x_true, a, b, c, d) - y_true).sum()
    return residuals

使用 scikit-opt 做最優化

ga = GA(func=obj_fun, n_dim=4, size_pop=100, max_iter=500,
        lb=[-2] * 4, ub=[2] * 4)

best_params, residuals = ga.run()
print('best_x:', best_params, '\n', 'best_y:', residuals)

畫出擬合效果圖

y_predict = f_fun(x_true, *best_params)

fig, ax = plt.subplots()

ax.plot(x_true, y_true, 'o')
ax.plot(x_true, y_predict, '-')

plt.show()

參考:

使用遺傳算法進行曲線擬合

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章