机器学习:多项式回归(Python)

多元线性回归闭式解:

closed_form_sol.py

import numpy as np
import matplotlib.pyplot as pltclass LRClosedFormSol:def __init__(self, fit_intercept=True, normalize=True):""":param fit_intercept: 是否训练bias:param normalize: 是否标准化数据"""self.theta = None  # 训练权重系数self.fit_intercept = fit_intercept  # 线性模型的常数项。也即偏置bias,模型中的theta0self.normalize = normalize  # 是否标准化数据if normalize:self.feature_mean, self.feature_std = None, None  # 特征的均值,标准方差self.mse = np.infty  # 训练样本的均方误差self.r2, self.r2_adj = 0.0, 0.0  # 判定系数和修正判定系数self.n_samples, self.n_features = 0, 0  # 样本量和特征数def fit(self, x_train, y_train):"""模型训练,根据是否标准化与是否拟合偏置项分类讨论:param x_train: 训练样本集:param y_train: 训练目标集:return:"""if self.normalize:self.feature_mean = np.mean(x_train, axis=0)  # 按样本属性计算样本均值self.feature_std = np.std(x_train, axis=0) + 1e-8  # 样本方差,为避免零除,添加噪声x_train = (x_train - self.feature_mean) / self.feature_std  # 标准化if self.fit_intercept:x_train = np.c_[x_train, np.ones_like(y_train)]  # 添加一列1,即偏置项样本# 训练模型self._fit_closed_form_solution(x_train, y_train)  # 求闭式解def _fit_closed_form_solution(self, x_train, y_train):"""线性回归的闭式解,单独函数,以便后期扩充维护:param x_train: 训练样本集:param y_train: 训练目标集:return:"""# pinv伪逆,即(A^T * A)^(-1) * A^Tself.theta = np.linalg.pinv(x_train).dot(y_train)  # 非正则化# xtx = np.dot(x_train.T, x_train) + 0.01 * np.eye(x_train.shape[1])  # 按公式书写# self.theta = np.dot(np.linalg.inv(xtx), x_train.T).dot(y_train)def get_params(self):"""返回线性模型训练的系数:return:"""if self.fit_intercept:  # 存在偏置项weight, bias = self.theta[:-1], self.theta[-1]else:weight, bias = self.theta, np.array([0])if self.normalize:  # 标准化后的系数weight = weight / self.feature_std.reshape(-1, 1)  # 还原模型系数bias = bias - weight.T.dot(self.feature_mean)return weight, biasdef predict(self, x_test):"""测试数据预测,x_test:待预测样本集,不包括偏置项1:param x_test::return:"""try:self.n_samples, self.n_features = x_test.shape[0], x_test.shape[1]except IndexError:self.n_samples, self.n_features = x_test.shape[0], 1  # 测试样本数和特征数if self.normalize:x_test = (x_test - self.feature_mean) / self.feature_std  # 测试数据标准化if self.fit_intercept:x_test = np.c_[x_test, np.ones(shape=x_test.shape[0])]  # 存在偏置项,添加一列1return x_test.dot(self.theta)def cal_mse_r2(self, y_pred, y_test):"""计算均方误差,计算拟合优度的判定系数R方和修正判定系数:param y_pred: 模型预测目标真值:param y_test: 测试目标真值:return:"""self.mse = ((y_test - y_pred) ** 2).mean()  # 均方误差# 计算测试样本的判定系数和修正判定系数self.r2 = 1 - ((y_test - y_pred) ** 2).sum() / ((y_test - y_test.mean()) ** 2).sum()self.r2_adj = 1 - (1 - self.r2) * (self.n_samples - 1) / (self.n_samples - self.n_features - 1)return self.mse, self.r2, self.r2_adjdef plt_predict(self, y_pred, y_test, is_show=True, is_sort=True):"""绘制预测值与真实值对比图:return:"""if self.mse is np.infty:self.cal_mse_r2(y_pred, y_test)if is_show:plt.figure(figsize=(7, 5))if is_sort:idx = np.argsort(y_test)plt.plot(y_pred[idx], "r:", lw=1.5, label="Predictive Val")plt.plot(y_test[idx], "k--", lw=1.5, label="Test True Val")else:plt.plot(y_pred, "r:", lw=1.5, label="Predictive Val")plt.plot(y_test, "k--", lw=1.5, label="Test True Val")plt.xlabel("Test sample observation serial number", fontdict={"fontsize": 12})plt.ylabel("Predicted sample value", fontdict={"fontsize": 12})plt.title("The predictive values of test samples \n MSE = %.5e, R2 = %.5f, R2_adj = %.5f"% (self.mse, self.r2, self.r2_adj), fontdict={"fontsize": 14})plt.legend(frameon=False)plt.grid(ls=":")if is_show:plt.show()

多项式构造

polynomial_feature.py

import numpy as npclass PolynomialFeatureData:"""生成特征多项式数据"""def __init__(self, x, degree, with_bias=False):"""参数初始化:param x: 采用数据,向量形式:param degree: 多项式最高阶次:param with_bias: 是否需要偏置项"""self.x = np.asarray(x)self.degree = degreeself.with_bias = with_biasif with_bias:self.data = np.zeros((len(x), degree + 1))else:self.data = np.zeros((len(x), degree))def fit_transform(self):"""构造多项式特征数据:return:"""if self.with_bias:self.data[:, 0] = np.ones(len(self.x))self.data[:, 1] = self.x.reshape(-1)for i in range(2, self.degree + 1):self.data[:, i] = (self.x ** i).reshape(-1)else:self.data[:, 0] = self.x.reshape(-1)for i in range(1, self.degree):self.data[:, i] = (self.x ** (i + 1)).reshape(-1)return self.dataif __name__ == '__main__':x = np.random.randn(5)feat_obj = PolynomialFeatureData(x, 5, with_bias=True)data = feat_obj.fit_transform()print(data)

 多项式回归

test_polynomial_fit.py

import numpy as np
import matplotlib.pyplot as plt
from polynomial_feature import PolynomialFeatureData
from closed_form_sol import LRClosedFormSoldef objective_fun(x):"""目标函数,假设一个随机二次多项式:param x: 采样数据,向量:return:"""return 0.5 * x ** 2 + x + 2np.random.seed(42)  # 随机种子,以便结果可再现
n = 30  # 样本量
raw_x = np.sort(6 * np.random.rand(n, 1) - 3)  # 采样数据[-3, 3],均匀分布
raw_y = objective_fun(raw_x) + 0.5 * np.random.randn(n, 1)  # 目标值,添加噪声degree = [1, 2, 5, 10, 15, 20]  # 拟合多项式的最高阶次
plt.figure(figsize=(15, 8))
for i, d in enumerate(degree):feature_obj = PolynomialFeatureData(raw_x, d, with_bias=False)  # 特征数据对象X_samples = feature_obj.fit_transform()  # 生成特征多项式数据lr_cfs = LRClosedFormSol()  # 采用线性回归求解多项式回归lr_cfs.fit(X_samples, raw_y)  # 求解多项式回归系数theta = lr_cfs.get_params()  # 获得系数print("degree: %d, theta is " %d, theta[0].reshape(-1)[::-1], theta[1])y_train_pred = lr_cfs.predict(X_samples)  # 在训练集上的预测# 测试样本采样X_test_raw = np.linspace(-3, 3, 150)  # 测试数据y_test = objective_fun(X_test_raw)  # 测试数据的真值feature_obj = PolynomialFeatureData(X_test_raw, d, with_bias=False)  # 特征数据对象X_test = feature_obj.fit_transform()  # 生成特征多项式数据y_test_pred = lr_cfs.predict(X_test)  # 模型在测试样本上的预测值# 可视化不同阶次下的多项式拟合曲线plt.subplot(231 + i)plt.scatter(raw_x, raw_y, edgecolors="k", s=15, label="Raw Data")plt.plot(X_test_raw, y_test, "k-", lw=1, label="Objective Fun")plt.plot(X_test_raw, y_test_pred, "r--", lw=1.5, label="Polynomial Fit")plt.legend(frameon=False)plt.grid(ls=":")plt.xlabel("$x$", fontdict={"fontsize": 12})plt.ylabel("$y(x)$", fontdict={"fontsize": 12})test_ess = (y_test_pred.reshape(-1) - y_test) ** 2  # 误差平方test_mse, test_std = np.mean(test_ess), np.std(test_ess)train_ess = (y_train_pred - raw_y) ** 2  # 误差平方train_mse, train_std = np.mean(train_ess), np.std(train_ess)plt.title("Degree {} Test Mse = {:.2e}(+/-{:.2e}) \n Train Mse = {:.2e}(+/-{:.2e})".format(d, test_mse, test_std, train_mse, train_std))plt.axis([-3, 3, 0, 9])
plt.tight_layout()
plt.show()

输出结果:

学习曲线

learning_curve1.py

import numpy as np
import matplotlib.pyplot as plt
from polynomial_feature import PolynomialFeatureData
from closed_form_sol import LRClosedFormSol
from sklearn.model_selection import train_test_splitdef objective_fun(x):"""目标函数,假设一个随机二次多项式:param x: 采样数据,向量:return:"""return 0.5 * x ** 2 + x + 2np.random.seed(42)  # 随机种子,以便结果可再现
n = 100  # 样本量
raw_x = np.sort(6 * np.random.rand(n, 1) - 3)  # 采样数据[-3, 3],均匀分布
raw_y = objective_fun(raw_x) + 0.5 * np.random.randn(n, 1)  # 目标值,添加噪声degree = [1, 2, 5, 10]  # 拟合阶次
plt.figure(figsize=(10, 7))  # 图像尺寸
for i, d in enumerate(degree):# 生成特征多项式对象,包含偏置项feta_obj = PolynomialFeatureData(raw_x, d, with_bias=False)X_sample = feta_obj.fit_transform()  # 生成特征多项式数据X_train, X_test, y_train, y_test = \train_test_split(X_sample, raw_y, test_size=0.2, random_state=0)train_mse, test_mse = [], []  # 随样本量的增加,训练误差和测试误差for j in range(1, 80):lr_cfs = LRClosedFormSol()  # 线性回归闭式解theta = lr_cfs.fit(X_train[:j, :], y_train[:j])  # 拟合多项式y_test_pred = lr_cfs.predict(X_test)  # 测试样本预测y_train_pred = lr_cfs.predict(X_train[:j, :])  # 训练样本预测train_mse.append(np.mean((y_train_pred.reshape(-1) - y_train[:j].reshape(-1)) ** 2))test_mse.append(np.mean((y_test_pred.reshape(-1) - y_test.reshape(-1)) ** 2))# 可视化多项式拟合曲线plt.subplot(221 + i)plt.plot(train_mse, "k-", lw=1, label="Train")plt.plot(test_mse, "r--", lw=1.5, label="Test")plt.legend(frameon=False)plt.grid(ls=":")plt.xlabel("Train Size", fontdict={"fontsize": 12})plt.ylabel("MSE", fontdict={"fontsize": 12})plt.title("Learning Curve by Degree {}".format(d))if i == 0:plt.axis([0, 80, 0, 4])if i == 1:plt.axis([0, 80, 0, 1])if i in [2, 3]:plt.axis([0, 80, 0, 2])
plt.tight_layout()
plt.show()

 

学习曲线(采用10折交叉验证)

learning_curve2.py

import numpy as np
import matplotlib.pyplot as plt
from polynomial_feature import PolynomialFeatureData
from closed_form_sol import LRClosedFormSol
from sklearn.model_selection import KFolddef objective_fun(x):"""目标函数,假设一个随机二次多项式:param x: 采样数据,向量:return:"""return 0.5 * x ** 2 + x + 2np.random.seed(42)  # 随机种子,以便结果可再现
n = 300  # 样本量
raw_x = np.sort(6 * np.random.rand(n, 1) - 3)  # 采样数据[-3, 3],均匀分布
raw_y = objective_fun(raw_x) + 0.5 * np.random.randn(n, 1)  # 目标值,添加噪声k_fold = KFold(n_splits=10)  # 划分为10折
degree = [1, 2, 4, 6, 8, 10]  # 拟合阶次
plt.figure(figsize=(15, 8))  # 图像尺寸
for i, d in enumerate(degree):# 生成特征多项式对象,包含偏置项feta_obj = PolynomialFeatureData(raw_x, d, with_bias=False)X_sample = feta_obj.fit_transform()  # 生成特征多项式数据train_mse, test_mse = [], []  # 随样本量的增加,训练误差和测试误差for j in range(1, 270):train_mse_, test_mse_ = 0.0, 0.0  # 交叉验证for idx_train, idx_test in k_fold.split(raw_x, raw_y):X_train, y_train = X_sample[idx_train], raw_y[idx_train]X_test, y_test = X_sample[idx_test], raw_y[idx_test]lr_cfs = LRClosedFormSol()  # 线性回归闭式解theta = lr_cfs.fit(X_train[:j, :], y_train[:j])  # 拟合多项式y_test_pred = lr_cfs.predict(X_test)  # 测试样本预测y_train_pred = lr_cfs.predict(X_train[:j, :])  # 训练样本预测train_mse_ += np.mean((y_train_pred.reshape(-1) - y_train[:j].reshape(-1)) ** 2)test_mse_ += np.mean((y_test_pred.reshape(-1) - y_test.reshape(-1)) ** 2)train_mse.append(train_mse_ / 10)test_mse.append(test_mse_ / 10)# 可视化多项式拟合曲线plt.subplot(231 + i)plt.plot(train_mse, "k-", lw=1, label="Train")plt.plot(test_mse, "r--", lw=1.5, label="Test")plt.legend(frameon=False)plt.grid(ls=":")plt.xlabel("Train Size", fontdict={"fontsize": 12})plt.ylabel("MSE", fontdict={"fontsize": 12})plt.title("Learning Curve by Degree {}".format(d))if i == 0:plt.axis([0, 250, 0, 4])else:plt.axis([0, 250, 0, 1])
plt.tight_layout()
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/250053.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无法在 word 中登录 Grammarly

目录 1. 情况描述 2. 解决方法 3. 原因分析 1. 情况描述 在浏览器中可以登录 Grammarly,但是在 word 中登录失败,大致如下图所示: 我自己没有截图,这是网上别人的图,但差不多都长这个样子。 2. 解决方法 我点击了…

AJAX-入门

定义 概念:AJAX是浏览器与服务器进行数据通信的技术 使用 1.先使用axios库,与服务器进行数据通信 1)基于XMLHttpRequest封装、代码简单、月下载量在14亿次 2)Vue、React项目中都会用到axios 2.再学习XMLHttpRequest对象的使用…

基于微服务的高考志愿智能辅助决策系统(附源码)

目录 一.引言 1、编写目的 2、系统功能概述 二.功能分析 三.微服务模块 1、微服务用户相关模块 (1)用户注册 (2)用户登录 (3)用户信息管理 (4)用户操作 2、微服务文件云存…

day37WEB攻防-通用漏洞XSS跨站权限维持钓鱼捆绑浏览器漏洞

目录 XSS-后台植入 Cookie&表单劫持(权限维持) 案例演示 XSS-Flash 钓鱼配合 MSF 捆绑上线 1、生成后门 2、下载官方文件-保证安装正常 3、压缩捆绑文件-解压提取运行 4、MSF 配置监听状态 5、诱使受害者访问 URL-语言要适当 XSS-浏览器网马…

Matlab处理excel数据

我们新建个excel文档,用Matlab读取里面的内容,计算和判断里面的计算结果是否正确,并打印到另一个文档当中。 新建文档 新建输入文档,文件名TestExcel 编写脚本 [num,txt] xlsread(TestExcel.xlsx); SNcode num(:,1);%从序号中…

回归预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机多变量回归预测

回归预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机多变量回归预测 目录 回归预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向…

洛谷P8599 [蓝桥杯 2013 省 B] 带分数

[蓝桥杯 2013 省 B] 带分数 题目描述 100 100 100 可以表示为带分数的形式: 100 3 69258 714 100 3 \frac{69258}{714} 100371469258​。 还可以表示为: 100 82 3546 197 100 82 \frac{3546}{197} 100821973546​。 注意特征:带分…

Prompt Learning 的几个重点paper

Prefix Tuning: Prefix-Tuning: Optimizing Continuous Prompts for Generation 在输入token之前构造一段任务相关的virtual tokens作为Prefix,然后训练的时候只更新Prefix部分的参数,PLM中的其他参数固定。针对自回归架构模型:在句子前面添…

Django模型(八)

一、修改数据 先获取对象,通过对象属性更新数据,再保存 (更新单一数据)通过QuerySet的update函数更新数据 (更新多条数据) #单条记录修改 save c = Cook.objects.get(pk=1) c.name = 安妮 c.save()# 更新多个值 update Cook.objects.filter(sect=粤菜).update(level=5)1.1、…

SD-WAN如何解决企业网络面临的问题?

企业网络在不断增长和发展的同时,所面临的问题也越来越多。SD-WAN作为一项崭新的网络技术,正迅速成为企业的首选。究竟SD-WAN在解决企业网络问题上有何独特之处呢? 优化网络性能与带宽利用率 传统广域网常常面临多地点数据传输时的高延迟、低…

【深蓝学院】移动机器人运动规划--第3章 基于采样的路径规划--作业

0. Assignment T1. MATLAB实现RRT 1.1 GPT-4任务分析 RRT伪代码: 任务1即使用matlab实现RRT,结合作业所给框架,简单梳理,可结合1.2代码理解: 设置start,goal,near to goal threshold Thr&am…

MySql主从同步,同步SQL_ERROR 1032解决办法

1.登录从库 mysql -u root -p 2.输入命令查看状态 SHOW SLAVE STATUS\G; 3.找到对应的错误数据位置 Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB: app_push_centerReplicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Tabl…

github连不上

github连不上 错误提示解决方案steam 采用Hosts加速 错误提示 fatal: unable to access ‘https://github.com/Ada-design/qianduan.git/’: Failed to connect to github.com port 443 after 21073 ms: Couldn’t connect to server 解决方案 下载steam https://steampp.ne…

Flutter的安装与环境配置

一、下载安装Futter: 1、Flutter中文文档: 安装和环境配置 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 2、下载 Futter SDK: Flutter中文文档 里面有,下载完成之后找个文件夹解压出来,最好不要将 Flu…

专业数据治理:数据中台系统塑造企业未来的数字化运营管理新秩序

随着信息化进程的快速推进,数据已然成为企业最为宝贵的资产。对于众多企业而言,如何有效整合、治理以及充分利用这些数据,使之成为推动业务发展的引擎,成为当前难题。数据中台应运而生,它被认为是企业数字化转型的至关…

深度解读NVMe计算存储协议-3

在NVMe计算存储架构中,Copy命令用于在不同类型的命名空间之间进行数据复制: Memory Copy命令:定义于SLM(Subsystem Local Memory)命令集,主要用于从非易失性存储命名空间(NVM namespaces&#x…

“IT行业的黄金证书:你必须了解的顶级认证“

文章目录 每日一句正能量前言一、网络方向:思科认证/软考二、华为认证三、系统方向:红帽认证四、数据库方向:Oracle认证五、信息安全方向:CISP/CISSP认证六、管理方向:PMP认证IT行业证书的价值和作用后记 每日一句正能…

XML传参方式

export function groupLoginAPI(xmlData) {return http.post(/tis/group/1.0/login, xmlData, {headers: {Content-Type: application/xml,X-Requested-With: AAServer/4.0,}}) }import {groupLoginAPI} from "../api/user"; function (e) { //xml格式传参let groupX…

前端JavaScript篇之let、const、var的区别

目录 let、const、var的区别 let、const、var的区别 let、const和var是JavaScript中用于声明变量的关键字,它们之间有一些区别。 首先,var是在ES5中引入的关键字,而let和const是在ES6中引入的。在ES6之前,我们只能使用var来声明…

双非本科准备秋招(13.1)—— 力扣 栈、队列与堆

1、103. 二叉树的锯齿形层序遍历 昨天做的二叉树的层序遍历,把代码直接拿过来。 这个题要求的是一个Z型遍历,如下图。 用一个变量f记录正反顺序,然后使用LinkedList记录答案,下图可以看到LinkedList继承了Deque,所以…