ML.NET 奇异谱分析(SSA Singular spectrum analysis)预测实践

news2024/11/20 7:27:51

一、奇异谱分析(Singular Spectrum Analysis, SSA) 简介

        奇异谱分析(Singular Spectrum Analysis, SSA)是一种处理非线性时间序列数据的方法,通过对所要研究的时间序列的轨迹矩阵进行分解、重构等操作,提取出时间序列中的不同成分序列(长期趋势,季节趋势,噪声等),从而进行对时间序列进行分析或去噪并用于其他一些任务。
  奇异谱分析主要包括四个步骤:嵌入——分解——分组——重构。

        1、嵌入,将有限长度的一维时间序列用合适的时间窗口长度L进行滞后排列得到轨迹轨迹矩阵。

        2、分解,对轨迹矩阵进行奇异值分解,即分解成左矩阵、奇异值、右矩阵相乘。

        3、分组,简单来说将所有的 L 个成分分组为 C 个不相交的组,代表着不同的趋势成分。
        4、重构,用迟滞序列通过时间经验正交函数和时间主成分来进行重建,获得更平滑和趋势明显的序列。

        详细参考:
        https://blog.csdn.net/Lucky_Go/article/details/103109045
        https://ssa.cf.ac.uk/zhigljavsky/pdfs/SSA/SSA_encyclopedia.pdf

二、数据准备

        假设预测物品为某一股票,则在同花顺软件中下载其近二年交易数据,以收盘价作为当日价格。

        同花顺数据文件格式如下:

--===============================================================
-- 文件头16个字节剖析(日线)
-- 0x6864312E3000 6  固定
-- 0x????????     4  记录数
-- 0x4800         2  记录开始位置: 64是错的, 文件头 + 列定义 = 72   0xC000 = 192
-- 0x3800         2  每记录的长度: 56                               0xB000 = 176
-- 0x0E00         2  每记录的列数: 14                               0x2C00 = 44
-----------------------------------------------------------------

-- 列定义: 04表示列长度
-- 0x01300004     4 日期
-- 0x07700004     4 开盘价
-- 0x08700004     4 最高价
-- 0x09700004     4 最低价
-- 0x0B700004     4 收盘价
-- 0x13700004     4 成交金额(元)
-- 0x0D700004     4 成交量(股)
-- 0x0E700004     4 FFFFFFFF
-- 0x0F700004     4 FFFFFFFF
-- 0x11700004     4 FFFFFFFF
-- 0x12700004     4 FFFFFFFF
-- 0x50700004     4 FFFFFFFF
-- 0xE7700004     4 FFFFFFFF
-- 0xE8700004     4 FFFFFFFF
--===============================================================

其交易数据二进制文件头部数据如下:

         由于其原始数据为二进制文件,需将期转换成数据表格以方便算法使用。用SQL语句将数据块直接读入数据表中。部分代码如下:

if object_id('THS.dbo.T600926') is not null drop table THS.dbo.T600926

go

declare @ varbinary(max), @max int, @e float

select @ = BulkColumn, @e = 10 from OPENROWSET(BULK N'/opt/ths/600926.day', SINGLE_BLOB) as bin

--文件记录数
select @max = substring(@,10,1)+substring(@,9,1)+substring(@,8,1)+substring(@,7,1)

--记录开始位置
select top (@max) n = identity(int,192,176) into # from syscolumns a, syscolumns b

;with zhoujy as

(

	select

		-- SQL没有提供按字节reverse(binary)的函数或方法,只能substring每个字节倒过来合成:

		d = convert(int,substring(@, 4+n,1)+substring(@, 3+n,1)+substring(@, 2+n,1)+substring(@, 1+n,1)),

		o = convert(int,substring(@, 8+n,1)+substring(@, 7+n,1)+substring(@, 6+n,1)+substring(@, 5+n,1))&0x0FFFFFFF,

		p = convert(int,substring(@,12+n,1)+substring(@,11+n,1)+substring(@,10+n,1)+substring(@, 9+n,1))&0x0FFFFFFF,

		q = convert(int,substring(@,16+n,1)+substring(@,15+n,1)+substring(@,14+n,1)+substring(@,13+n,1))&0x0FFFFFFF,

		r = convert(int,substring(@,20+n,1)+substring(@,19+n,1)+substring(@,18+n,1)+substring(@,17+n,1))&0x0FFFFFFF,

		s = convert(int,substring(@,24+n,1)+substring(@,23+n,1)+substring(@,22+n,1)+substring(@,21+n,1))&0x0FFFFFFF,

		t = convert(int,substring(@,28+n,1)+substring(@,27+n,1)+substring(@,26+n,1)+substring(@,25+n,1))&0x0FFFFFFF,

		u = convert(int,substring(@, 8+n,1))/16,

		v = convert(int,substring(@,12+n,1))/16,

		w = convert(int,substring(@,16+n,1))/16,

		x = convert(int,substring(@,20+n,1))/16,

		y = convert(int,substring(@,24+n,1))/16,

		z = convert(int,substring(@,28+n,1))/16

	from #

)

select

	id = row_number()over(order by d desc),

	日期 = d,

	开盘 = o*power(@e,(u&7)*power(-1,sign(u&8))),

	最高 = p*power(@e,(v&7)*power(-1,sign(v&8))),

	最低 = q*power(@e,(w&7)*power(-1,sign(w&8))),

	收盘 = r*power(@e,(x&7)*power(-1,sign(x&8))),

	金额 = s*power(@e,(y&7)*power(-1,sign(y&8))),

	成交 = t*power(@e,(z&7)*power(-1,sign(z&8)))

into THS.dbo.T600926 from zhoujy

        得到如下数据表格式,备用 

三、ML.NET中使用奇异谱算法训练模型

        1、抽取数据为以下时间序列格式,以供SSA算法使用

string query = "SELECT Cast(CAST([日期] as varchar(8)) as date) as RentalDate,CAST(IIF( 日期/10000 = 2022, 1, 0 ) as Real) as Year,CAST([收盘] as REAL) as TotalRentals FROM [THS].[dbo].[T002307] order by RentalDate desc";

DatabaseSource dbSource = new DatabaseSource(SqlClientFactory.Instance,
                                connectionString,
                                query);

IDataView dataView = loader.Load(dbSource);

IDataView firstYearData = mlContext.Data.FilterRowsByColumn(dataView, "Year", upperBound: 1);
IDataView secondYearData = mlContext.Data.FilterRowsByColumn(dataView, "Year", lowerBound: 1);

        从数据库读取数据,2022年 firstYearData为培训数据,2021年及以前secondYearData为验证数据。

        2、定义时序分析管道   

var forecastingPipeline = mlContext.Forecasting.ForecastBySsa(
    outputColumnName: "ForecastedRentals",
    inputColumnName: "TotalRentals",
    windowSize: 7,
    seriesLength: 30,
    trainSize: 365,
    horizon: 7,
    confidenceLevel: 0.95f,
    confidenceLowerBoundColumn: "LowerBoundRentals",
    confidenceUpperBoundColumn: "UpperBoundRentals");

   forecastingPipeline 在第一年数据中获取 365 个数据点,并按 seriesLength 参数指定的间隔从时序数据集采样或将其分为 30 天(每月)的间隔。 以一周或 7 天为一个时段分析各个样本。 确定下一个时段的预测值时,使用前面 7 天的值进行预测。 根据 horizon 参数的定义,该模型设置为预测将来的 7 个时段。 由于预测属于合理猜测,它不总是完全准确。 因此,最好了解上限和下限定义的最佳和最坏情况下的范围值。 在本案例中,设置的上下限可信度为 95%。 可信度可以相应地提高或降低。 值越高,上限和下限之间的范围越大,以便达到所需的可信度。 

 3、使用 Fit 方法培训模型,使数据适用于前面定义的 forecastingPipeline

SsaForecastingTransformer forecaster = forecastingPipeline.Fit(firstYearData);

四、评估模型

//评做模型
Evaluate(secondYearData, forecaster, mlContext);



void Evaluate(IDataView testData, ITransformer model, MLContext mlContext)
{
    IDataView predictions = model.Transform(testData);

    IEnumerable<float> actual =
    mlContext.Data.CreateEnumerable<ModelInput>(testData, true)
        .Select(observed => observed.TotalRentals);

    //获取预测值
    IEnumerable<float> forecast =
    mlContext.Data.CreateEnumerable<ModelOutput>(predictions, true)
        .Select(prediction => prediction.ForecastedRentals[0]);

    //计算实际值和预测值之间的差异,通常称为误差。
    var metrics = actual.Zip(forecast, (actualValue, forecastValue) => actualValue - forecastValue);

    //通过计算平均绝对误差和均方根误差值来衡量性能。
    var MAE = metrics.Average(error => Math.Abs(error)); // Mean Absolute Error
    var RMSE = Math.Sqrt(metrics.Average(error => Math.Pow(error, 2))); // Root Mean Squared Error

    //将指标输出到控制台。
    Console.WriteLine("Evaluation Metrics");
    Console.WriteLine("---------------------");
    Console.WriteLine($"Mean Absolute Error: {MAE:F3}");
    Console.WriteLine($"Root Mean Squared Error: {RMSE:F3}\n");


}

         保存模型供项目使用

//保存模型
var forecastEngine = forecaster.CreateTimeSeriesEngine<ModelInput, ModelOutput>(mlContext);
forecastEngine.CheckPoint(mlContext, modelPath);

五、使用模型预测结果

//使用模型
Forecast(secondYearData, 7, forecastEngine, mlContext);


void Forecast(IDataView testData, int horizon, TimeSeriesPredictionEngine<ModelInput, ModelOutput> forecaster, MLContext mlContext)
{

    ModelOutput forecast = forecaster.Predict();

    IEnumerable<string> forecastOutput =
        mlContext.Data.CreateEnumerable<ModelInput>(testData, reuseRowObject: false)
            .Take(horizon)
            .Select((ModelInput rental, int index) =>
            {
                string rentalDate = rental.RentalDate.ToShortDateString();
                float actualRentals = rental.TotalRentals;
                float lowerEstimate = Math.Max(0, forecast.LowerBoundRentals[index]);
                float estimate = forecast.ForecastedRentals[index];
                float upperEstimate = forecast.UpperBoundRentals[index];
                return $"Date: {rentalDate}\n" +
                $"Actual Rentals: {actualRentals}\n" +
                $"Lower Estimate: {lowerEstimate}\n" +
                $"Forecast: {estimate}\n" +
                $"Upper Estimate: {upperEstimate}\n";
            });

    // Output predictions
    Console.WriteLine("Rental Forecast");
    Console.WriteLine("---------------------");
    foreach (var prediction in forecastOutput)
    {
        Console.WriteLine(prediction);
    }
}

运行结果

六、参考文档

1、Tutorial: Forecast bike rental demand - time series - ML.NET | Microsoft Learn 

2、https://blog.csdn.net/Lucky_Go/article/details/103109045 

3、https://ssa.cf.ac.uk/zhigljavsky/pdfs/SSA/SSA_encyclopedia.pdf

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

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

相关文章

Linux命令_ps 进程管理

简介 ps通过读取 /proc 中的虚拟文件来工作&#xff0c;不需要 setuid kmem 或有任何特权来运行。 CPU使用率目前表示为进程整个生命周期中运行所花费时间的百分比。这是不理想的&#xff0c;它不符合ps在其他方面所符合的标准。CPU使用率加起来不太可能达到100%。 SIZE和RSS字…

ORB-SLAM2 ---- ORBmatcher::SearchForInitialization函数

目录 1.函数作用 2.执行流程 3.函数参数解析 4.code 5.函数解析 5.1 旋转直方图的构建与作用 5.2 遍历帧1中的特征点在帧2中找出候选匹配特征点 5.3 第一层筛选 -- 阈值、最优/次优比例、重复匹配 5.4 第二层筛选 -- 旋转直方图 5.5 final 将最后通过筛选的匹…

web前端课程设计——动漫网页2个网页HTML+CSS web前端开发技术 web课程设计 网页规划与设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

【图】深度优先遍历 广度优先遍历

文章目录一、广度优先遍历二、深度优先遍历深度优先遍历和广度优先遍历是遍历图的两种常见方式&#xff0c;接下来就通过这两种方式来实现一下图具体遍历的过程 当我位于游乐园的景区 A 时&#xff0c;为了玩遍所有的景区我们有两种玩的方式&#xff1a; 方式一&#xff1a; …

HDLbits——移位寄存器

移位寄存器 1 4 位移位寄存器 module top_module(input clk,input areset, // async active-high reset to zeroinput load,input ena,input [3:0] data,output reg [3:0] q); always (posedge clk or posedge areset) beginif (areset)q<4h0;else if(load)q<data;els…

linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本

前言&#xff1a; shell脚本的功能十分强大&#xff0c;这一点毋庸置疑的。那么&#xff0c;平常的工作中总是免不了和脚本打交道&#xff0c;也免不了要自己编写一些脚本。 每个人都希望自己编写的脚本强壮&#xff0c;简单&#xff0c;易用&#xff0c;功能多&#xff0c;并…

CDH中某一结点任务异常,节点服务重启失败报错:No space left on device

文章目录Error Message - 报错信息Analysis Process - 分析思路Solution - 解决方案Error Message - 报错信息 今天发现cdh集群的某一个节点任务爆红了&#xff0c;因为是测试的服务器&#xff0c;一般我都会尝试直接重启&#xff0c;但是该节点服务关闭后&#xff0c;竟然都无…

Spring Web

目录 概述 SpringMVC的组件 DispatcherServlet HandlerMapping HandlerAdapter SpringWeb的运行流程 Controller类的编写 RestController注解 RequestMapping注解 SpringWeb搭建 获取请求参数 解决POST请求中文乱码问题 Ajax返回JSON数据 跨域问题的解决 拦截器 …

LabVIEW与SQL Server 2919 Express通讯

LabVIEW与SQL Server 2919 Express通讯 ​LabVIEW与数据库通讯&#xff0c;可以使用数据库连接工具包。一般小型数据库用Access就可以了。但是对于长时间&#xff0c;需要存储空间较大的场合&#xff0c;Access一般不超过2G。这样就需要更换其他数据了。 SQL Server不同版本存…

MDC Service 基于 ESP32 推出树莓派 4 形态的 EsPiFF

当您的应用在树莓派 4 上运行不够稳定或耗电量过大时&#xff0c;您可以考虑使用 EsPiFF。这是一款由 MDC-Service 基于乐鑫 ESP32 构建的开发板。EsPiFF 配备有线和无线以太网、SD 卡插槽和 RP2040 协处理器。如果您尚未找到适合您项目的树莓派&#xff0c;不妨尝试一下这款低…

使用 Docker 来快速上手中文 Stable Diffusion 模型:太乙

本篇文章&#xff0c;我们聊聊如何使用 Docker 快速运行中文 Stable Diffusion 模型&#xff1a;太乙。 写在前面 上个月的时候&#xff0c;有朋友和我推荐了一个 “Stable Diffusion” 模型&#xff0c;来自深圳大湾区数字经济研究院(IDEA)的封神榜大模型中的 “太乙” 。 最…

web期末大作业 使用HTML+CSS制作蓝色版爱宠之家带留言板(5页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Metal每日分享,4x4颜色矩阵滤镜效果

本案例的目的是理解如何用Metal实现图像4x4颜色矩阵效果滤镜,通过4x4矩阵对RGBA像素处理; Demo HarbethDemo地址实操代码 // 绿色通道加倍 let filter = C7ColorMatrix4x4(matrix: Matrix4x4.Color.greenDouble)// 方案1: ImageView.image = try? BoxxIO(element: originIm…

【Python开发】Flask中的单点登录解决方案

Flask中的单点登录解决方案1.SSO 和 CAS 单点登录&#xff08;Single Sign On&#xff0c;SSO&#xff09;就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后&#xff0c;即可获得访问单点登录系统中其他关联系统和应用软件的权限&#xff0c;同时这种实现…

E. DS哈希查找--Trie树

目录 题目描述 思路分析 AC代码 题目描述 Trie树又称单词查找树&#xff0c;是一种树形结构&#xff0c;如下图所示。 它是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常被搜索引擎…

【经验版】Linux相关教程(二)

一、参考资料 二、常用指令 1. 安装run软件包 # 可执行权限 chmod x 软件包名.run# 校验软件包安装文件的一致性和完整性 ./软件包名.run --check# 指定安装路径 ./软件包名.run --install如果用户未指定安装路径&#xff0c;则软件会安装到默认路径下&#xff0c;默认安装路…

kafka一致性保证

1、概念 水位标记&#xff1a; 水位或水印&#xff08;watermark&#xff09;一词&#xff0c;表示位置信息&#xff0c;即位移&#xff08;offset&#xff09;。Kafka源码中使用的名字是高水位&#xff0c;HW&#xff08;high watermark&#xff09;。 副本角色&#xff1a;…

华硕编程竞赛11月JAVA专场 E题太空漫步 题解

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

cleanmymac4.12最新版下载安装教程

cleanmymac2023的“智能扫描”功能略不同于两外两款软件。除垃圾扫描以外&#xff0c;它还连带有搜索mac潜在威胁以及寻找提升系统性能方案的功能。在垃圾文件分类方面&#xff0c;它将垃圾首先分为系统垃圾、iTunes垃圾、照片垃圾3大类&#xff0c;每一类再做具体细分。但这样…

AUTOSAR OTA升级

一、OTA技术概念 随着高级辅助驾驶的发展和自动驾驶的引入&#xff0c;汽车变得越来越智能&#xff0c;这些智能汽车被软件控制&#xff0c;装有巨量的软件程序&#xff0c;当出现一个软件程序问题或者更新时&#xff0c;如果 按照传统的解决方式 &#xff0c;那都将是一项很繁…