Python:寻找最小化CSV数据拟合误差的系数A与B
解决方案:多元线性回归求最优系数A和B
你的问题本质是多元线性回归,目标是找到系数A和B,使得线性组合 Value 1*A + Value 2*B 与Target的残差平方和最小。下面提供两种高效的实现方式,包括你提到的scipy.optimize.curve_fit的用法:
方法一:线性代数解析解(最小二乘法直接求解)
对于线性模型,最小二乘法有解析解,无需迭代优化,计算效率最高。核心公式为:params = (X^T · X)^-1 · X^T · y
其中X是包含特征(Value 1、Value 2)的矩阵,y是Target向量。
代码示例
import numpy as np import pandas as pd # 读取CSV数据 df = pd.read_csv('your_data.csv') # 构造特征矩阵X和目标向量y X = df[['Value 1', 'Value 2']].values y = df['Target'].values # 若模型需要截距项(公式为 C + Value1*A + Value2*B),可添加全1列 # X = np.hstack((np.ones((X.shape[0], 1)), X)) # 计算最优系数 params = np.linalg.inv(X.T @ X) @ X.T @ y A, B = params # 加截距的话,params会是[截距, A, B] print(f"最优系数A: {A}, B: {B}")
方法二:使用scipy.optimize.curve_fit
curve_fit支持多自变量拟合,只需将多个自变量打包成一个输入数组,再定义对应拟合函数即可。
代码示例
import numpy as np import pandas as pd from scipy.optimize import curve_fit # 读取CSV数据 df = pd.read_csv('your_data.csv') # 定义拟合函数:输入为自变量数组(每行是[Value1, Value2]),参数为A、B def linear_model(x, A, B): value1, value2 = x return value1 * A + value2 * B # 准备输入数据:将Value1和Value2转为(2, n_samples)的数组格式 x_data = np.vstack([df['Value 1'].values, df['Value 2'].values]) y_data = df['Target'].values # 执行拟合,初始参数可设为[0,0]或其他合理值 popt, pcov = curve_fit(linear_model, x_data, y_data, p0=[0, 0]) A_opt, B_opt = popt print(f"最优系数A: {A_opt}, B: {B_opt}")
注意事项
- 两种方法结果几乎一致(误差来自数值计算精度),解析解速度更快,适合大数据量;
curve_fit更灵活,可扩展到非线性模型。 - 若需加入截距项,只需对应调整特征矩阵或拟合函数即可。
内容的提问来源于stack exchange,提问作者Shiverz
相关产品推荐
相关产品推荐

