非线性回归的实现方式


本文介绍多种非线性回归的实现方法,每种方法都有其特点和适用场景。

以下是几种常见的非线性回归方法:

1.多项式回归:

一种常见的做法是使用**多项式回归,**这是一种特殊形式的线性回归,通过将原始特征转换为多项式特征来捕捉数据的非线性关系。在 Python 中,您可以使用 Scikit-Learn 的 PolynomialFeaturesLinearRegression 来实现多项式回归。

  • 已经介绍过,通过将输入变量转换为其高次项来实现非线性。
  • 适用于数据关系可以近似表示为多项式的情况。
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# 示例数据
data = [[251, 215, 284, 311, 1], [256, 213, 298, 312, 2], [258, 213, 305, 316, 3]]

# 转换数据格式
df = pd.DataFrame(data, columns=['x1', 'y1', 'x2', 'y2', 'z'])
# 分离特征和目标变量
X = df[['z']]  # 特征(x 轴坐标)
y = df[['x1', 'y1', 'x2', 'y2']]  # 目标变量

# 设置多项式回归模型
degree = 2  # 可以根据需要调整多项式的度数
poly_features = PolynomialFeatures(degree=degree)
X_poly = poly_features.fit_transform(X)

# 训练多个模型
models = {}
for target in y.columns:
    model = LinearRegression()
    model.fit(X_poly, y[target])
    models[target] = model

# 预测函数
def predict(x_value):
    x_poly = poly_features.transform([[x_value]])
    predictions = [models[target].predict(x_poly)[0] for target in y.columns]
    return predictions

# 使用示例
predicted_box = predict(4)  # 假设给定 x 值为 4
print(predicted_box)

2.决策树回归:

决策树回归是一种有效的非线性回归方法,它通过构建决策树来模拟数据中的非线性关系。这种方法尤其适合处理具有复杂数据结构的问题,可以在没有复杂方程模型的情况下捕捉数据的内在规律。

工作原理

  1. 分割数据:决策树通过将特征空间分割成一系列简单区域来工作。对于每个区域,模型会计算一个输出值。

  2. 构建树结构:从根节点开始,数据基于某些条件被分割到不同的分支,这个过程一直持续到满足停止条件,如达到预设的深度或节点中的数据点数量低于某个阈值。

  3. 预测输出:对于一个新的数据点,决策树回归模型会根据这些分割规则将其放入相应的区域,并预测输出为该区域的平均目标值。

  • 使用决策树模型来拟合非线性关系。
  • Scikit-LearnDecisionTreeRegressor 可以用来实现。
  • 适用于复杂的非线性关系,但容易过拟合。
import pandas as pd
from sklearn.tree import DecisionTreeRegressor

# 示例数据
data = [[251, 215, 284, 311, 1], [256, 213, 298, 312, 2], [258, 213, 305, 316, 3]]

# 转换数据格式
df = pd.DataFrame(data, columns=['x1', 'y1', 'x2', 'y2', 'z'])

# 分离特征和目标变量
X = df[['z']]  # 特征(x 轴坐标)
y = df[['x1', 'y1', 'x2', 'y2']]  # 目标变量

# 训练多个决策树模型
models = {}
for target in y.columns:
    model = DecisionTreeRegressor()
    model.fit(X, y[target])
    models[target] = model

# 预测函数
def predict(x_value):
    predictions = [models[target].predict([[x_value]])[0] for target in y.columns]
    return predictions

# 使用示例
predicted_box = predict(4)  # 假设给定 x 值为 4
print(predicted_box)

请注意,决策树回归模型可能容易过拟合,尤其是当数据量不足或树的深度过大时。为了提高模型的泛化能力,您可能需要调整模型的参数,如最大深度、最小分割样本数等。

3.随机森林回归(更高级的集成方法):

随机森林回归是一种强大的非线性回归方法,它通过结合多个决策树的预测结果来提高模型的准确性和泛化能力。随机森林在处理各种类型的回归问题时都表现出色,特别是在处理有复杂非线性关系和高维特征的数据时。

工作原理

  1. 集成学习:随机森林属于集成学习方法,它构建多个决策树并将它们的预测结果合并起来,以提高整体模型的性能。
  2. 随机性:在构建每棵树时,随机森林引入了两种主要的随机性:一是通过对原始数据集进行有放回抽样来创建每棵树的训练集(即自助聚合,或bootstrap aggregating);二是在分割节点时,从一个随机的特征子集中选择最佳分割特征。
  3. 预测:对于回归任务,随机森林的预测结果是其所有决策树预测结果的平均值。
  • 是决策树回归的扩展,使用多个决策树的平均来改进预测的准确性。
  • 使用 Scikit-LearnRandomForestRegressor
  • 适合于有大量数据且数据关系复杂的情况。
import pandas as pd
from sklearn.ensemble import RandomForestRegressor

# 示例数据
data = [[251, 215, 284, 311, 1], [256, 213, 298, 312, 2], [258, 213, 305, 316, 3]]

# 转换数据格式
df = pd.DataFrame(data, columns=['x1', 'y1', 'x2', 'y2', 'z'])

# 分离特征和目标变量
X = df[['z']]  # 特征(x 轴坐标)
y = df[['x1', 'y1', 'x2', 'y2']]  # 目标变量

# 训练多个随机森林模型
models = {}
for target in y.columns:
    model = RandomForestRegressor(n_estimators=100)  # n_estimators 是树的数量
    model.fit(X, y[target])
    models[target] = model

# 预测函数
def predict(x_value):
    predictions = [models[target].predict([[x_value]])[0] for target in y.columns]
    return predictions

# 使用示例
predicted_box = predict(4)  # 假设给定 x 值为 4
print(predicted_box)

随机森林有一些关键参数,比如 n_estimators(树的数量),这些参数可以调整以优化模型性能。更多的树可以提高模型的准确性和稳定性,但也会增加计算成本。您可以根据实际情况调整这些参数以达到最佳性能。

4.支持向量回归(SVR):

支持向量回归(SVR)是一种基于支持向量机(SVM)的回归方法,它在处理非线性关系时表现出色。SVR通过引入核技巧来处理非线性数据,使其能够适应各种复杂的数据模式。

工作原理

  1. 核技巧:SVR利用核函数将原始特征映射到高维空间,在这个空间中,数据可能变得线性可分离。常见的核函数包括线性核、多项式核、径向基函数(RBF)核等。
  2. 边际和支持向量:SVR试图找到一个超平面,以最小化模型预测和实际数据之间的最大偏差,同时保持边际最大化。数据点中最靠近这个超平面的点被称为支持向量,它们是模型构建的关键。
  3. 正则化:SVR允许一定的误差,这通过一个参数(通常是C)来控制。该参数定义了对于预测误差的容忍度,帮助避免过拟合。
  • 使用支持向量机(SVM)来进行回归分析。
  • Scikit-LearnSVR 类可以用于实现。
  • 特别适用于高维数据,可以通过不同的核函数来捕捉非线性关系。
import pandas as pd
from sklearn.svm import SVR

# 示例数据
data = [[251, 215, 284, 311, 1], [256, 213, 298, 312, 2], [258, 213, 305, 316, 3]]

# 转换数据格式
df = pd.DataFrame(data, columns=['x1', 'y1', 'x2', 'y2', 'z'])

# 分离特征和目标变量
X = df[['z']]  # 特征(x 轴坐标)
y = df[['x1', 'y1', 'x2', 'y2']]  # 目标变量

# 训练多个SVR模型
models = {}
for target in y.columns:
    model = SVR(kernel='rbf')  # 使用 RBF 核; 也可以尝试 'linear', 'poly', 等核函数
    model.fit(X, y[target])
    models[target] = model

# 预测函数
def predict(x_value):
    predictions = [models[target].predict([[x_value]])[0] for target in y.columns]
    return predictions

# 使用示例
predicted_box = predict(4)  # 假设给定 x 值为 4
print(predicted_box)

在实际应用中,您可能需要调整SVR的参数,例如选择不同的核函数和调整正则化参数C,以获得最佳性能。

5.K近邻回归(KNN回归):

K近邻(K-Nearest Neighbors, KNN)回归是一种简单而强大的非线性回归方法。它基于相似度或距离度量,通过考虑一个数据点的最近邻居来进行预测。KNN回归不需要对数据进行显式的建模,使其非常适合于复杂的非线性数据。

工作原理

  1. 邻居选择:对于一个给定的预测点,KNN回归查找训练数据中距离最近的K个邻居。距离通常使用欧几里得距离计算,但也可以使用其他类型的距离度量。
  2. 平均预测:然后,它计算这些邻居的目标值的平均值或加权平均值作为预测值。
  3. 参数选择:KNN的关键参数是邻居的数量K。较小的K值意味着模型对噪声更敏感,而较大的K值则可能导致过于平滑的预测。
  • 通过观察样本点的K个最近邻居来预测。
  • 使用 Scikit-LearnKNeighborsRegressor
  • 适用于数据具有明显的局部模式或群集时。
import pandas as pd
from sklearn.neighbors import KNeighborsRegressor

# 示例数据
data = [[251, 215, 284, 311, 1], [256, 213, 298, 312, 2], [258, 213, 305, 316, 3]]

# 转换数据格式
df = pd.DataFrame(data, columns=['x1', 'y1', 'x2', 'y2', 'z'])

# 分离特征和目标变量
X = df[['z']]  # 特征(x 轴坐标)
y = df[['x1', 'y1', 'x2', 'y2']]  # 目标变量

# 训练多个KNN模型
models = {}
for target in y.columns:
    model = KNeighborsRegressor(n_neighbors=2)  # n_neighbors 是邻居的数量,必须大于n_samples
    model.fit(X, y[target])
    models[target] = model

# 预测函数
def predict(x_value):
    predictions = [models[target].predict([[x_value]])[0] for target in y.columns]
    return predictions

# 使用示例
predicted_box = predict(4)  # 假设给定 x 值为 4
print(predicted_box)

KNN回归的效果很大程度上取决于n_neighbors参数的选择。通常,这个参数需要根据具体数据集进行调整,以找到最佳的平衡点。

6.神经网络回归:

神经网络回归是一种强大的方法,用于建模复杂的非线性关系。它使用人工神经网络的结构来学习数据中的模式,并做出预测。神经网络在处理高维数据和捕捉复杂的数据关系方面表现出色。

工作原理

  1. 网络结构:一个典型的神经网络包括输入层、若干隐藏层和输出层。每层包含若干神经元或节点,这些神经元通过激活函数处理信息。
  2. 前向传播:数据通过网络前向传播,每层的输出成为下一层的输入。
  3. 激活函数:隐藏层通常使用非线性激活函数(如ReLU、Sigmoid、Tanh等),这使得神经网络能够学习非线性关系。
  4. 反向传播和优化:使用反向传播算法结合梯度下降(或其变体)来优化网络的权重,以最小化预测和实际值之间的差异。
  • 使用神经网络来捕捉数据间复杂的非线性关系。
  • 可以使用 Scikit-LearnMLPRegressorTensorFlowKeras
  • 适用于高度复杂和大规模的数据集。
import torch
import torch.nn as nn
import torch.optim as optim
import pandas as pd
from torch.utils.data import DataLoader, TensorDataset

# 示例数据
data = [[251, 215, 284, 311, 1], [256, 213, 298, 312, 2], [258, 213, 305, 316, 3]]

# 转换数据格式
df = pd.DataFrame(data, columns=['x1', 'y1', 'x2', 'y2', 'z'])

# 分离特征和目标变量,并转换为PyTorch张量
X = torch.tensor(df[['z']].values, dtype=torch.float32)
y = torch.tensor(df[['x1', 'y1', 'x2', 'y2']].values, dtype=torch.float32)

# 创建数据加载器
dataset = TensorDataset(X, y)
dataloader = DataLoader(dataset, batch_size=10, shuffle=True)

# 定义神经网络模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(1, 10)  # 输入层到隐藏层
        self.fc2 = nn.Linear(10, 10) # 隐藏层
        self.fc3 = nn.Linear(10, 4)  # 隐藏层到输出层

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 实例化模型、定义损失函数和优化器
model = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
for epoch in range(100):
    for inputs, targets in dataloader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()

# 预测函数
def predict(x_value):
    with torch.no_grad():
        prediction = model(torch.tensor([[x_value]], dtype=torch.float32))
    return prediction.numpy()

# 使用示例
predicted_box = predict(4)  # 假设给定 x 值为 4
print(predicted_box)

请注意,神经网络的结构(如层数、每层的节点数)、激活函数、学习率、优化器以及训练过程(如批大小和迭代次数)都是可以调整的,神经网络的训练可能涉及超参数的调整,以及可能的过拟合问题的解决,以获得更好的预测性能。于实际应用,可能需要更复杂的网络结构和调参过程。

总结

每种方法都有其优势和局限性。选择哪种方法取决于数据的特性、问题的复杂性以及计算资源等因素。

通常,对于简单的非线性关系,多项式回归或决策树可能就足够了。对于更复杂的问题,可能需要考虑使用神经网络或支持向量回归。

在实际应用中,通常需要尝试不同的方法,并通过交叉验证等技术来评估它们的性能。

  • 40
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

twinkle 222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值