如何用 Python 拟合多元函数曲线?
2024-07-13 08:21:24
如何用 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. 如何解释模型参数的意义?
模型参数的意义需要结合具体的模型和数据进行解释。例如,在线性回归中,系数表示自变量每增加一个单位,目标变量的变化量。