优化:找到最佳输入

时间:2016-06-21 16:28:00

标签: python numpy optimization

早些时候发布了一个类似的问题,但是太模糊了,希望这可以解决我的疑问:

我有一个函数IVcal(rho,alpha,K),我希望找到rhoalpha的最佳值,以便数据列表smiledata(函数的输出变化) K)最适合数据列表calibrate

xaxis = np.linspace(0.006,0.036,20)
calibrate = [calfun(K) for K in xaxis]
smiledata = [IVcal(rho,alpha,K) for K in xaxis]

我的想法是,我希望图表plt.plot(xaxis,smiledata, 'b--')尽可能地与图plt.plot(xaxis,calibrate, 'r--')完全匹配,只改变rhoalpha

我不确定如何优化以找到这些最佳值。我考虑过采用smiledatacalibrate之间的差异并尽量减少但是我还没有找到一个好方法,特别是因为我需要输入的值而不是输出。我以前对于含糊不清感到抱歉。如果有任何其他要求澄清,请告诉我。

1 个答案:

答案 0 :(得分:1)

无约束

您可以尝试使用scipy.optimize.leastsq

这是一种优化方法,旨在减少当前值集与目标值集之间的差异。

import scipy.optimize as opt
import numpy as np


def calfun(k):
    """Example calibration function"""
    return k * 2 * 4

def IVcal(rho, alpha, k):
    """Example test function"""
    return rho * alpha * k

def error_function(x0, **args):
    """Calculates error between functions with current inputs"""
    xaxis = np.linspace(0.006, 0.036, 20)
    calibrate = np.array([calfun(K) for K in xaxis])
    smiledata = np.array([IVcal(x0[0], x0[1], K) for K in xaxis])

    # Get error between data
    error = smiledata - calibrate

    # Print square root of sum of errors
    print np.sqrt(np.sum(error**2.0))

    return error

# Initial guesses
rho = 1
alpha = 1
x0 = np.array([rho, alpha])

# Run optimisation
result = opt.leastsq(func=error_function, x0=x0)[0]
print 'opt rho: ', result[0]
print 'opt alpha: ', result[1]

一些注意事项:

  • 优化的质量在很大程度上取决于您的起始条件!
  • calibratesmiledata的输出从list转换为np.array,可以计算两个数组中每个值之间的误差,而无需遍历列表
  • 仅考虑opt.leastsq输出中的第一个条目,因为这是优化变量的数组
  • 打印错误总和的平方根显示优化器的收敛

约束

scipy版本17开始,有一个约束版本的最小平方称为scipy.optimize.least_squares

从上面的链接:

  

自变量的下限和上限。默认为无界限。每个数组必须匹配x0的大小或者是标量,在后一种情况下,所有变量的绑定都是相同的。使用带有适当符号的np.inf来禁用所有或部分变量的边界。

对于你的情况,我相信这将是

 bounds = ([rho_lower, rho_higher],[-np.inf, np.inf])