回归-多项式回归

news/2024/10/18 7:53:48/

1、什么是多项式回归

线性回归适用于数据呈线性分布的回归问题.如果数据样本呈明显非线性分布,线性回归模型就不再适用(下图左),而采用多项式回归可能更好(下图右).例如:

2、模型定义

与线性模型相比,多项式模型引入了高次项,自变量的指数大于1,例如一元二次方程:

y = w_0 + w_1x + w_2x^2

一元三次方程:

y = w_0 + w_1x + w_2x^2 + w_3x ^ 3

推广到一元n次方程:

y = w_0 + w_1x + w_2x^2 + w_3x ^ 3 + ... + w_nx^n

上述表达式可以简化为:

y = \sum_{i=1}^N w_ix^i

3、多项式回归与线性回归的关系

多项式回归可以理解为线性回归的扩展,在线性回归模型中添加了新的特征值.例如,要预测一栋房屋的价格,有x_1, x_2, x_3三个特征值,分别表示房子长、宽、高,则房屋价格可表示为以下线性模型:

y = w_1 x_1 + w_2 x_2 + w_3 x_3 + b

对于房屋价格,也可以用房屋的体积,而不直接使用x_1, x_2, x_3三个特征:

y = w_0 + w_1x + w_2x^2 + w_3x ^ 3

相当于创造了新的特征x, x = 长 * 宽 * 高. 以上两个模型可以解释为:

  • 房屋价格是关于长、宽、高三个特征的线性模型

  • 房屋价格是关于体积的多项式模型

因此,可以将一元n次多项式变换成n元一次线性模型.

4、代码实现

# 多项式回归示例
import numpy as np
import sklearn.linear_model as lm
import sklearn.metrics as sm
import matplotlib.pyplot as mp
import sklearn.pipeline as pl
import sklearn.preprocessing as sptrain_x, train_y = [], []   # 输入、输出样本
with open("poly_sample.txt", "rt") as f:for line in f.readlines():data = [float(substr) for substr in line.split(",")]train_x.append(data[:-1])train_y.append(data[-1])train_x = np.array(train_x)  # 二维数据形式的输入矩阵,一行一样本,一列一特征
train_y = np.array(train_y)  # 一维数组形式的输出序列,每个元素对应一个输入样本
# print(train_x)
# print(train_y)model = pl.make_pipeline(sp.PolynomialFeatures(3), # 多项式特征扩展,扩展最高次项为3lm.LinearRegression())# 用已知输入、输出数据集训练回归器
model.fit(train_x, train_y)
# print(model[1].coef_)
# print(model[1].intercept_)# 根据训练模型预测输出
pred_train_y = model.predict(train_x)# 评估指标
err4 = sm.r2_score(train_y, pred_train_y)  # R2得分, 范围[0, 1], 分值越大越好
print(err4)# 在训练集之外构建测试集
test_x = np.linspace(train_x.min(), train_x.max(), 1000)
pre_test_y = model.predict(test_x.reshape(-1, 1)) # 对新样本进行预测# 可视化回归曲线
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(train_x, train_y, c='dodgerblue', alpha=0.8, s=60, label='Sample')mp.plot(test_x, pre_test_y, c='orangered', label='Regression')mp.legend()
mp.show()

结果:

 

原创不易,转载请标明出处!


http://www.ppmy.cn/news/701380.html

相关文章

Python手机销售系统

手机销售系统手机品牌 手机价格 库存数量vivoX9 2798 25iphone7(32G) 4888 31iphone7(128G) 5668 22iphone7P(128G) 6616 29iphone6(16G) 3858 14............ 功能要求:四个选项:1.查看所有手机品牌1.vivoX92.iphon…

Python数据拟合:线性、多项式和对数拟合

Python数据拟合:线性、多项式和对数拟合 在数据分析中,拟合是一种常用的方法,可以通过将数据点与一个特定类型的函数进行匹配来预测未来的趋势。Python提供了多种拟合方法,包括线性、多项式和对数拟合。 一. 线性拟合 线性拟合是将数据点拟合成一条直线的过程。在Python…

基于python的-手机销售系统

# 手机销售系统 # 手机品牌 手机价格 库存数量 # vivoX9 2798 25 # iphone7(32G) 4888 31 # iphone7(128G) 5668 22 # iphone7P(128G) 6616 29 # iphone6(16G) 3858 14 # .... # ..…

MATLAB-多项式曲线回归拟合

利用多项式函数拟合数据点 ,多项式函数的形式如下: 令 ,

kotlin数组和集合

一、Kotlin数组 1.对象数组 由Kotlin的main函数的写法&#xff0c;可以看出Kotlin中的对象数组写法与泛型的写法很像。 fun main(args: Array<String>){ } 声明对象数组的三种形式&#xff1a; (1)使用arrayOf函数和指定的数组元素创建数组 //Java写法: String[] p…

leetcode:拥有糖果最多的孩子

拥有最多糖果的孩子 给你一个数组 candies 和一个整数 extraCandies &#xff0c;其中 candies[i] 代表第 i 个孩子拥有的糖果数目。 对每一个孩子&#xff0c;检查是否存在一种方案&#xff0c;将额外的 extraCandies 个糖果分配给孩子们之后&#xff0c;此孩子有 最多 的糖果…

动态加载 so 注意事项案例,hashmap和concurrenthashmap的区别

android.os.Build.SUPPORTED_ABIS android.os.Build.CPU_ABI android.os.Build. CPU_ABI2 这些变量用于查询设备支持的架构&#xff0c;其中 SUPPORTED_ABIS 是API Level 21引入来代替CPU_ABI, CPU_ABI2的。 如果目标平台的 API Level 小于 21&#xff0c;只能使用 CPU_ABI …

python 小项目--手机销售系统

学Python也有4天了 不得不吐槽 用缩进来控制代码块 对于我Java程序员 挺痛苦的 大概半小时把 写了一个小案例 bug肯定是很多 对于这种命令行的系统 大一C语言的学生成绩管理系统 我整整写了一周 ……源代码在下面 勿喷~_~ #codingutf-8 import os #初始化数据 def init…