1.4 多项式拟合实例

多项式拟合(Polynomial Fitting)就是采用多项式去拟合数据点。

导入必要的模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler#数据标准化处理
from sklearn.preprocessing import PolynomialFeatures#生成特征多项式
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

生成数据

生成100个训练样本

# 设置随机种子
np.random.seed(34)sample_num = 100# 从-5到5中随机抽取100个浮点数
x_train = np.random.uniform(-5, 5, size=sample_num)# 将x从shape为(sample_num,)变为(sample_num,1)
X_train = x_train.reshape(-1,1)# 生成y值的实际函数
y_train_real = 0.5 * x_train ** 3 + x_train ** 2 + 2 * x_train + 1# 生成误差值
err_train = np.random.normal(0, 5, size=sample_num)# 真实y值加上误差值,得到样本的y值
y_train = y_train_real + err_train# 画出样本的散点图
plt.scatter(x_train, y_train, marker='o', color='g', label='train dataset')# 画出实际函数曲线
plt.plot(np.sort(x_train), y_train_real[np.argsort(x_train)], color='b', label='real curve')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

生成测试集

# 设置随机种子
np.random.seed(12)sample_num = 100# 从-5到5中随机抽取100个浮点数
x_test = np.random.uniform(-5, 5, size=sample_num)# 将x从shape为(sample_num,)变为(sample_num,1)
X_test = x_test.reshape(-1,1)# 生成y值的实际函数
y_test_real = 0.5 * x_test ** 3 + x_test ** 2 + 2 * x_test + 1# 生成误差值
err_test = np.random.normal(0, 5, size=sample_num)# 真实y值加上误差值,得到样本的y值
y_test = y_test_real + err_test# 画出样本的散点图
plt.scatter(x_test, y_test, marker='o', color='c', label='test dataset')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

问题:假如我们不知道生成样本的函数,如何用线性回归模型拟合这些样本?

多项式模型拟合

1阶线性模型拟合

# 线性回归模型训练
reg1 = LinearRegression()
reg1.fit(X_train, y_train)# 模型预测
y_train_pred1 = reg1.predict(X_train)# 画出样本的散点图
plt.scatter(x_train, y_train, marker='o', color='g', label='train dataset')# 画出实际函数曲线
plt.plot(np.sort(x_train), y_train_real[np.argsort(x_train)], color='b', label='real curve')# 画出预测函数曲线
plt.plot(np.sort(x_train), y_train_pred1[np.argsort(x_train)], color='r', label='prediction curve')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

直线太过简单,不能很好地描述数据的变化关系。

3阶多项式模型拟合

使用到的api:

创建多项式特征sklearn.preprocessing.PolynomialFeatures

用到的参数:

  • degree:设置多项式特征的阶数,默认2。

  • include_bias:是否包括偏置项,默认True。

使用fit_transform函数对数据做处理。

特征标准化sklearn.preprocessing.StandardScaler(减去均值除再除以标准差)

使用fit_transform函数对数据做处理。

# 生成多项式数据
poly = PolynomialFeatures(degree=3, include_bias=False)
X_train_poly = poly.fit_transform(X_train)# 数据标准化(减均值除标准差)
scaler  = StandardScaler()
X_train_poly_scaled = scaler.fit_transform(X_train_poly)# 线性回归模型训练
reg3 = LinearRegression()
reg3.fit(X_train_poly_scaled, y_train)# 模型预测
y_train_pred3 = reg3.predict(X_train_poly_scaled)# 画出样本的散点图
plt.scatter(x_train, y_train, marker='o', color='g', label='train dataset')# 画出实际函数曲线
# plt.plot(np.sort(x_train), y_train_real[np.argsort(x_train)], color='b', label='real curve')# 画出预测函数曲线
plt.plot(np.sort(x_train), y_train_pred3[np.argsort(x_train)], color='r', label='prediction curve')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

曲线拟合得非常不错。

10阶多项式模型拟合

# 生成多项式数据
poly = PolynomialFeatures(degree=10, include_bias=False)
X_train_poly = poly.fit_transform(X_train)# 数据标准化(减均值除标准差)
scaler  = StandardScaler()
X_train_poly_scaled = scaler.fit_transform(X_train_poly)# 线性回归模型训练
reg10 = LinearRegression()
reg10.fit(X_train_poly_scaled, y_train)# 模型预测
y_train_pred10 = reg10.predict(X_train_poly_scaled)# 画出样本的散点图
plt.scatter(x_train, y_train, marker='o', color='g', label='train dataset')# 画出实际函数曲线
plt.plot(np.sort(x_train), y_train_real[np.argsort(x_train)], color='b', label='real curve')# 画出预测函数曲线
plt.plot(np.sort(x_train), y_train_pred10[np.argsort(x_train)], color='r', label='prediction curve')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

曲线拟合得也还可以。

30阶多项式模型拟合

# 生成多项式数据
poly = PolynomialFeatures(degree=30, include_bias=False)
X_train_poly = poly.fit_transform(X_train)# 数据标准化(减均值除标准差)
scaler  = StandardScaler()
X_train_poly_scaled = scaler.fit_transform(X_train_poly)# 线性回归模型训练
reg30 = LinearRegression()
reg30.fit(X_train_poly_scaled, y_train)# 模型预测
y_train_pred30 = reg30.predict(X_train_poly_scaled)# 画出样本的散点图
plt.scatter(x_train, y_train, marker='o', color='g', label='train dataset')# 画出实际函数曲线
# plt.plot(np.sort(x_train), y_train_real[np.argsort(x_train)], color='b', label='real curve')# 画出预测函数曲线
plt.plot(np.sort(x_train), y_train_pred30[np.argsort(x_train)], color='r', label='prediction curve')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

曲线变得弯曲而复杂,把训练样本点的噪声变化也学习到了。

指标对比

# 计算MSE
mse1 = mean_squared_error(y_train_pred1, y_train)
mse3 = mean_squared_error(y_train_pred3, y_train)
mse10 = mean_squared_error(y_train_pred10, y_train)
mse30 = mean_squared_error(y_train_pred30, y_train)# 打印结果
print('MSE:')
print('1 order polynomial: {:.2f}'.format(mse1))
print('3 order polynomial: {:.2f}'.format(mse3))
print('10 order polynomial: {:.2f}'.format(mse10))
print('30 order polynomial: {:.2f}'.format(mse30))

得到的MSE如下:

MSE:
1 order polynomial: 149.92
3 order polynomial: 24.32
10 order polynomial: 23.64
30 order polynomial: 15.05

训练集mse指标从好到坏的模型是:30阶多项式、10阶多项式、3阶多项式、1阶多项式。

测试集检验

1阶线性模型预测

# 模型预测
y_test_pred1 = reg1.predict(X_test)# 画出样本的散点图
plt.scatter(x_test, y_test, marker='o', color='c', label='test dataset')# 画出预测函数曲线
plt.plot(np.sort(x_test), y_test_pred1[np.argsort(x_test)], color='r', label='1 order')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

3阶多项式模型预测

# 生成多项式数据
poly = PolynomialFeatures(degree=3, include_bias=False)
X_test_poly = poly.fit_transform(X_test)# 数据标准化(减均值除标准差)
scaler  = StandardScaler()
X_test_poly_scaled = scaler.fit_transform(X_test_poly)# 模型预测
y_test_pred3 = reg3.predict(X_test_poly_scaled)# 画出样本的散点图
plt.scatter(x_test, y_test, marker='o', color='c', label='test dataset')# 画出预测函数曲线
plt.plot(np.sort(x_test), y_test_pred3[np.argsort(x_test)], color='r', label='3 order')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

10阶多项式模型预测

# 生成多项式数据
poly = PolynomialFeatures(degree=10, include_bias=False)
X_test_poly = poly.fit_transform(X_test)# 数据标准化(减均值除标准差)
scaler  = StandardScaler()
X_test_poly_scaled = scaler.fit_transform(X_test_poly)# 模型预测
y_test_pred10 = reg10.predict(X_test_poly_scaled)# 画出样本的散点图
plt.scatter(x_test, y_test, marker='o', color='c', label='test dataset')# 画出预测函数曲线
plt.plot(np.sort(x_test), y_test_pred10[np.argsort(x_test)], color='r', label='10 order')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

30阶多项式模型预测

# 生成多项式数据
poly = PolynomialFeatures(degree=30, include_bias=False)
X_test_poly = poly.fit_transform(X_test)# 数据标准化(减均值除标准差)
scaler  = StandardScaler()
X_test_poly_scaled = scaler.fit_transform(X_test_poly)# 模型预测
y_test_pred30 = reg30.predict(X_test_poly_scaled)# 画出样本的散点图
plt.scatter(x_test, y_test, marker='o', color='c', label='test dataset')# 画出预测函数曲线
plt.plot(np.sort(x_test), y_test_pred30[np.argsort(x_test)], color='r', label='30 order')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

指标对比

# 计算MSE
mse1 = mean_squared_error(y_train_pred1, y_train)
mse3 = mean_squared_error(y_train_pred3, y_train)
mse10 = mean_squared_error(y_train_pred10, y_train)
mse30 = mean_squared_error(y_train_pred30, y_train)# 打印结果
print('MSE:')
print('1 order polynomial: {:.2f}'.format(mse1))
print('3 order polynomial: {:.2f}'.format(mse3))
print('10 order polynomial: {:.2f}'.format(mse10))
print('30 order polynomial: {:.2f}'.format(mse30))

训练集mse指标从好到坏的模型是:30阶多项式、10阶多项式、3阶多项式、1阶多项式。

测阶线性模型预测试集检验

1阶线性模型预测

# 模型预测
y_test_pred1 = reg1.predict(X_test)# 画出样本的散点图
plt.scatter(x_test, y_test, marker='o', color='c', label='test dataset')# 画出预测函数曲线
plt.plot(np.sort(x_test), y_test_pred1[np.argsort(x_test)], color='r', label='1 order')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

3阶多项式模型预测

# 生成多项式数据
poly = PolynomialFeatures(degree=3, include_bias=False)
X_test_poly = poly.fit_transform(X_test)# 数据标准化(减均值除标准差)
scaler  = StandardScaler()
X_test_poly_scaled = scaler.fit_transform(X_test_poly)# 模型预测
y_test_pred3 = reg3.predict(X_test_poly_scaled)# 画出样本的散点图
plt.scatter(x_test, y_test, marker='o', color='c', label='test dataset')# 画出预测函数曲线
plt.plot(np.sort(x_test), y_test_pred3[np.argsort(x_test)], color='r', label='3 order')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

10阶多项式模型预测

# 生成多项式数据
poly = PolynomialFeatures(degree=10, include_bias=False)
X_test_poly = poly.fit_transform(X_test)# 数据标准化(减均值除标准差)
scaler  = StandardScaler()
X_test_poly_scaled = scaler.fit_transform(X_test_poly)# 模型预测
y_test_pred10 = reg10.predict(X_test_poly_scaled)# 画出样本的散点图
plt.scatter(x_test, y_test, marker='o', color='c', label='test dataset')# 画出预测函数曲线
plt.plot(np.sort(x_test), y_test_pred10[np.argsort(x_test)], color='r', label='10 order')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

30阶多项式模型预测

# 生成多项式数据
poly = PolynomialFeatures(degree=30, include_bias=False)
X_test_poly = poly.fit_transform(X_test)# 数据标准化(减均值除标准差)
scaler  = StandardScaler()
X_test_poly_scaled = scaler.fit_transform(X_test_poly)# 模型预测
y_test_pred30 = reg30.predict(X_test_poly_scaled)# 画出样本的散点图
plt.scatter(x_test, y_test, marker='o', color='c', label='test dataset')# 画出预测函数曲线
plt.plot(np.sort(x_test), y_test_pred30[np.argsort(x_test)], color='r', label='30 order')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

指标对比

# 计算MSE
mse1 = mean_squared_error(y_test_pred1, y_test)
mse3 = mean_squared_error(y_test_pred3, y_test)
mse10 = mean_squared_error(y_test_pred10, y_test)
mse30 = mean_squared_error(y_test_pred30, y_test)# 打印结果
print('MSE:')
print('1 order polynomial: {:.2f}'.format(mse1))
print('3 order polynomial: {:.2f}'.format(mse3))
print('10 order polynomial: {:.2f}'.format(mse10))
print('30 order polynomial: {:.2f}'.format(mse30))

得到的MSE如下:

MSE:
1 order polynomial: 191.05
3 order polynomial: 39.71
10 order polynomial: 41.00
30 order polynomial: 85.45

测试集mse指标从好到坏的模型是:3阶多项式、10阶多项式、30阶多项式、1阶多项式。

1.4 多项式拟合实例相关推荐

  1. java 多项式拟合最多的项数_Matlab概率统计与曲线拟合

    一.二项分布 二项分布来源于伯努利试验 (事件发生概率 ) : 含义为独立重复N次试验后, 事件总共发生k次的概率 分布函数 二项分布记为 binopdf 获得事件共发生次的概率 binocdf 为事 ...

  2. pytorch_lesson13.2 模型拟合度概念介绍+模型欠拟合实例+单隐藏层激活函数性能比较+相同激活函数不同隐藏层数结果对比+神经网络结构选择策略

    提示:仅仅是学习记录笔记,搬运了学习课程的ppt内容,本意不是抄袭!望大家不要误解!纯属学习记录笔记!!!!!! 文章目录 前言 一.模型拟合度概念介绍与实验 1.测试集的"不可知" ...

  3. Java 使用 Apache commons-math3 线性拟合、非线性拟合实例(带效果图)

    Java 使用 CommonsMath3 的线性和非线性拟合实例,带效果图 例子查看 GitHub Gitee 在线查看 运行src/main/java/org/wfw/chart/Main.java ...

  4. 趋势预测方法(一) 多项式拟合(最小二乘法)_函数拟合

    多项式拟合(最小二乘法) a基本原理: b拟合函数原理: c方法优缺点: 优点: 思想简单,实现容易.建模迅速,对于小数据量.简单的关系很有效. 解决回归问题,拥有很好的解释性. 是很多非线性模型的基 ...

  5. matlab多项式拟合要求系数项大于零,matlab多项式系数

    要求一高阶多项式的根往 往须借助数值方法,所 幸MATLAB已将这些数值方法写成一函数 roots(p),我们只要输入多项式的各阶系数 (以 p 代表)即可求解到对应的根 >...... 2. ...

  6. Matlab作图多项式拟合

    一.拟合函数 polyfit(s,y,n) polyval(p,x) poly2str(p,' x ' ) 二.拟合步骤 1.做原始数据的散点图 2.选择恰当的次数n,用polyfit指令求得多项式 ...

  7. 利用numpy对已知样本点进行多项式拟合

    0.导入相关包: import matplotlib.pyplot as plt import numpy as np 1.假设有如下样本点: #使用随机数产生样本点 x=[1,2,3,4,5,6,7 ...

  8. matlab 多项式拟合 ployval

    多项式拟合 ployval clc,clear; x=[19 25 31 38 44]'; y=[19.0 32.3 49.0 73.3 97.8]'; r=[ones(5,1),x.^2]; ab= ...

  9. NASA科学家联名求撤稿:金星有生命迹象是大乌龙,12阶多项式拟合不靠谱

    萧箫 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 还记得9月14号那篇"金星上有生命"的Nature子刊论文吗? 天文学家在金星"大气层"中观测 ...

最新文章

  1. awk4.0 — awk格式化
  2. 「AutoML」激活函数如何进行自动学习和配置
  3. lwip之数据收发流程_1
  4. springCloud - 第2篇 - 服务的发现 seeParam
  5. PDF免费转word方法
  6. Windows 7安装Virtual Server 2005 R2 SP1
  7. linux里没有vi编辑器怎么办,如果是linux没有vi、vim等编辑器如何操作
  8. Aircrack-ng破解无线WIFI密码
  9. DID会固定年份吗_互助问答第31期:固定效应与随机效应选择和面板数据处理
  10. 【Android】APK应用安装过程源码解析
  11. 变量修改器(modifier)
  12. 密码学,有限域GF(2^8)乘法计算,不可约多项式为P(x)=x^8+x^4+x^3+x+1
  13. 百度违规屏蔽关键词工具
  14. 读懂K线,就能理解期货股票交易中人性的期望、猜疑、幻想、贪婪、恐惧...
  15. 成为Linux大神——必须要具备的基本技能!
  16. [摄影学习]-ZFC进阶操作学习
  17. 详解Android刘海屏适配
  18. CSS(基础,面试,常见用例)
  19. 学习VGG(网络讲解+代码)
  20. 操作系统学习笔记——第二章 进程的描述与控制(二)

热门文章

  1. 数据库完整型概念与完整性约束
  2. bzoj 3495: PA2010 Riddle(2-SAT)
  3. bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛
  4. bzoj 1606 [Usaco2008 Dec]Hay For Sale 购买干草(01背包)
  5. opencv 显示程序运行时间
  6. [python+pip] 使用pip将函数库安装到Python环境或Anaconda环境
  7. 贺利坚老师汇编课程50笔记:call和ret配合
  8. [Leetcode] Reorder List
  9. 清涟基因--顾大夫工作室相关网站
  10. Android开发新手常见的10个误区