多项式回归(python实现)

博客里要用的资源在这里
资源 点我啊

多项式回归

应用场景

在分析数据的时候,我们会遇到不同的数据分布情况,当数据点呈现带状分布的时候我们会选择线性回归的方法去拟合,但是如何数据点是一条曲线的时候使用线性回归的方法去拟合效果就不是那么好了,这个时候我们可以使用多项式回归的方法,本文主要讲述了一元多项式回归

一元多项式回归

处理方法分析:

y=w0 + w1 x + w2 x2 + w3 x3 + … + wd xd

将高次项看做对一次项特征的扩展得到:

y=w0 + w1 x1 + w2 x2 + w3 x3 + … + wd xd
也就是说把一元多项式转为了多元线性回归去训练得到模型,求得的w0,w1…wn同样使用于原来的一元多项式,
多项式特征扩展
如果我们使用线性回归的模型去拟合散点图,得到结果为一条直线
在这里插入图片描述
那么如果我们想让这条直线拐弯应该怎么做呢? 答案很简单,加上二次项或者多次项即可,在加上二次型和多此项的过程中同时也会增加特征值,这样就可以完成特征值的拓展,下面我们写一下具体的推导过程

双变量线性回归模型形如下面式子:

h ( x ) = w 0 + w 1 x 1 + w 2 x 2 h(x) = w_0+w_1x_1+w_2x_2 h(x)=w0+w1x1+w2x2

所以一元多项式回归的实现需要两个步骤:

通过结合二阶多项式的特征,添加二次方项,将它从平面转换为抛物面:

h ( x ) = w 0 + w 1 x 1 + w 2 x 2 + w 3 x 1 x 2 + w 4 x 1 2 + w 5 x 2 2 h(x) =w_0+w_1x_1+w_2x_2+w_3x_1x_2+w_4x_1^2+w_5x_2^2 h(x)=w0+w1x1+w2x2+w3x1x2+w4x12+w5x22

用z代替x可得:

z = [ z 1 , z 2 , z 3 , z 4 , z 5 ] = [ x 1 , x 2 , x 1 x 2 , x 1 2 , x 2 2 ] z =[z_1,z_2,z_3,z_4,z_5]=[x_1,x_2,x_1x_2,x_1^2,x_2^2] z=[z1,z2,z3,z4,z5]=[x1,x2,x1x2,x12,x22]

那么就可以写成这种方式:

h ( x ) = w 0 + w 1 z 1 + w 2 z 2 + w 3 z 3 + w 4 z 4 + w 5 z 5 h(x)=w_0+w_1z_1+w_2z_2+w_3z_3+w_4z_4+w_5z_5 h(x)=w0+w1z1+w2z2+w3z3+w4z4+w5z5

本质上就是做了一个变量替换,这样就又变回了线性回归模型

那么一元多项式回归即可以看做为多元线性回归,可以使用LinearRegression模型对样本数据进行模型训练。

  1. 将一元多项式回归问题转换为多元线性回归问题(只需给出多项式最高次数即可)。
  2. 将1步骤得到多项式的结果中 w1 w2 … 当做样本特征,交给线性回归器训练多元线性模型。

使用sklearn提供的数据管线实现两个步骤的顺序执行:

import sklearn.pipeline as pl
import sklearn.preprocessing as sp
import sklearn.linear_model as lm

model = pl.make_pipeline(
    sp.PolynomialFeatures(10),  # 多项式特征扩展器
    lm.LinearRegression())      # 线性回归器

案例:

import numpy as np
import sklearn.pipeline as pl
import sklearn.preprocessing as sp
import sklearn.linear_model as lm
import sklearn.metrics as sm
import matplotlib.pyplot as mp
# 采集数据
x, y = np.loadtxt('../ml_data/single.txt', delimiter=',', usecols=(0,1), unpack=True)
x = x.reshape(-1, 1)
# 创建模型(管线)
model = pl.make_pipeline(
    sp.PolynomialFeatures(10),  # 多项式特征扩展器
    lm.LinearRegression())      # 线性回归器
# 训练模型
model.fit(x, y)
# 根据输入预测输出
pred_y = model.predict(x)
test_x = np.linspace(x.min(), x.max(), 1000).reshape(-1, 1)
pred_test_y = model.predict(test_x)
mp.figure('Polynomial Regression', facecolor='lightgray')
mp.title('Polynomial Regression', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.scatter(x, y, c='dodgerblue', alpha=0.75, s=60, label='Sample')
mp.plot(test_x, pred_test_y, c='orangered', label='Regression')
mp.legend()
mp.show()

在这里插入图片描述

过拟合和欠拟合

过于简单的模型,无论对于训练数据还是测试数据都无法给出足够高的预测精度,这种现象叫做欠拟合。

过于复杂的模型,对于训练数据可以得到较高的预测精度,但对于测试数据通常精度较低,这种现象叫做过拟合。

一个性能可以接受的学习模型应该对训练数据和测试数据都有接近的预测精度,而且精度不能太低。

训练集R2   测试集R2
0.3        0.4        欠拟合:过于简单,无法反映数据的规则
0.9        0.2        过拟合:过于复杂,太特殊,缺乏一般性
0.7        0.6        可接受:复杂度适中,既反映数据的规则,同时又不失一般性
  • 7
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
多项式回归是一种回归分析方法,它将因变量与自变量之间的关系建模为一个多项式函数。一元N次多项式回归是指使用一个自变量和N次多项式函数来建模数据。在Python中,可以使用numpy和matplotlib库来实现多项式回归。 首先,需要准备一些数据。可以使用numpy库生成一些随机数据作为示例。然后,使用numpy的多项式拟合函数lstsq来求解回归方程的系数。最后,使用matplotlib库绘制散点图和拟合的曲线来可视化结果。 以下是使用Python实现一元多项式回归的代码示例: ```python import numpy as np import matplotlib.pyplot as plt from numpy.linalg import lstsq # 生成数据 np.random.seed(0) x = np.random.rand(50).reshape(50, -1) y = 1 - 2 * x ** 2 + 3 * x ** 3 # 求解并可视化 fig = plt.figure(figsize=(18, 6)) for n in [1, 2, 3]: # 构造多项式 x_tmp = x.copy() for i in range(2, n+1): x_tmp = np.concatenate((x_tmp, x ** i), axis=1) m = np.ones(x.shape) m = np.concatenate((m, x_tmp), axis=1) # 求解系数 k = lstsq(m, y, rcond=None)[0].reshape(-1) print(k) # 可视化 ax = fig.add_subplot(1, 3, n) ax.scatter(x.reshape(-1), y.reshape(-1), c='red', s=20, label='数据') x = np.linspace(0, 1, 100) y = k + k * x for i in range(2, n+1): y += k[i * (x ** i) ax.plot(x, y, label='拟合曲线') ax.set_title('一元{}次多项式回归'.format(n)) ax.legend() plt.show() ``` 这段代码生成了一些随机数据,并使用一元多项式回归拟合了三个不同次数的多项式函数,最后将数据点和拟合曲线可视化出来。 如果想要实现二元二次多项式回归,可以根据类似的思路进行实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python 多项式回归以及可视化](https://blog.csdn.net/qq_38204686/article/details/126276228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值