我希望学生在任务中解决一个二次方程,而不必安装额外的软件,如cvxopt等.是否有可用的python实现只依赖于NumPy/SciPy?
我正在尝试使用curve_fit使用以下函数作为输入,使逻辑增长曲线适合我的数据.
def logistic(x, y0, k, d, a, b):
if b > 0 and a > 0:
y = (k * pow(1 + np.exp(d - (a * b * x) ), (-1/b) )) + y0
elif b >= -1 or b < 0 or a < 0:
y = (k * pow(1 - np.exp(d - (a * b * x) ), (-1/b) )) + y0
return y
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在使用的函数对参数a和b可以接受的值有一些限制.有关如何处理错误值的任何猜测?输入函数是应该引发异常还是返回虚拟值?提前致谢.
我正在使用 scipy.optimize.minimize 来查找目标函数的最佳参数。
我的代码:
import numpy as np
from scipy.optimize import minimize
from scipy.optimize import Bounds
bounds = Bounds([26,26,8,6,400,100,0,25,2],[36,38,28,28,1800,800,100,50,7])
energy_history = []
x_values = []
def objective(x):
x_trail = x.reshape(1,-1)
x_trail = sc_X.transform(x_trail)
y_trail = regressorSVR.predict(x_trail)
y_trail = y_trail.reshape(1,-1)
y_trail = sc_Y.inverse_transform(y_trail)
return y_trail[0]
def callback(x,y):
fobj = objective(x)
energy_history.append(fobj)
x_values.append(x)
x0 = np.array([26,28,15,7,400,377,40,43,4.3])
res = minimize(objective, x0, method='trust-constr',
options={'verbose': 1}, bounds=bounds,callback=callback)
optimal_values = res.x
energy = res.fun
Run Code Online (Sandbox Code Playgroud)
给定初始值后,我得到的最小化值(res.fun)是-7.1。我正在创建一个列表(energy_history)来查看它如何达到这个值。我在该列表中看到一些小于 -7.1 的值,但为什么 -7.1 被作为最小值返回。
目标函数多次达到 -21 的值,但为什么仍然返回 -7 作为最小值?
python optimization scipy scipy-optimize scipy-optimize-minimize
from numpy import *; from scipy.optimize import *; from math import *
def f(X):
x=X[0]; y=X[1]
return x**4-3.5*x**3-2*x**2+12*x+y**2-2*y
bnds = ((1,5), (0, 2))
min_test = minimize(f,[1,0.1], bounds = bnds);
print(min_test.x)
Run Code Online (Sandbox Code Playgroud)
我的函数f(X)有一个x=2.557, y=1我应该能够找到的局部最小值。
上面显示的代码只会给出结果 where x=1。我尝试了不同的公差和所有三种方法:L-BFGS-B、TNC 和 SLSQP。这是到目前为止我一直在看的线程:
Scipy.optimize:如何限制参数值
我怎样才能解决这个问题?
我正在使用 Spyder(Python 3.6)。