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