正如标题所解释的,我的程序总是返回最初的猜测。
就上下文而言,该计划正在尝试找到在多个商店之间分配某些产品的最佳方式。每家商店都有对未来几天预计销售商品的预测(sales_data)。该预测不一定必须是整数或大于 1(很少如此),它是统计意义上的期望。因此,如果商店的 sales_data = [0.33, 0.33, 0.33],则预计 3 天后,他们将售出 1 单位的产品。
我想最大限度地减少出售我分配的单位所需的总时间(我想以最快的速度出售它们),我的限制是我必须分配可用的单位,并且我不能分配负数的产品到一家商店。我现在可以接受非整数分配。对于我的初始分配,我将我可用的单位平均分配给所有商店。
下面是我遇到问题的代码的较短版本:
import numpy, random
from scipy.optimize import curve_fit, minimize
unitsAvailable = 50
days = 15
class Store:
def __init__(self, num):
self.num = num
self.sales_data = []
stores = []
for i in range(10):
# Identifier
stores.append(Store(random.randint(1000, 9999)))
# Expected units to be sold that day (It's unlikey they will sell 1 every day)
stores[i].sales_data = [random.randint(0, 100) / 100 for i in range(days)]
print(stores[i].sales_data)
def days_to_turn(alloc, store): …Run Code Online (Sandbox Code Playgroud) 这是一个简短的问题,但谷歌每次都会指向我找不到答案的文档。
我正在使用 scipy.optimize.minimize。它运作得很好,一切都很好。我可以定义一个要使用的方法,但即使我不指定该方法它也可以工作。
有没有办法获得输出,使用哪种方法?我知道结果类,但那里没有提到方法。
这是一个例子:
solution = opt.minimize(functitionTOminimize,initialGuess, \
constraints=cons,options={'disp':True,'verbose':2})
print(solution)
Run Code Online (Sandbox Code Playgroud)
我可以将 value 方法设置为类似slsqp或 的值cobyla,但我想看看程序正在选择什么。我怎样才能得到这些信息?
我正在尝试使用scipy.optimize.curve_fit. 我已经阅读了文档和这篇 StackOverflow 帖子,但似乎都没有回答我的问题。
我有一些简单的 2D 数据,它们看起来近似于一个三角函数。我想使用scipy.
我的方法如下:
from __future__ import division
import numpy as np
from scipy.optimize import curve_fit
#Load the data
data = np.loadtxt('example_data.txt')
t = data[:,0]
y = data[:,1]
#define the function to fit
def func_cos(t,A,omega,dphi,C):
# A is the amplitude, omega the frequency, dphi and C the horizontal/vertical shifts
return A*np.cos(omega*t + dphi) + C
#do a scipy fit
popt, pcov = curve_fit(func_cos, t,y)
#Plot fit …Run Code Online (Sandbox Code Playgroud) 我有一个循环,使用 scipy.optimize.minimize 执行数百次优化。不幸的是,我不断收到这个恼人的警告:
C:\Users\Leonidas\Anaconda3\lib\site-packages\scipy\optimize\_hessian_update_strategy.py:186: UserWarning: delta_grad == 0.0. Check if the approximated function is linear. If the function is linear better results can be obtained by defining the Hessian as zero instead of using quasi-Newton approximations.
'approximations.', UserWarning)
Run Code Online (Sandbox Code Playgroud)
因为我正在运行数百次优化,所以这个警告在循环期间出现了几十次,它只会使控制台变得混乱并掩盖程序输出的其余部分。有没有办法
python warnings scipy scipy-optimize scipy-optimize-minimize
我正在尝试使用 scipy 的quadratic_assignment函数,但我无法理解输出如何描述最佳解决方案。这是一个最小的例子,我将一个小矩阵与其自身进行比较:
import numpy as np
from scipy.optimize import quadratic_assignment
# Parameters
n = 5
p = np.log(n)/n # Approx. 32%
# Definitions
A = np.random.rand(n,n)<p
# Quadratic assignment
res = quadratic_assignment(A, A)
print(res.col_ind)
Run Code Online (Sandbox Code Playgroud)
结果似乎是随机分配的:
[3 0 1 4 2]
[3 2 4 1 0]
[3 2 1 0 4]
[4 3 1 0 2]
[2 3 0 1 4]
...
Run Code Online (Sandbox Code Playgroud)
但是,根据文档,col_ind应该是与 B 的节点找到的最佳排列相对应的列索引。由于输入矩阵相等(B==A),因此我希望身份分配[0 1 2 3 4]能够弹出。更改n为更大的值并没有帮助。
我有什么地方做错了吗?
在引入 Tensorflow 2.0 之后,scipy 接口 (tf.contrib.opt.ScipyOptimizerInterface) 已被删除。但是,我仍然想使用 scipy 优化器scipy.optimize.minimize(method='L-BFGS-B')来训练神经网络(keras 模型序列)。为了使优化器工作,它需要一个函数fun(x0)作为输入,其中x0是一个形状为 (n,) 的数组。因此,第一步是“展平”权重矩阵以获得具有所需形状的向量。为此,我修改了https://pychao.com/2019/11/02/optimize-tensorflow-keras-models-with-l-bfgs-from-tensorflow-probability/提供的代码。这提供了一个函数工厂来创建这样一个函数乐趣(x0)。然而,代码似乎不起作用,损失函数并没有减少。如果有人能帮我解决这个问题,我将不胜感激。
这是我正在使用的一段代码:
func = function_factory(model, loss_function, x_u_train, u_train)
# convert initial model parameters to a 1D tf.Tensor
init_params = tf.dynamic_stitch(func.idx, model.trainable_variables)
init_params = tf.cast(init_params, dtype=tf.float32)
# train the model with L-BFGS solver
results = scipy.optimize.minimize(fun=func, x0=init_params, method='L-BFGS-B')
def loss_function(x_u_train, u_train, network):
u_pred = tf.cast(network(x_u_train), dtype=tf.float32)
loss_value = tf.reduce_mean(tf.square(u_train - u_pred))
return tf.cast(loss_value, dtype=tf.float32)
def function_factory(model, loss_f, x_u_train, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Jupyter Notebook 绘制逻辑函数。我可以很好地绘制它,但是使用 scipy.optimize.curve_fit 的逻辑函数不起作用。它返回直线坐标。
如何绘制逻辑回归线?
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
%matplotlib inline
df = pd.read_csv('https://gist.githubusercontent.com/shinokada/76070a0927fa1fac01eeaed298757a26/raw/2707a1bd7cba80613a01a2026abeb9f587dbaee5/logisticdata.csv')
x=df.T.iloc[0]
y=df.T.iloc[1]
def logifunc(x,l,c,k):
return l / (1 + c*np.exp(-k*x))
popt, pcov = curve_fit(logifunc, x, y, p0=[-150,1,1])
print(*popt)
x_data = np.linspace(170,205,num=100)
print(logifunc(x_data, *popt))
plt.scatter(x,y,label='Logistic function')
plt.plot(x_data, logifunc(x_data, *popt), 'r-',label='Fitted function')
plt.title("Logistic")
plt.xlabel('x')
plt.ylabel('y')
plt.xlim(170,210)
plt.ylim(-210,-160)
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)
我是优化问题的新手,正在研究一个简单的最大化问题,我可以在 Excel 中非常简单地解决这个问题。但是,我需要在 Python 中扩展它并需要一些帮助。
我有一份不同食物的菜单,我需要最大限度地提高我的能量输出。例子:
| 宏 | 食物 | 卡路里 | 活力 |
|---|---|---|---|
| 蛋白质 | 鱼 | 100 | 60 |
| 蛋白质 | 羊肉 | 200 | 40 |
| 蛋白质 | 蛋 | 200 | 38 |
| 碳水化合物 | 香蕉 | 200 | 25 |
| 碳水化合物 | 土豆 | 200 | 30 |
| 碳水化合物 | 米 | 200 | 40 |
| 胖的 | 牛油果 | 450 | 50 |
| 胖的 | 奶酪 | 400 | 60 |
| 胖的 | 奶油 | 500 | 55 |
鉴于以下限制,我需要最大化能量(e):
问题表述:
变量: X (m,i) ? 二元变量 = {1 ,如果宏 m 和项目 i 被选择,0 否则}
最大化 …
python linear-programming pulp mixed-integer-programming scipy-optimize