【发布时间】:2018-06-10 00:36:25
【问题描述】:
我在一个 numpy 数组中有一些 data。
我想根据以下规则使用线性函数对数据进行缩放:
- 平均值尽可能接近 65
- 最小值至少为 50
对于我的第一次尝试,我做了一个评分函数:
import numpy as np
from scipy.optimize import minimize
def score(x):
return abs(np.mean(x[0]*data+x[1]) - 65) + abs(x[0]*np.min(data)+x[1] - 50)
我已经添加了 abs(x[0]*np.min(data)+x[1] - 50) 以试图让它满足规则 2。
然后我尝试了:
x0 = [0.85,0]
res = minimize(score,x0)
np.set_printoptions(suppress=True)
print res
这给出了:
fun: 4.8516444911893615
hess_inv: array([[ 0.0047, -0.1532],
[-0.1532, 5.2375]])
jac: array([-50.9628, -2. ])
message: 'Desired error not necessarily achieved due to precision loss.'
nfev: 580
nit: 2
njev: 142
status: 2
success: False
x: array([0.7408, 1.4407])
也就是说优化失败了。
我还想为系数设置界限,例如bounds = [(0.7,1.3),(-5,5)].
我的问题是,在缩放最小值至少为 50 的边界条件下运行优化的正确方法是什么?另外,我怎样才能使优化运行而不会失败?
【问题讨论】:
-
查看本教程中对约束的最小化支持!我不明白你的评分方法。由于有两个组件并且由于不光滑,它看起来很破碎。取第一个,将 abs 替换为正方形或 l2-norm,并添加缺少的约束。
标签: python numpy optimization scipy