08_手写多项式回归

本文深入讲解了一元和多元多项式回归的基本概念,并通过实例演示了如何使用Python进行多项式回归分析,包括样本创建、模型训练及预测结果可视化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述


博文配套视频课程:24小时实现从零到AI人工智能


多项式回归场景

直线回归研究的是一个依变量与一个自变量之间的回归问题,但是,在畜禽、水产科学领域的许多实际问题中,影响依变量的自变量往往不止一个,而是多个,比如绵羊的产毛量这一变量同时受到绵羊体重、胸围、体长等多个变量的影响,因此需要进行一个依变量与多个自变量间的回归分析,即多元回归分析

研究一个因变量与一个或多个自变量间多项式的回归分析方法,称为多项式回归(Polynomial Regression)。如果自变量只有一个时,称为一元多项式回归;如果自变量有多个时,称为多元多项式回归。在一元回归分析中,如果依变量y与自变量x的关系为非线性的,但是又找不到适当的函数曲线来拟合,则可以采用一元多项式回归

一元m次多项式回归方程为:在这里插入图片描述
二元二次多项式回归方程为:在这里插入图片描述

创建待分析的样本

import numpy as np
import matplotlib.pyplot as plt
# 在指定[-3,3]随机生成size个随机数(代表的特征值)
x = np.random.uniform(-3,3,size=100)
print(x,x.shape)
# 模拟目标值(y) 与x并不是简单的线性关系
y = 0.5 * x**2 + x + 2 + np.random.normal(0,1,size=100)

在这里插入图片描述

多项式预测样本

# y = w * x + b ===>  y = w1 * x**2 + w2 * x + b
print((X**2).shape)
# hstack 在水平方向追加, vstack垂直方向叠加
X2 = np.hstack([X**2,X])
print(X2.shape)
# 线性回归模型进行训练
lr = LinearRegression()
lr.fit(X2,y)
# 训练过程就是寻找最佳权重和偏置的过程
print('权重',lr.coef_,'偏置',lr.intercept_)
y_predict = lr.predict(X2)
# 真实的数据集采用散点图显示
plt.scatter(x,y)
# 预测数据集,采用线形图显示,必须按照x轴从小到大进行绘制
# plt.plot(x,y_predict,color='r')
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')
plt.show()
print(lr.score(X2,y))

在这里插入图片描述
在这里插入图片描述

### 手写数字识别中的回归模型实现 在手写数字识别任务中,通常采用分类模型进行预测,因为目标是将输入图像分配到0到9这10个类别之一。然而,如果希望使用**回归分析**来实现类似功能,则需要对手写数字识别问题进行重新建模。具体来说,可以将问题转化为对数字的数值属性进行连续预测,例如将输出定义为一个0到9之间的浮点数。 #### 数据准备与预处理 对于手写数字识别,数据集通常是灰度图像,尺寸如28x28或20x20像素。为了适配回归模型,可以将图像转换为一维向量,并对像素值进行归一化处理(如除以255),使其范围落在[0, 1]之间[^2]。此外,标签也需要从整数类别(如0到9)转换为连续值表示。 ```python import numpy as np from sklearn.model_selection import train_test_split # 假设 x 是图像数据,y 是对应的数字标签(0-9) x_normalized = x / 255.0 # 归一化像素值 y_continuous = y.astype(np.float32) # 转换为浮点型用于回归 # 划分训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(x_normalized, y_continuous, test_size=0.2) ``` #### 回归模型的选择与实现 可以选择线性回归、岭回归(Ridge Regression)或更复杂的非线性模型(如神经网络)来进行手写数字的回归任务。以下是一个使用`scikit-learn`库中的线性回归模型进行训练和预测的示例: ```python from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # 初始化并训练线性回归模型 regressor = LinearRegression() regressor.fit(x_train, y_train) # 预测并评估模型 y_pred = regressor.predict(x_test) mse = mean_squared_error(y_test, y_pred) print("均方误差(MSE):", mse) ``` #### 结果解释与后处理 由于回归模型输出的是连续值,因此需要对其结果进行后处理以映射回离散的数字类别。一种简单的方法是将输出四舍五入为最接近的整数,并将其限制在0到9范围内: ```python y_pred_rounded = np.round(y_pred).astype(int) y_pred_clamped = np.clip(y_pred_rounded, 0, 9) ``` 这样,回归模型的输出就可以被解释为手写数字的类别。 #### 模型优化与扩展 如果希望进一步提升性能,可以尝试以下方法: - 使用正则化技术(如岭回归或Lasso)防止过拟合。 - 引入非线性特征(如多项式展开)或使用核方法。 - 构建多层感知机(MLP)作为非线性回归模型,直接预测数字的连续值。 ```python from sklearn.neural_network import MLPRegressor # 使用多层感知机进行回归 mlp_regressor = MLPRegressor(hidden_layer_sizes=(128, 64), max_iter=1000) mlp_regressor.fit(x_train, y_train) # 预测并评估 y_pred_mlp = mlp_regressor.predict(x_test) mse_mlp = mean_squared_error(y_test, y_pred_mlp) print("MLP回归的均方误差(MSE):", mse_mlp) ``` #### 注意事项 - 回归模型手写数字识别中的表现可能不如分类模型准确,因为它本质上是一个分类任务。 - 如果目标是直接获得数字类别而非连续值,则建议使用逻辑回归或深度学习分类器[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值