1.4 多项式拟合实例
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 多项式拟合实例相关推荐
- java 多项式拟合最多的项数_Matlab概率统计与曲线拟合
一.二项分布 二项分布来源于伯努利试验 (事件发生概率 ) : 含义为独立重复N次试验后, 事件总共发生k次的概率 分布函数 二项分布记为 binopdf 获得事件共发生次的概率 binocdf 为事 ...
- pytorch_lesson13.2 模型拟合度概念介绍+模型欠拟合实例+单隐藏层激活函数性能比较+相同激活函数不同隐藏层数结果对比+神经网络结构选择策略
提示:仅仅是学习记录笔记,搬运了学习课程的ppt内容,本意不是抄袭!望大家不要误解!纯属学习记录笔记!!!!!! 文章目录 前言 一.模型拟合度概念介绍与实验 1.测试集的"不可知" ...
- Java 使用 Apache commons-math3 线性拟合、非线性拟合实例(带效果图)
Java 使用 CommonsMath3 的线性和非线性拟合实例,带效果图 例子查看 GitHub Gitee 在线查看 运行src/main/java/org/wfw/chart/Main.java ...
- 趋势预测方法(一) 多项式拟合(最小二乘法)_函数拟合
多项式拟合(最小二乘法) a基本原理: b拟合函数原理: c方法优缺点: 优点: 思想简单,实现容易.建模迅速,对于小数据量.简单的关系很有效. 解决回归问题,拥有很好的解释性. 是很多非线性模型的基 ...
- matlab多项式拟合要求系数项大于零,matlab多项式系数
要求一高阶多项式的根往 往须借助数值方法,所 幸MATLAB已将这些数值方法写成一函数 roots(p),我们只要输入多项式的各阶系数 (以 p 代表)即可求解到对应的根 >...... 2. ...
- Matlab作图多项式拟合
一.拟合函数 polyfit(s,y,n) polyval(p,x) poly2str(p,' x ' ) 二.拟合步骤 1.做原始数据的散点图 2.选择恰当的次数n,用polyfit指令求得多项式 ...
- 利用numpy对已知样本点进行多项式拟合
0.导入相关包: import matplotlib.pyplot as plt import numpy as np 1.假设有如下样本点: #使用随机数产生样本点 x=[1,2,3,4,5,6,7 ...
- 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= ...
- NASA科学家联名求撤稿:金星有生命迹象是大乌龙,12阶多项式拟合不靠谱
萧箫 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 还记得9月14号那篇"金星上有生命"的Nature子刊论文吗? 天文学家在金星"大气层"中观测 ...
最新文章
- awk4.0 — awk格式化
- 「AutoML」激活函数如何进行自动学习和配置
- lwip之数据收发流程_1
- springCloud - 第2篇 - 服务的发现 seeParam
- PDF免费转word方法
- Windows 7安装Virtual Server 2005 R2 SP1
- linux里没有vi编辑器怎么办,如果是linux没有vi、vim等编辑器如何操作
- Aircrack-ng破解无线WIFI密码
- DID会固定年份吗_互助问答第31期:固定效应与随机效应选择和面板数据处理
- 【Android】APK应用安装过程源码解析
- 变量修改器(modifier)
- 密码学,有限域GF(2^8)乘法计算,不可约多项式为P(x)=x^8+x^4+x^3+x+1
- 百度违规屏蔽关键词工具
- 读懂K线,就能理解期货股票交易中人性的期望、猜疑、幻想、贪婪、恐惧...
- 成为Linux大神——必须要具备的基本技能!
- [摄影学习]-ZFC进阶操作学习
- 详解Android刘海屏适配
- CSS(基础,面试,常见用例)
- 学习VGG(网络讲解+代码)
- 操作系统学习笔记——第二章 进程的描述与控制(二)
热门文章
- 数据库完整型概念与完整性约束
- bzoj 3495: PA2010 Riddle(2-SAT)
- bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛
- bzoj 1606 [Usaco2008 Dec]Hay For Sale 购买干草(01背包)
- opencv 显示程序运行时间
- [python+pip] 使用pip将函数库安装到Python环境或Anaconda环境
- 贺利坚老师汇编课程50笔记:call和ret配合
- [Leetcode] Reorder List
- 清涟基因--顾大夫工作室相关网站
- Android开发新手常见的10个误区