python中使用Scipy.optimize.minimize()优化求解时,同样的数据得到了不同的结果

发布于 2022-09-12 03:12:40 字数 1570 浏览 22 评论 0

import numpy as np
import pandas as pd

from scipy.optimize import minimize


def get_y_hat(x_, y_, args):
    return (x_ * 100) / (1 + args[0]) + (x_ * 100 + y_) / (1 + args[1]) ** 2


def opt_target(args, df):
# 优化目标--> error_sum最小
    df["Y_hat"] = df[["X1", "Y"]].apply(lambda x: get_y_hat(x[0], x[1], args), axis=1)
    error_sum = np.sum((df["Y_hat"] - df["Y"])**2)

    return error_sum


def main(target_df):
    x0 = [1.0, 1.0]
    bound = [(0, None), (0, 2)]
    con = {"type": "ineq", "fun": lambda x: 3 - x[0] - x[1]}
    return minimize(fun=opt_target, x0=np.array(x0), method="SLSQP", args=(target_df, ), bounds=bound, constraints=con)


np.random.seed(1)
y = pd.DataFrame(np.random.randint(90, 110, size=(5, 1)), columns=["Y"])
x1 = pd.DataFrame(np.random.random(size=(5, 1)), columns=["X1"])
y["Y"] = y["Y"] + x1["X1"]
sample = pd.concat([y, x1], axis=1)

sample.to_csv("sample.csv", index=False)

print("-------------------------------------------------------")
# 原始数据直接输入函数
df1 = sample.copy(deep=True)
res = main(df1)
print("original_sample result:", res.x)

print("-------------------------------------------------------")
# 从上述的df.csv读取数据输入函数
df2 = pd.read_csv("sample.csv")
res2 = main(df2)
print("read from file result:", res2.x)

print("-------------------------------------------------------")
# 按照"Y"列排序后输入函数
df3 = sample.sort_values(by="Y")
res3 = main(df3)
print("sorted by column 'Y' result:", res3.x)

我的目标想得到errorsum最小时的参数。
但是奇怪的是我输入的数据都是相同的,不同的是:直接输入、从文件中读取后输入,排序后输入。这三种会得到不同的参数。
所以想问问大家这个问题怎么解决?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文