Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
364 views
in Technique[技术] by (71.8m points)

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神解答

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...