一种方法是使用为非凸问题(如贝叶斯优化)设计的算法。但是,如果您已经评估了一个精细的参数网格,那么这不太可能提供显着的改进。这是一个示例,说明如何针对此问题实施贝叶斯优化。
首先,我们需要一些数据。只是为了好玩,让我们从您发布的图像中提取数据(简而言之,因为这是题外话)。
在数学中:
img = Import[NotebookDirectory[]<>"LHrXQ.png"]
img2 = ImageResize[ImageTake[img, {40, 450}, {50, 1000}], 200]
pixels = {(#[[1]]-10)*3.8,#[[2]]*9+100}&/@PixelValuePositions[img2,Black, 0.4];
ListPlot[pixels, Frame->True, ImageSize->500]

现在为了使用贝叶斯优化,我们需要将目标定义为参数 A 和 B 的函数。这里我们将最大化拟合模型的 R^2 值。
在蟒蛇中:
import pandas as pd
import numpy as np
import random
from sklearn.linear_model import LinearRegression
data = pd.read_csv('mathematica_data.csv')
def objective(params):
"""Whatever you want to do for your regression."""
# So it works with GpyOpt
A = params[0][0]
B = params[0][1]
temp = data.copy()
# Transform variable
xt = [np.arctan((x - A)/B) for x in data['x1'].tolist()]
temp['x1'] = xt
# Fit a linear model
reg = LinearRegression().fit(temp.drop('y', axis=1), temp['y'])
# Compute scores of interest
r2 = reg.score(temp.drop('y', axis=1), temp['y'])
# GPyOpt will minimize so we want -f
return - r2
现在使用 GPyOpt 优化目标。
import GPyOpt
domain = [{'name': 'A', 'type': 'continuous', 'domain': (-300.0,300.0)},
{'name': 'B', 'type': 'continuous', 'domain': (0.1,300.0)}]
bo = GPyOpt.methods.BayesianOptimization(f=objective,
domain=domain,
model_type='GP',
acquisition_type='EI',
initial_design_numdata=10,
initial_design_type='random',
acquisition_jitter=0.01,
num_cores=-1,
de_duplication=True,
exact_feval=True)
# Run optimization
bo.run_optimization(max_iter=100)
我们可以绘制优化器收敛:
bo.plot_convergence()

以及有关如何对参数进行采样的信息:
bo.plot_acquisition()

当然,仅使用从绘图中提取的自变量,即使是最好的 R^2 值也表明 arctan((xA)/B) 之间几乎没有关系。