Data Analysis TTAD=>CNN-BiGRU-MSA

TTAO 預處理、CNN-BiGRU-MSA 模型? 時序數據回歸分析

時序數據分析方法,特點:

  1. TTAO 預處理:通過三角拓撲結構增強時序特征的局部和全局關系
  2. 混合模型架構
    • CNN 層提取局部特征模式
    • BiGRU 捕獲雙向時序依賴
    • 多頭自注意力機制進行序列建模
    • 殘差連接和層歸一化提高訓練穩定性
  3. 高級優化技術
    • Huber 損失函數(對異常值更魯棒)
    • 指數學習率衰減
    • 早停和學習率回調
  4. 完整工作流
    • 命令行參數配置
    • 數據預處理和特征工程
    • 模型訓練和評估
    • 多指標評估和可視化
  5. 多步預測支持:可通過--pred_steps參數配置預測未來多個時間步

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error
import tensorflow as tf
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import *
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
import os
import argparse
import warnings
warnings.filterwarnings('ignore')# 設置中文顯示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]def parse_args():"""解析命令行參數"""parser = argparse.ArgumentParser(description='時序數據深度學習回歸分析')parser.add_argument('--data_path', type=str, default='data.csv', help='數據文件路徑')parser.add_argument('--target_col', type=str, default='value', help='目標列名')parser.add_argument('--window_size', type=int, default=10, help='滑動窗口大小')parser.add_argument('--pred_steps', type=int, default=1, help='預測未來步數')parser.add_argument('--epochs', type=int, default=50, help='訓練輪次')parser.add_argument('--batch_size', type=int, default=32, help='批次大小')parser.add_argument('--model_save_path', type=str, default='best_model.h5', help='模型保存路徑')return parser.parse_args()def triangular_topological_aggregation_optimization(X, window_size, alpha=0.5):"""時間拓撲聚合優化(TTAO) - 增強時序數據的局部和全局特征關系基于三角拓撲結構對時序窗口內的數據進行加權聚合"""batch_size, seq_len, feature_dim = X.shapettao_output = np.zeros_like(X)for i in range(window_size, seq_len):# 構建三角權重矩陣triangle_weights = np.zeros((window_size, window_size))for j in range(window_size):for k in range(window_size):if k <= j:triangle_weights[j, k] = 1.0 - (j - k) / window_size# 應用三角權重進行聚合window_data = X[:, i-window_size:i, :]weighted_sum = np.zeros((batch_size, window_size, feature_dim))for j in range(window_size):weighted_window = window_data * triangle_weights[j, :].reshape(1, window_size, 1)weighted_sum[:, j, :] = np.sum(weighted_window, axis=1)# 結合原始數據和聚合結果aggregated = np.mean(weighted_sum, axis=1, keepdims=True)ttao_output[:, i, :] = alpha * X[:, i, :] + (1-alpha) * aggregated[:, 0, :]return ttao_outputdef create_sequences(data, window_size, pred_steps=1):"""創建滑動窗口序列,支持多步預測"""X, y = [], []for i in range(len(data) - window_size - pred_steps + 1):X.append(data[i:i+window_size, 0])y.append(data[i+window_size:i+window_size+pred_steps, 0])return np.array(X), np.array(y)def build_advanced_model(input_shape, head_size=256, num_heads=4, ff_dim=4, num_transformer_blocks=4, mlp_units=[128], dropout=0.1, mlp_dropout=0.1):"""構建結合CNN、BiGRU和多頭自注意力機制的前沿模型"""inputs = Input(shape=input_shape)x = inputs# 1D卷積提取局部特征x = Conv1D(filters=64, kernel_size=3, padding="causal", activation="relu")(x)x = BatchNormalization()(x)x = Conv1D(filters=128, kernel_size=3, padding="causal", activation="relu")(x)x = BatchNormalization()(x)x = MaxPooling1D(pool_size=2)(x)# BiGRU捕獲時序特征x = Bidirectional(GRU(128, return_sequences=True))(x)x = Dropout(0.2)(x)x = Bidirectional(GRU(64, return_sequences=True))(x)x = Dropout(0.2)(x)# 多頭自注意力機制for _ in range(num_transformer_blocks):residual = xx = LayerNormalization(epsilon=1e-6)(x)x = MultiHeadAttention(key_dim=head_size, num_heads=num_heads, dropout=dropout)(x, x)x = Dropout(dropout)(x)x = x + residual  # 殘差連接residual = xx = LayerNormalization(epsilon=1e-6)(x)x = Conv1D(filters=ff_dim, kernel_size=1, activation="gelu")(x)x = Dropout(dropout)(x)x = Conv1D(filters=input_shape[-1], kernel_size=1)(x)x = x + residual  # 殘差連接x = LayerNormalization(epsilon=1e-6)(x)x = GlobalAveragePooling1D(data_format="channels_first")(x)# MLP層for dim in mlp_units:x = Dense(dim, activation="gelu")(x)x = Dropout(mlp_dropout)(x)outputs = Dense(1)(x)  # 單步預測return Model(inputs, outputs)def plot_training_history(history):"""繪制訓練歷史"""plt.figure(figsize=(14, 5))# 繪制損失plt.subplot(1, 2, 1)plt.plot(history.history['loss'], label='訓練損失')plt.plot(history.history['val_loss'], label='驗證損失')plt.title('模型損失')plt.ylabel('損失')plt.xlabel('輪次')plt.legend()# 繪制MAEplt.subplot(1, 2, 2)plt.plot(history.history['mae'], label='訓練MAE')plt.plot(history.history['val_mae'], label='驗證MAE')plt.title('模型MAE')plt.ylabel('MAE')plt.xlabel('輪次')plt.legend()plt.tight_layout()plt.savefig('training_history.png')plt.close()def plot_prediction_results(y_true, y_pred, title='時序數據回歸預測結果'):"""繪制預測結果"""plt.figure(figsize=(14, 7))plt.plot(y_true, label='真實值', linewidth=2)plt.plot(y_pred, label='預測值', alpha=0.7, linewidth=2)plt.title(title, fontsize=16)plt.xlabel('時間點', fontsize=14)plt.ylabel('值', fontsize=14)plt.legend(fontsize=12)plt.grid(True, linestyle='--', alpha=0.7)plt.tight_layout()plt.savefig('prediction_results.png')plt.close()def main():args = parse_args()# 1. 數據加載print(f"正在加載數據: {args.data_path}")try:data = pd.read_csv(args.data_path)print(f"數據加載成功,共{len(data)}條記錄")except FileNotFoundError:print(f"錯誤:找不到數據文件 {args.data_path}")return# 2. 數據預處理print("正在進行數據預處理...")values = data[args.target_col].values.reshape(-1, 1)# 創建序列X, y = create_sequences(values, args.window_size, args.pred_steps)# 劃分訓練集和測試集split_idx = int(0.8 * len(X))X_train, X_test = X[:split_idx], X[split_idx:]y_train, y_test = y[:split_idx], y[split_idx:]# 數據歸一化scaler_X = MinMaxScaler(feature_range=(0, 1))scaler_y = MinMaxScaler(feature_range=(0, 1))X_train_scaled = scaler_X.fit_transform(X_train.reshape(-1, X_train.shape[1])).reshape(X_train.shape)X_test_scaled = scaler_X.transform(X_test.reshape(-1, X_test.shape[1])).reshape(X_test.shape)y_train_scaled = scaler_y.fit_transform(y_train.reshape(-1, y_train.shape[1])).reshape(y_train.shape)y_test_scaled = scaler_y.transform(y_test.reshape(-1, y_test.shape[1])).reshape(y_test.shape)# 調整形狀以適應模型輸入X_train_reshaped = X_train_scaled.reshape(X_train_scaled.shape[0], X_train_scaled.shape[1], 1)X_test_reshaped = X_test_scaled.reshape(X_test_scaled.shape[0], X_test_scaled.shape[1], 1)print(f"訓練集形狀: {X_train_reshaped.shape}, 測試集形狀: {X_test_reshaped.shape}")# 3. 應用TTAO預處理print("正在應用時間拓撲聚合優化(TTAO)...")X_train_tta = triangular_topological_aggregation_optimization(X_train_reshaped, args.window_size)X_test_tta = triangular_topological_aggregation_optimization(X_test_reshaped, args.window_size)# 4. 模型構建print("正在構建模型...")model = build_advanced_model(X_train_tta.shape[1:])# 使用學習率調度和優化器配置lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate=1e-3,decay_steps=10000,decay_rate=0.9)optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)model.compile(optimizer=optimizer, loss='huber_loss', metrics=['mae'])model.summary()# 5. 模型訓練print("開始訓練模型...")callbacks = [EarlyStopping(patience=15, restore_best_weights=True),ModelCheckpoint(args.model_save_path, save_best_only=True, monitor='val_loss'),tf.keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=5, min_lr=1e-6)]history = model.fit(X_train_tta, y_train_scaled,epochs=args.epochs,batch_size=args.batch_size,validation_split=0.2,callbacks=callbacks,verbose=1)# 6. 模型評估print("正在評估模型...")loss, mae = model.evaluate(X_test_tta, y_test_scaled, verbose=0)print(f"測試集指標 - Huber Loss: {loss:.4f}, MAE: {mae:.4f}")# 7. 預測并反歸一化y_pred_scaled = model.predict(X_test_tta)y_pred = scaler_y.inverse_transform(y_pred_scaled).flatten()y_true = scaler_y.inverse_transform(y_test_scaled.reshape(-1, y_test_scaled.shape[1])).flatten()# 計算額外指標mse = mean_squared_error(y_true, y_pred)rmse = np.sqrt(mse)mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100print(f"附加指標 - MSE: {mse:.4f}, RMSE: {rmse:.4f}, MAPE: {mape:.2f}%")# 8. 可視化plot_training_history(history)plot_prediction_results(y_true, y_pred)print("分析完成!結果已保存為圖表文件")if __name__ == "__main__":main()    


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91575.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91575.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python-字典、集合、序列切片、字符串操作(筆記)

一、字符串常見操作&#xff08;重點&#xff09;?1.?2.字符串無法修改#錯誤示范 str1"djskds" str1[2]"3"3.?str1"abcand" # 輸出3 print(str1.index("and"))4.?str1"abcand" newStrstr1.replace("and",&quo…

【Android】EditText使用和監聽

三三想成為安卓糕手 一&#xff1a;用戶登錄校驗 1&#xff1a;EditText文本輸入框<EditTextandroid:id"id/et_user_name"android:layout_width"match_parent"android:layout_height"wrap_content"android:inputType"number"androi…

SQL 中根據當前時間動態計算日期范圍

在 SQL 中寫“動態時間”通常是指根據當前時間動態計算日期范圍&#xff0c;而不是寫死固定日期。以下是幾種常見寫法&#xff08;以 SQL Server / MySQL / PostgreSQL 為例&#xff09;&#xff1a;1. 獲取當前時間-- SQL Server SELECT GETDATE() AS now-- MySQL SELECT NOW(…

react-redux 類組件的 connect

store 目錄下 store/reducer.js import * as actionTypes from ./constantsconst initalState {counter: 100,banners: [],recommends: [] }/*** 定義reducer函數&#xff1a;純函數* param 參數一&#xff1a;store中目前保存的state* param 參數二&#xff1a;通過 dispatch…

數據分布是如何影響目標檢測精度

文章目錄一、研究背景與目標模型效果提升數據集優化二、研究問題明細各方向的關聯性與核心邏輯1. 高質量數據集的高效篩選與主動學習應用2. 基于推理結果的數據補充與增強方向優化3. 多類別場景下目標尺度與模型精度的關聯性4. 損失函數與數據增強對精度的量化影響5. 目標類型專…

高效批量轉換Java接口為MCP服務:降低重復勞動的實戰指南

高效批量轉換Java接口為MCP服務:降低重復勞動的實戰指南 在AI大模型技術飛速發展的今天,企業需要將現有Java接口快速適配為模型計算協議(MCP,Model Calculation Protocol)服務,以便與大模型生態無縫對接。然而,手動逐個轉換接口不僅耗時耗力,還容易因人為疏忽導致錯誤…

Eclipse Debug 配置指南

Eclipse Debug 配置指南 引言 Eclipse 作為一款功能強大的集成開發環境(IDE),在Java開發者中享有盛譽。在開發過程中,調試功能是必不可少的。本文將詳細介紹如何在Eclipse中配置調試環境,以便更高效地進行代碼調試。 1. 開發環境準備 在開始配置Eclipse調試環境之前,…

modelscope ProxyError: HTTPSConnectionPool(host=‘www.modelscope.cn‘, port=443)

目錄 Windows CMD&#xff1a; powershell Linux / macOS / Git Bash&#xff1a; win11 設置全局系統變量代理 modelscope ProxyError: HTTPSConnectionPool(hostwww.modelscope.cn, port443) 報錯&#xff1a; requests.exceptions.ProxyError: HTTPSConnectionPool(host…

Python學習之——序列化與反序列化

Python學習之——序列化與反序列化yaml & json & xmlyamljsonPython自帶Json庫xml一個綜合示例pickle & msgpack & marshalpicklemsgpackmarshal自定義導出py文件一個導出py文件的示例yaml & json & xml YAML & JSON &XML 如何選擇 yaml Py…

設計模式之代理模式:掌控對象訪問的優雅之道

代理模式&#xff1a;掌控對象訪問的優雅之道 引言&#xff1a;設計模式的重要性 在軟件開發中&#xff0c;設計模式是解決常見問題的可復用方案&#xff0c;它們如同建筑師的藍圖&#xff0c;為開發者提供了經過驗證的最佳實踐。在23種經典設計模式中&#xff0c;代理模式因其…

sqli-labs靶場通關筆記:第18-19關 HTTP頭部注入

第18關 User-Agent注入登錄正確的用戶名密碼&#xff0c;它會將User-Agent的信息回顯到頁面上。猜測UA頭可能存在注入點。利用bp抓包&#xff0c;在UA頭后面加一個單引號&#xff0c;發現報錯了。觀察報錯信息&#xff0c;顯示nearxx,admin)&#xff0c;推測后面應該還有兩個參…

基于按鍵開源MultiButton框架深入理解代碼框架(三)(指針的深入理解與應用)

文章目錄3、分析代碼3.3 按鍵的插入3.4 按鍵的刪除3.5 繼續分析狀態機核心理解4、寫在最后的總結5、思想感悟篇6、慈悲不渡自絕人3、分析代碼 3.3 按鍵的插入 // Button handle list headstatic Button* head_handle NULL;/*** brief Start the button work, add the handle…

ACOUSLIC-AI挑戰報告:基于低收入國家盲掃超聲數據的胎兒腹圍測量|文獻速遞-醫學影像算法文獻分享

Title題目ACOUSLIC-AI challenge report: Fetal abdominal circumferencemeasurement on blind-sweep ultrasound data from low-income countriesACOUSLIC-AI挑戰報告&#xff1a;基于低收入國家盲掃超聲數據的胎兒腹圍測量01文獻速遞介紹胎兒生長受限&#xff08;FGR&#xf…

集群聊天服務器各個類進行詳解

1.dh.h類定義概要類名&#xff1a; MySQL功能&#xff1a; 簡化MySQL的連接、查詢和更新操作&#xff0c;提供接口給上層應用使用。成員變量private:MYSQL *_conn;_conn&#xff1a;指向MYSQL結構體的指針&#xff0c;用于代表數據庫連接實例。由mysql_init()初始化&#xff0c…

電纜安全雙保險:不止防盜,更能防觸電的塔能智慧照明守護方案

城市照明、地下車庫以及園區路燈所涉及的電纜安全問題&#xff0c;向來都是運維管理方面頗為棘手的難題。在傳統的運維管理模式之下&#xff0c;電纜一旦被盜&#xff0c;那么所造成的影響可不小&#xff0c;一方面會帶來直接的經濟損失&#xff0c;另一方面還極有可能因為線路…

Leetcode刷題營第二十九,三十題:二叉樹的中序以及后序遍歷

94.二叉樹的中序遍歷 給定一個二叉樹的根節點 root &#xff0c;返回 它的 中序 遍歷 。 示例 1&#xff1a; 輸入&#xff1a;root [1,null,2,3] 輸出&#xff1a;[1,3,2]示例 2&#xff1a; 輸入&#xff1a;root [] 輸出&#xff1a;[]示例 3&#xff1a; 輸入&#x…

Rabbitmq Direct Exchange(直連交換機)可以保證消費不被重復消費嗎,可以多個消費者,但是需要保證同一個消息,不會被投遞給多個消費者

在 RabbitMQ 中&#xff0c;默認情況下&#xff0c;不能保證消息不被重復消費&#xff0c;但可以通過 隊列綁定方式 消費者競爭機制 來確保 同一消息只被一個消費者處理。以下是幾種可行的方案&#xff1a;方案 1&#xff1a;單隊列 競爭消費者模式&#xff08;默認行為&…

常用的OTP語音芯片有哪些?

唯創知音在 OTP 語音芯片有著26年的歷史&#xff0c;有著豐富的技術積累與產品迭代歷程。1999 年&#xff0c;唯創知音在廣州成立&#xff0c;彼時便開始在電子領域積極探索。2000 年&#xff0c;公司敏銳捕捉到語音芯片行業的發展潛力&#xff0c;正式進軍該領域。經過數年技術…

分布式光伏發電系統中的“四可”指的是什么?

在分布式光伏電站規模爆發式增長的今天&#xff0c;“看不見、管不住、調不動”的難題卻成為行業痛點。如何讓散布各處的光伏電站真正成為穩定高效的“綠色能量站”&#xff1f;2025年《分布式光伏發電開發建設管理辦法》大型工商業項目&#xff08;≥6MW&#xff09;明確要求具…

健康管理系統新趨勢:AI + 物聯網如何重塑健康管理

一、傳統健康管理的痛點與變革之必然長久以來&#xff0c;我們熟悉的健康管理方式存在明顯局限&#xff1a;數據孤島嚴重&#xff1a;體檢報告在抽屜里沉睡&#xff0c;健身手環數據僅存于手機&#xff0c;不同醫療機構信息互不相通&#xff0c;個人健康信息猶如碎片散落各處。…