Scipy优化使用数据框最小化

时间:2019-02-26 16:50:07

标签: python optimization scipy

我有一个包含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)

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

我将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这可能是您的起点。只要您的目标函数的返回值为标量,就应该没问题。通过元组中的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))