Scipy根据平方和误差优化常数



我希望找到一个Scipy模块,以类似于下面测试示例的方式优化常量。这是否适合使用Basinhoping及其输入?我的意图是通过将"系数"优化为值"123"来最小化"factorarray"one_answers"factorarrayTrue"之间的差(SSE=0),从而使"factorarray"one_answers"FactorarrayTruy"彼此相等(SSE=0)。

import numpy as np
from scipy.optimize import basinhopping
inputarray = [1,2,3,4,5]
coefficient = 100    
def objective_function(inputarray, coefficient):  
    factorarray = np.empty(len(inputarray))
    factorarrayTrue = np.empty(len(inputarray)) 
    for i, num in enumerate(inputarray):
        factorarray[i] = num * coefficient
        factorarrayTrue[i] = num *123
    #### SQUARE ERROR
    SEzip = zip(factorarrayTrue, factorarray)
    sse = 0
    for e in SEzip:
        sse += (e[0] - e[1])**2
    return sse
minimizer_kwargs = {"method": "COBYLA", "args": (coefficient)}
result = basinhopping(objective_function(inputarray, coefficient), coefficient, minimizer_kwargs = minimizer_kwargs)

您最初的代码不太正确。传递给basinhoping()的第一个参数应该只是您想要调用的函数。scipy将迭代调用该函数,该函数应将可优化系数作为其第一个参数。inputarray应该是minimizer_kwargs中提供的附加参数之一。

以下是有效的:

import numpy as np
from scipy.optimize import basinhopping
inputarray = [1,2,3,4,5]
coefficient = 100
def objective_function(coefficient, inputarray):
    factorarray = np.empty(len(inputarray))
    factorarrayTrue = np.empty(len(inputarray))
    for i, num in enumerate(inputarray):
        factorarray[i] = num * coefficient
        factorarrayTrue[i] = num *123
    #### SQUARE ERROR
    SEzip = zip(factorarrayTrue, factorarray)
    sse = 0
    for e in SEzip:
        sse += (e[0] - e[1])**2
    return sse
minimizer_kwargs = {"method": "COBYLA", "args": (inputarray) }
result = basinhopping(objective_function, coefficient, minimizer_kwargs = minimizer_kwargs)
print(result)

最新更新