文章目录

  • 前言
  • 本次主要是简单的对比了一下线性回归和二次回归的拟合效果对比,查看两种回归之间的差异。
  • 一、引入我们所需要的库
  • 二、创建训练数据集和测试数据集,并绘制训练集的散点图
  • 三.绘制线性回归作用后的线型图
  • 四.绘制二次回归作用后的线型图
  • 五.完整代码和最终显示
  • 六.性能对比
  • 总结



前言

本次主要是简单的对比了一下线性回归和二次回归的拟合效果对比,查看两种回归之间的差异。

一、引入我们所需要的库

如果还有没添加的库,使用(pip install 库名)添加:

# 用于创建向量
import numpy as np
# 用于作图
import matplotlib.pyplot as plt
# 使用线性回归模型
from sklearn.linear_model import LinearRegression
# 生成多项式和交互特征
from sklearn.preprocessing import PolynomialFeatures

二、创建训练数据集和测试数据集,并绘制训练集的散点图

# 允许显示中文(主要是解决用matplotlib绘图时,常出现不显中文或乱码)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

# 创建训练集数据
X_train = [[6], [8], [10], [14], [18]]
y_train = [[7], [9], [13], [17.5], [18]]
# 创建测试集数据
X_test = [[7], [9], [11], [15]]
y_test = [[8], [12], [15], [18]]

# 创建画布
plt.figure(figsize=(10, 8), dpi=80)
# 设置标题
plt.title(u'披萨的价格和直径')
# 设置x轴标签
plt.xlabel(u'直径(inch)')
# 设置y轴标签
plt.ylabel(u'价格(美元)')
# 设置x y轴的刻度范围 设置x轴的范围为[0, 25] y轴的范围为[0, 25]
plt.axis([0, 25, 0, 25])
# 显示网格线
plt.grid(True)
# 在画布上显示散点图(x:训练数据,y:训练标签,s:散点的面积)
plt.scatter(X_train, y_train, s=40)

因为只是简单的对比,也就没有使用很多的数据集,结果:

拟合非线性回归方程 非线性回归的拟合优度_人工智能

三.绘制线性回归作用后的线型图

# 在0到26之间生成一条统一的序列,总共为5个元素
xx = np.linspace(0, 26, 5)
# 定义一个线性回归对象
regressor = LinearRegression()
# 训练模型
regressor.fit(X_train, y_train)
# 返回预测标签
yy = regressor.predict(xx.reshape(xx.shape[0], 1))
# 画出线性回归的曲线
plt.plot(xx, yy, label="linear equation")

拟合非线性回归方程 非线性回归的拟合优度_拟合非线性回归方程_02

四.绘制二次回归作用后的线型图

# 创建多项式特征回归对象【使用degree=2的二次多项式则为(1,a, a^2, ab, b ,b^2)】
pf = PolynomialFeatures(degree=2)
# 首先生成多项式特征
X_pf = pf.fit_transform(X_train)
# 生成密集点 在0到26之间生成一条统一的序列,总共为5个元素
xx = np.linspace(0, 26, 5)
# 转换格式
xx_quadratic = pf.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), 'r-', label="quadratic equation")

拟合非线性回归方程 非线性回归的拟合优度_深度学习_03

五.完整代码和最终显示

# 用于创建向量
import numpy as np
# 用于作图
import matplotlib.pyplot as plt
# 使用线性回归模型
from sklearn.linear_model import LinearRegression
# 生成多项式和交互特征
from sklearn.preprocessing import PolynomialFeatures

# 允许显示中文(主要是解决用matplotlib绘图时,常出现不显中文或乱码)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

# 创建训练集数据
X_train = [[6], [8], [10], [14], [18]]
y_train = [[7], [9], [13], [17.5], [18]]
# 创建测试集数据
X_test = [[7], [9], [11], [15]]
y_test = [[8], [12], [15], [18]]

# 创建画布
plt.figure(figsize=(10, 8), dpi=80)
# 在画布上显示散点图(x:训练数据,y:训练标签,s:散点的面积)
plt.scatter(X_train, y_train, s=40)


# 在0到26之间生成一条统一的序列,总共为5个元素
x_ = np.linspace(0, 26, 5)
# 定义一个线性回归对象
regressor = LinearRegression()
# 训练模型
regressor.fit(X_train, y_train)
# 返回预测标签
yy = regressor.predict(x_.reshape(x_.shape[0], 1))
# 画出线性回归的曲线
plt.plot(x_, yy, label="linear equation")


# 创建多项式特征回归对象【使用degree=2的二次多项式则为(1,a, a^2, ab, b ,b^2)】
pf = PolynomialFeatures(degree=2)
# 首先生成多项式特征
X_pf = pf.fit_transform(X_train)
# 创建线性回归对象
regressor_quadratic = LinearRegression()
# 训练模型(以多项特征处理后的数据做模型)
regressor_quadratic.fit(X_pf, y_train)
# print("系数W:", regressor_quadratic.coef_)
# print("截距B:", regressor_quadratic.intercept_)
# 生成密集点 在0到26之间生成一条统一的序列,总共为5个元素
xx = np.linspace(0, 26, 5)
# 转换格式
xx_quadratic = pf.transform(xx.reshape(xx.shape[0], 1))
# 绘制二次回归线
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), 'r-', label="quadratic equation")


# 设置标题
plt.title(u'披萨的价格和直径')
# 设置x轴标签
plt.xlabel(u'直径(inch)')
# 设置y轴标签
plt.ylabel(u'价格(美元)')
# 设置x y轴的刻度范围 设置x轴的范围为[0, 25] y轴的范围为[0, 25]
plt.axis([0, 25, 0, 25])
# 显示网格线
plt.grid(True)
# 显示图列
plt.legend()
# 显示
plt.show()

拟合非线性回归方程 非线性回归的拟合优度_python_04


在这里由于我们的二次回归线的取点比较少,只有5个点,绘制出来的图形不是特别的圆滑,我们可以把特征点多取点 xx = np.linspace(0, 26, 100) ,再看一下效果:

拟合非线性回归方程 非线性回归的拟合优度_人工智能_05

六.性能对比

# 使用测试数据集
X_test_quadratic = pf.transform(X_test)
# 进行性能评估
print('linear equation  r-squared', regressor.score(X_test, y_test))
print('quadratic equation r-squared', regressor_quadratic.score(X_test_quadratic, y_test))

能明显的看到,进行了二次回归的模型性能远超过了线性回归模型。需要注意的是,不是回归次数越多越好,关于这一方面下次在学习:

拟合非线性回归方程 非线性回归的拟合优度_人工智能_06


总结

由于也是刚开始学习深度学习推荐系统,对于很多的知识也不是特别的了解,如果本篇文章有哪里写的不对,还望大家多多指点。这里的代码主要还是学习和借鉴了中国大学MOOC深度学习基础的课程。