使用 scipy 最小化函数
Minimize function with scipy
我正在尝试完成一项任务,但我就是想不通。
这是我的功能:
1/(x**1/n) + 1/(y**1/n) + 1/(z**1/n) - 1
我希望总和尽可能接近 1。
这些是我的输入变量 (x,y,z):
test = np.array([1.42, 5.29, 7.75])
所以 n 是唯一的决策变量。
总结一下:
我现在遇到这样的情况:
1/(1.42**1/1) + 1/(5.29**1/1) + 1/(7.75**1/1) = 1.02229
我想得到以下内容:
1/(1.42^(1/0.972782944446024)) + 1/(5.29^(1/0.972782944446024)) + 1/(7.75^(1/0.972782944446024)) = 0.999625
到目前为止我几乎一无所有,欢迎任何帮助。
import numpy as np
from scipy.optimize import minimize
def objectiv(xyz):
x = xyz[0]
y = xyz[1]
z = xyz[2]
n = 1
return 1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n))
test = np.array([1.42, 5.29, 7.75])
print(objectiv(test))
OUTPUT: 1.0222935270013889
如何正确定义约束条件?
def conconstraint(xyz):
x = xyz[0]
y = xyz[1]
z = xyz[2]
n = 1
return 1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n)) - 1
我一点也不清楚 n?
如何处理以及如何处理
编辑
我设法做到了以下几点:
def objective(n,*args):
x = odds[0]
y = odds[1]
z = odds[2]
return abs((1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n))) - 1)
odds = [1.42,5.29,7.75]
solve = minimize(objective,1.0,args=(odds))
我的输出:
fun: -0.9999999931706812
x: array([0.01864994])
真正放入公式时:
(1/(1.42^(1/0.01864994)) + 1/(5.29^(1/0.01864994)) + 1/(7.75^(1/0.01864994))) -1 = -0.999999993171
不幸的是,我需要一个正数 1,但我不知道要更改什么。
我们想找到 n
得到我们的 固定 x、y 和 z 的结果尽可能接近 1
。 minimize
尝试获得某物的最低可能值,没有负边界; -3
优于-2
,依此类推
所以我们真正想要的是所谓的least-squares优化。不过,类似的想法。这个文档有点难懂,所以我会尽量澄清:
所有这些优化函数都有一个共同的设计,您传入一个至少带有一个参数的可调用对象,您要优化的参数(在您的情况下,n
).然后你可以让它接受更多的参数,这些参数的值将根据你传入的内容固定。
在您的情况下,您希望能够针对不同的 x、y 和 z 值解决优化问题。因此,您让回调接受 n、x、y 和 z,并传递 x、y 和 z 值以在调用 scipy.optimize.least_squares
时使用。您使用 args
关键字参数传递它们(注意它不是 *args)。我们还可以为 n
值提供 1
的初始猜测,算法将对其进行优化。
其余的是与我们的目的无关的定制。
所以,首先让我们进行回调:
def objective(n, x, y, z):
return 1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n))
现在我们的电话看起来像:
best_n = least_squares(objective, 1.0, args=np.array([1.42, 5.29, 7.75]))
(你可以用同样的方式调用 minimize
,它会寻找一个 n
值来使 objective
函数 return 的值与可能。如果我想清楚:n
的猜测应该趋向于零,使分母无限制地增加,使倒数之和趋于零;负值是不可能的。但是,当它停止时根据 ftol
、xtol
和 gtol
的默认值,它接近于零。正确理解这部分超出了本答案的范围;请尝试 math.stackexchange.com.)
我正在尝试完成一项任务,但我就是想不通。
这是我的功能:
1/(x**1/n) + 1/(y**1/n) + 1/(z**1/n) - 1
我希望总和尽可能接近 1。
这些是我的输入变量 (x,y,z):
test = np.array([1.42, 5.29, 7.75])
所以 n 是唯一的决策变量。
总结一下:
我现在遇到这样的情况:
1/(1.42**1/1) + 1/(5.29**1/1) + 1/(7.75**1/1) = 1.02229
我想得到以下内容:
1/(1.42^(1/0.972782944446024)) + 1/(5.29^(1/0.972782944446024)) + 1/(7.75^(1/0.972782944446024)) = 0.999625
到目前为止我几乎一无所有,欢迎任何帮助。
import numpy as np
from scipy.optimize import minimize
def objectiv(xyz):
x = xyz[0]
y = xyz[1]
z = xyz[2]
n = 1
return 1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n))
test = np.array([1.42, 5.29, 7.75])
print(objectiv(test))
OUTPUT: 1.0222935270013889
如何正确定义约束条件?
def conconstraint(xyz):
x = xyz[0]
y = xyz[1]
z = xyz[2]
n = 1
return 1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n)) - 1
我一点也不清楚 n?
如何处理以及如何处理编辑
我设法做到了以下几点:
def objective(n,*args):
x = odds[0]
y = odds[1]
z = odds[2]
return abs((1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n))) - 1)
odds = [1.42,5.29,7.75]
solve = minimize(objective,1.0,args=(odds))
我的输出:
fun: -0.9999999931706812
x: array([0.01864994])
真正放入公式时:
(1/(1.42^(1/0.01864994)) + 1/(5.29^(1/0.01864994)) + 1/(7.75^(1/0.01864994))) -1 = -0.999999993171
不幸的是,我需要一个正数 1,但我不知道要更改什么。
我们想找到 n
得到我们的 固定 x、y 和 z 的结果尽可能接近 1
。 minimize
尝试获得某物的最低可能值,没有负边界; -3
优于-2
,依此类推
所以我们真正想要的是所谓的least-squares优化。不过,类似的想法。这个文档有点难懂,所以我会尽量澄清:
所有这些优化函数都有一个共同的设计,您传入一个至少带有一个参数的可调用对象,您要优化的参数(在您的情况下,n
).然后你可以让它接受更多的参数,这些参数的值将根据你传入的内容固定。
在您的情况下,您希望能够针对不同的 x、y 和 z 值解决优化问题。因此,您让回调接受 n、x、y 和 z,并传递 x、y 和 z 值以在调用 scipy.optimize.least_squares
时使用。您使用 args
关键字参数传递它们(注意它不是 *args)。我们还可以为 n
值提供 1
的初始猜测,算法将对其进行优化。
其余的是与我们的目的无关的定制。
所以,首先让我们进行回调:
def objective(n, x, y, z):
return 1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n))
现在我们的电话看起来像:
best_n = least_squares(objective, 1.0, args=np.array([1.42, 5.29, 7.75]))
(你可以用同样的方式调用 minimize
,它会寻找一个 n
值来使 objective
函数 return 的值与可能。如果我想清楚:n
的猜测应该趋向于零,使分母无限制地增加,使倒数之和趋于零;负值是不可能的。但是,当它停止时根据 ftol
、xtol
和 gtol
的默认值,它接近于零。正确理解这部分超出了本答案的范围;请尝试 math.stackexchange.com.)