基于PSO优化LSSVM的时序预测MATLAB实战

news2024/11/16 13:34:14

    今天给大家分享PSO优化LSSVM的时序预测代码实战,主要从算法原理和代码实战展开。需要了解更多算法代码的,可以点击文章左下角的阅读全文,进行获取哦~需要了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦,下一期分享的内容就是你想了解的内容~


一、算法原理

    支持向量机是针对小样本问题,基于结构风险最小化,较好地解决了以往机器学习模型中的过学习、非线性、维数灾难以及局部极小值等问题,具有较好的泛化能力;然而,该方法在大规模训练样本时,存在训练速度慢、稳定性差等缺陷,从而制约了其使用范围(学习过程中需要求解二次规划问题)。为加快支持向量机的训练速度和简化计算复杂度,最小二乘支持向量机(Least Square Support Vector Machine, LSSVM)被提出。最小二乘支持向量机(LSSVM)是标准支持向量机的一种扩展,该算法将支持 向量机的求解从二次规划问题转化为线性方程组。它与支持向量机的不同之处在于它把不等式约束改成等式约束,并把经验风险由偏差的一次方改为二次方。

    本文分享的实战为时序预测问题是一类回归问题,因此接下来介绍的算法原理为最小二乘支持向量回归算法(LSSVR)。

(1)构建LSSVR的优化问题的目标函数:

  (2) 将传统SVM的不等式约束转换为等式约束:

(3)构造拉格朗日函数:

(4)进行KKT转换,得到最优对应的约束条件:

(5)得到对应的线性方程系统为:

(6)最终求解得到:

   关于粒子群算法的原理可以参考我以前的文章:

matlab编程第五期--粒子群优化算法实战


二、代码实战

%% 文件说明% main.m   : 主文件,进行预测,将生成的网络保存到 'nets.mat'中% main_back.m : 使用'nets.mat'重现结果% nets.mat : 保存 3 * 48 个grnn网络,用于结果重现% QLD1.csv : 原始数据(用的什么时候的数据你点开看一下就明白了)% QLD1.mat : 导成matlab格式的数据% adaboost : 组合算法, 输出结果的第一个数是组合后的mape%% 原理% 输入前一个周7个相同时间点的数据 得到本周7个相同时间点的数据% 不用执行本文件,运行`main_back.m`即可看到结果% net1MeanMape =%    0.0165        <- grnn1% net2MeanMape =%    0.0168        <- grnn2% net3MeanMape =%    0.0168        <- grnn3% combineMeanMapes =%    0.0157        <- adaboostclc;close;clear;testWeekNum  = 1;%% 训练数据周数trainWeekNum = 228;load QLD1;QLD1 = reshape(QLD1, 48, length(QLD1)/48);testWeekInd  = 1;trainWeekInd = 1 + (1:trainWeekNum);testWeekX = [];testWeekY = [];for yWeekInd = testWeekInd    yWeekDayInd = (yWeekInd*7-6):(yWeekInd*7);    xWeekDayStart = yWeekInd * 7 + 1;    xWeekDayEnd = (yWeekInd + 1) * 7;    xWeekDayInd = xWeekDayStart:xWeekDayEnd;    yDayData = QLD1(:, yWeekDayInd);    xDayData = QLD1(:, xWeekDayInd);        testWeekY = [testWeekY yDayData'];    testWeekX = [testWeekX xDayData'];endtrainWeekX = [];trainWeekY = [];for yWeekInd = trainWeekInd    yWeekDayInd = (yWeekInd*7-6):(yWeekInd*7);    xWeekDayStart = yWeekInd * 7 + 1;    xWeekDayEnd = (yWeekInd + 1) * 7;    xWeekDayInd = xWeekDayStart:xWeekDayEnd;    yDayData = QLD1(:, yWeekDayInd);    xDayData = QLD1(:, xWeekDayInd);        trainWeekY = [trainWeekY yDayData'];    trainWeekX = [trainWeekX xDayData'];endnets = {};netMapes = [];for time = 1:48    disp([' time:', num2str(time)]);    testInd  = (0:(testWeekNum-1))  * 48 + time;    trainInd = (0:(trainWeekNum-1)) * 48 + time;    global trainX trainY xmap ymap testX testY;    testX  = testWeekX(:, testInd);    testY  = testWeekY(:, testInd);    trainX = trainWeekX(:,trainInd);    trainY = trainWeekY(:,trainInd);    [trainX, xmap] = mapminmax(trainX, 0.0000001, 1);    [trainY, ymap] = mapminmax(trainY, 0.0000001, 1);    testX = mapminmax('apply', testX, xmap);    [bestGam, bestSig2] = optimizeLSSVM();    rand('seed', 2);    net = initlssvm(trainX', trainY', 'function estimation', bestGam, bestSig2, 'RBF_kernel');    net = trainlssvm(net);    ySim = simlssvm(net, testX')';    ySim = mapminmax('reverse', ySim, ymap);    mape_ = mape(testY, ySim);    nets{time, 1} = net;    netMapes = [netMapes mape_];endmeanMape = mean(netMapes)save nets nets;
%% 48 7 -> 7clc;close;clear;testWeekNum  = 1;  trainWeekNum = 228;load QLD1;load nets;QLD1 = reshape(QLD1, 48, length(QLD1)/48);netMapes = [];testWeekInd  = 1;trainWeekInd = 1 + (1:trainWeekNum);testWeekX = [];testWeekY = [];for yWeekInd = testWeekInd    yWeekDayInd = (yWeekInd*7-6):(yWeekInd*7);    xWeekDayStart = yWeekInd * 7 + 1;    xWeekDayEnd = (yWeekInd + 1) * 7;    xWeekDayInd = xWeekDayStart:xWeekDayEnd;    yDayData = QLD1(:, yWeekDayInd);    xDayData = QLD1(:, xWeekDayInd);        testWeekY = [testWeekY yDayData'];    testWeekX = [testWeekX xDayData'];endtrainWeekX = [];trainWeekY = [];for yWeekInd = trainWeekInd    yWeekDayInd = (yWeekInd*7-6):(yWeekInd*7);    xWeekDayStart = yWeekInd * 7 + 1;    xWeekDayEnd = (yWeekInd + 1) * 7;    xWeekDayInd = xWeekDayStart:xWeekDayEnd;    yDayData = QLD1(:, yWeekDayInd);    xDayData = QLD1(:, xWeekDayInd);        trainWeekY = [trainWeekY yDayData'];    trainWeekX = [trainWeekX xDayData'];endfor time = 1:48    disp([' time:', num2str(time)]);    testInd  = (0:(testWeekNum-1))  * 48 + time;    trainInd = (0:(trainWeekNum-1)) * 48 + time;    global trainX trainY xmap ymap testX testY;    testX  = testWeekX(:, testInd);    testY  = testWeekY(:, testInd);    trainX = trainWeekX(:,trainInd);    trainY = trainWeekY(:,trainInd);    [trainX, xmap] = mapminmax(trainX, 0.0000001, 1);    [trainY, ymap] = mapminmax(trainY, 0.0000001, 1);    testX = mapminmax('apply', testX, xmap);    net = nets{time, 1};    ySim = simlssvm(net, testX')';    ySim = mapminmax('reverse', ySim, ymap);    mape_ = mape(testY, ySim);    netMapes = [netMapes mape_];end  % end timemeanMape = mean(netMapes)figure(1)plot(ySim,'r');hold on plot(testY,'b');

仿真结果:

完整代码


    部分知识来源于网络,如有侵权请联系作者删除~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL-每日一题【196.删除重复的电子邮箱】

题目 表: Person 编写一个 SQL 删除语句来 删除 所有重复的电子邮件&#xff0c;只保留一个id最小的唯一电子邮件。 以 任意顺序 返回结果表。 &#xff08;注意&#xff1a; 仅需要写删除语句&#xff0c;将自动对剩余结果进行查询&#xff09; 查询结果格式如下所示。 示…

电脑密码忘了怎么解除?分享4个好方法!

我的电脑设置了一个密码&#xff0c;但刚刚想开电脑的时候怎么也想不到那个密码了&#xff01;电脑密码忘了怎么解除&#xff1f;有什么好的方法吗&#xff1f; 为电脑设置一个密码可以更好地保护我们的电脑数据。但有时候我们在输入密码时可能会忘记密码&#xff0c;这将导致我…

考虑学PMP认证的项目经理,听我一句劝

早上好&#xff0c;我是老原。昨天3月份的考试成绩出了&#xff0c;我的朋友圈跟过年似的。 参加完3月的考试的同学体感普遍不是很好&#xff0c;本以为大家能过就很优秀了嘛&#xff0c;没想到是3A满天飞…… 我结合自己和一些同学的备考经历&#xff0c;分享一些备考思路。 …

【c++】并行编程:OpenMP入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍OpenMP入门。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#x1f9…

“希尔排序:打破时间瓶颈的排序算法 “

文章目录 &#x1f50d;什么是希尔排序&#x1f511;希尔排序分组思想&#x1f4c8;希尔排序的优缺点&#x1f468;‍&#x1f4bb;希尔排序代码剖析 &#x1f50d;什么是希尔排序 希尔排序&#xff08;Shell Sort&#xff09;是插入排序的一种高效率的改进版本&#xff0c;也…

浏览器缓存方式有哪些(cookie、localstorage、sessionstorage)

浏览器缓存方式 概要 http缓存 基于HTTP协议的浏览器文件级缓存机制 websql 只有较新的chrome浏览器支持&#xff0c;并以一个独立规范形式出现 indexDB 一个为了能够在客户端存储可观数量的结构化数据&#xff0c;并且在这些数据上使用索引进行高性能检索的 API Cooki…

v-model双向绑定指令

文章目录 前言v-model.lazy 延迟同步v-model.trim 去掉空格 前言 v-model指令是Vue.js中实现双向数据绑定的一种重要机制。它可以将表单控件的值与Vue.js实例中的数据进行双向绑定&#xff0c;即当表单控件的值发生变化时&#xff0c;Vue.js实例中的数据也会随之更新&#xff…

qt实现漂亮主页面

模仿自feiyangqingyun的博客_CSDN博客-Qt/C控件SDK使用示例,Qt/C音视频开发,Qt/C自定义控件领域博主 1.无边框窗口可移动 #ifndef MOVABLE_WIDGET_H #define MOVABLE_WIDGET_H#include <QWidget>class movable_widget:public QWidget { public:movable_widget(QWidget *…

华为荣耀6X(BLN-AL20)解锁全过程

这台旧手机一直闲置&#xff0c;想用它做测试机&#xff0c;所以必须先解锁。在此之前我已将手机改成了直供电&#xff0c;所以图片里没有电池&#xff0c;但是目前直供电方案并不完美&#xff0c;除了直供电线要插&#xff0c;尾插也要插上&#xff0c;淘宝卖家给出的理由是普…

部署 CNI网络组件

部署 flannel K8S 中 Pod 网络通信&#xff1a; ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享同一个网络命令空间&#xff0c; 相当于它们在同一台机器上一样&#xff0c;可以用 localhost 地址访问彼此的端…

如何看待程序员的高薪现象?

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 最近在知乎上看到这样个话题&#xff1a; 难道不应该吗&#xff1f; 本人月薪八千&#xff0c;在北京一线&#xff0c;拿着最基础的工资&#xff0c;上的加班最频繁的班&#xff0c;干最累的活…

STM32模拟SPI协议控制数字电位器MCP41010电阻值

STM32模拟SPI协议控制数字电位器MCP41010电阻值 MCP41010是单路8位分辨率数字电位器&#xff0c;通过SPI接口可控制电位器阻值分配&#xff0c;相当于PW0端在PA0和PB0之间滑动。如下图所示&#xff1a; MCP41010是10K欧姆规格的数字电位器&#xff0c;即PA0和PB0之间的阻值恒…

Spring Boot 中的 @HystrixCommand 注解

Spring Boot 中的 HystrixCommand 注解 简介 在分布式系统中&#xff0c;服务之间的调用是不可避免的。但随着服务数量的增加&#xff0c;服务之间的依赖关系也会变得越来越复杂&#xff0c;服务的故障也会变得越来越常见。一旦某个服务出现故障&#xff0c;它所依赖的服务也…

Helm之深入浅出Kubernetes包管理工具基础

Helm 基础 作者&#xff1a;行癫&#xff08;盗版必究&#xff09; 一&#xff1a;Helm 简介 1.简介 ​ Helm 是 Kubernetes 的包管理器&#xff1b;它提供了提供、共享和使用为 Kubernetes 构建的软件的能力&#xff1b;是CNCF的毕业项目&#xff0c;自 Helm 加入 CNCF 以来…

【Canal】从原理、配置出发,从0到1完成Canal搭建

文章目录 简介工作原理MySQL主备复制原理canal 工作原理 Canal架构Canal-HA机制应用场景同步缓存 Redis /全文搜索 ES下发任务数据异构 MySQL 配置开启 binlog扩展statementrowmixed 配置权限 Canal 配置配置启动报错解决 实战引入依赖代码样例测试 前几天在网上冲浪的时候发现…

MYSQL03高级_新增用户、授予权限、授权底层表结构、角色理解

文章目录 ①. 登录服务器操作②. 用户的增删改③. 修改用户密码④. MySQL8密码管理⑤. 权限列表及原则⑥. 授予查看回收权限⑦. 底层权限表操作⑧. 角色的理解 ①. 登录服务器操作 ①. 启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下: mysql –h hostname|hos…

chatgpt赋能python:搜索Python答案的软件

搜索Python答案的软件 介绍&#xff1a;什么是搜索Python答案的软件&#xff1f; 搜索Python答案的软件是一种工具&#xff0c;可以帮助编程人员快速地找到他们在编写Python代码时遇到的问题的答案。这种软件可以搜索各种不同的网站&#xff0c;以帮助用户找到最适合他们问题…

实例006 菜级联菜单

实例说明 如果管理程序功能菜单非常多&#xff0c;一些功能中又包括许多子功能&#xff0c;这时可以使用级联菜单来组织系统的各个功能。实例运行结果如图1.6所示。 图1.6 级联菜单 技术要点 制作级联菜单需要使用MenuStrip控件。 注意&#xff1a;在使用级联菜单时最好不要…

Redis三种模式——主从复制、哨兵、集群

目录 一、概述 二、 Redis 主从复制 1.主从复制的作用 2. 主从复制流程 3. 搭建Redis 主从复制 3.1准备环境 3.2安装redis 3.3创建redis工作目录 3.4环境变量 3.5定义systemd服务管理脚本 3.6修改 Redis 配置文件&#xff08;Master节点操作&#xff09; 3.7修改 …