【问题标题】:Scipy optimize minimize using dataframeScipy优化使用数据框最小化
【发布时间】:2019-07-20 06:52:04
【问题描述】:

我有一个包含 3 列的数据框:Y、X1、X2。我想通过最小化平方和来找到参数估计 b1 和 b2:

Objective function: minimize the sum of squares (Y - (b1*X1 + b2*X2))^2
Constraints: 0 < b1 < 2, 0 < b2 < 1
Initial guesses: b1=b2=0.5
Technique: Newton-Raphson

我知道我可以使用

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)

但我看不到如何传递数据框中的列,因为我从搜索中找到的所有示例都不使用数据框中的列。

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • scipy 不支持 pandas。因此,您将提取列,例如 scipy.optimize.minimize(fun, mydf['numeric_column'], args=())
  • 非常感谢,但是你得到“mydf['numeric_column']”的位置对应于我应该输入初始猜测的位置,即 b1=b2=0.5 不是在数据框中。

标签: python optimization scipy


【解决方案1】:

这可能是您的一些起点。只要你的目标函数的返回是标量的,应该没问题。通过元组中的 args-keywords 传递数据帧。请参阅最小化函数的文档以检查您要使用的方法。

编辑:我根据您评论中的描述更改了代码。

import numpy as np
import scipy.optimize as opt
import pandas as pd

def main(df):
    x0 = [0.5,0.5]
    res = opt.minimize(fun=obj, x0=np.array(x0), args=(df), method="BFGS", bounds=[(0,2),(0,1)])
    return res

def obj(x, df):
    #maybe use a global variable to get the dataframe or via args
    sumSquares = np.mean((df["Y"] - (x[0]*df["X1"] + x[1]*df["X2"]))**2)
    return sumSquares

df = pd.DataFrame({"Y":np.random.rand(100),
                   "X1":np.random.rand(100),
                   "X2":np.random.rand(100)})
print(main(df))

【讨论】:

  • 非常感谢,但它与我迄今为止在搜索中找到的内容相对应,我无法将 obj(x) 函数与上述数据框相关联。数据框只有上述 3 列,每一列都包含数值。
  • 非常感谢。这是有道理的,并且在我的数据框上完美运行。非常感谢。
  • 乐于助人!如果答案解决了你的问题,欢迎采纳:)
  • 感谢@f.wue 分享这个例子。我用我的数据集进行了尝试,但我在结果中收到了这条消息 - :“由于精度损失,不一定能实现所需的错误。”知道如何处理吗?
  • 不,但也许可以看看这个问题:stackoverflow.com/questions/24767191/…
猜你喜欢
  • 2021-04-05
  • 2018-07-30
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2020-02-23
  • 2018-03-17
  • 2019-12-21
  • 2018-01-30
相关资源
最近更新 更多