返回

如何用 Python 拟合多元函数曲线?

python

如何用 Python 拟合多元函数曲线?

在数据科学领域,我们常常需要探究多个变量之间的关系,并尝试用曲线拟合这种关系。今天我们就来聊聊如何使用 Python 对多元函数进行曲线拟合。我们会介绍两种常用方法:线性回归和非线性回归,并以房价预测为例,带你逐步理解如何应用。

房价预测:一个多元函数拟合的例子

假设我们手握一份数据集,其中包含了房价以及可能影响房价的因素,比如面积、房间数量、是否有停车位等等。

面积 房间 停车位 仓库 电梯 地址 价格
63 1 True True False Shahran 61666.67
60 1 False False False Shahran 30083.33
79 2 True False False Pardis 20000.00
95 2 False True True Narmak 71666.67
123 2 True True True Zafar 79000.00

为了方便后续的处理,我们先对数据进行一些简单的预处理。将布尔值转换为数值型(True 为 1,False 为 0),并将地址转换为类别编码。

面积 房间 停车位 仓库 电梯 地址 价格
63 1 1 1 0 1 61666.67
60 1 0 0 0 1 30083.33
79 2 1 0 0 2 20000.00
95 2 0 1 1 3 71666.67
123 2 1 1 1 4 79000.00

使用多元线性回归拟合房价

多元线性回归假设目标变量(房价)与多个自变量之间存在线性关系,可以用以下公式表示:

Y = aX1 + bX2 + cX3 + dX4 + gX5 + hX6 + intercept

其中:

  • Y 代表预测的房价
  • X1, X2, ..., X6 分别代表面积、房间数量、停车位、仓库、电梯和地址
  • a, b, c, d, g, h 是每个自变量对应的系数,代表每个因素对房价的影响程度
  • intercept 是截距项

我们可以使用 Python 中强大的统计建模库 statsmodels 进行多元线性回归分析。

import pandas as pd
import statsmodels.formula.api as sm

# 创建 DataFrame
data = {'Area': [63, 60, 79, 95, 123],
        'Room': [1, 1, 2, 2, 2],
        'Parking': [1, 0, 1, 0, 1],
        'Warehouse': [1, 0, 0, 1, 1],
        'Elevator': [0, 0, 0, 1, 1],
        'Address': [1, 1, 2, 3, 4],
        'Price': [61666.67, 30083.33, 20000.00, 71666.67, 79000.00]}
df = pd.DataFrame(data)

# 构建模型
model = sm.ols('Price ~ Area + Room + Parking + Warehouse + Elevator + Address', data=df)

# 拟合模型
results = model.fit()

# 打印结果
print(results.summary())

运行这段代码,我们会得到一份详细的报告,其中包含每个自变量的系数、截距项、R方值等信息。通过分析这些信息,我们可以评估模型的拟合优度,判断线性回归模型是否适合这些变量之间的关系。

当变量间关系非线性时:非线性回归

然而,现实世界中很多变量之间的关系并非线性,这时候就需要用到非线性回归。

假设我们想用 Sigmoid 函数来拟合房价数据:

Y = 1 / (1 + e^(beta1(X - beta2)))

其中:

  • Y 代表预测的房价
  • X 是线性组合,即 aX1 + bX2 +cX3 + dX4 + gX5 + hX6
  • beta1, beta2 是控制 Sigmoid 函数形状的参数

Python 的科学计算库 scipy 提供了 curve_fit 函数,可以帮助我们拟合非线性曲线。

import numpy as np
from scipy.optimize import curve_fit

# 定义 Sigmoid 函数
def sigmoid_func(X, beta1, beta2):
    return 1 / (1 + np.exp(beta1 * (X - beta2)))

# 定义多元函数
def multiple_sigmoid(data, beta1, beta2, a, b, c, d, e, f):
    X = a*data[:,0] + b*data[:,1] + c*data[:,2] + d*data[:,3] + e*data[:,4] + f*data[:,5]
    return sigmoid_func(X, beta1, beta2)

# 准备数据
X_data = df[['Area', 'Room', 'Parking', 'Warehouse', 'Elevator', 'Address']].values
Y_data = df['Price'].values

# 初始参数估计
initial_guess = [1, 1, 1, 1, 1, 1, 1, 1]

# 拟合曲线
popt, pcov = curve_fit(multiple_sigmoid, X_data, Y_data, p0=initial_guess)

# 获取拟合参数
beta1, beta2, a, b, c, d, e, f = popt

# 打印拟合参数
print(f"beta1: {beta1:.2f}, beta2: {beta2:.2f}, a: {a:.2f}, b: {b:.2f}, c: {c:.2f}, d: {d:.2f}, e: {e:.2f}, f: {f:.2f}")

这段代码会输出拟合得到的参数值,我们可以利用这些参数构建预测模型,对新的数据进行预测。

总结

本文介绍了如何使用 Python 对多元函数进行曲线拟合,并通过房价预测的例子展示了线性回归和非线性回归的应用。需要注意的是,选择合适的模型和函数至关重要,实际应用中需要根据数据情况进行调整和优化。

常见问题解答

1. 如何选择合适的模型?

选择模型需要考虑数据特点、变量关系、模型解释性等因素。通常可以先尝试线性模型,如果拟合效果不佳,再考虑非线性模型。

2. 如何评估模型的拟合优度?

常用的指标包括 R 方值、均方误差(MSE)、平均绝对误差(MAE)等。

3. 如何处理数据中的异常值?

异常值可能会对模型产生较大影响,需要根据具体情况进行处理,例如删除、替换或进行数据变换。

4. 非线性回归中如何选择初始参数?

初始参数的选择对拟合结果有很大影响。可以根据经验或进行简单的试算来确定初始参数。

5. 如何解释模型参数的意义?

模型参数的意义需要结合具体的模型和数据进行解释。例如,在线性回归中,系数表示自变量每增加一个单位,目标变量的变化量。