使用Python实现基于矩阵分解的长期事件(MFLEs)进行时间序列分析,有效处理高维数据并进行预测。
原文标题:使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
原文作者:数据派THU
冷月清谈:
MFLEs 的核心思想是将时间序列数据矩阵分解为基矩阵和编码矩阵的乘积,从而提取潜在特征并降低维度。文中详细解释了矩阵分解、潜在变量、潜在特征、维度降低的意义以及 MFLEs 的数学基础。
文章通过 Python 代码演示了如何使用截断奇异值分解 (TruncatedSVD) 实现 MFLEs,并构建预测模型。同时,文章还提供了可视化分析方法,用于评估重构质量、解释方差比和预测性能。
最后,文章将 MFLEs 与其他时间序列分析方法(如 ARIMA 模型、指数平滑法、LSTM 网络和时序自编码器)进行了比较,并总结了 MFLEs 的优势和应用场景。
怜星夜思:
2、文章使用线性回归模型进行预测,如果时间序列数据存在非线性关系,那么应该如何改进预测模型?
3、MFLEs在实际应用中有哪些局限性?
原文内容
核心概念
矩阵分解
-
U 和 V 是正交矩阵
-
S 是对角矩阵,对角线上的元素称为奇异值
潜在变量与潜在特征
-
潜在变量(Latent Variables):指数据中无法直接观测但实际存在的变量,它们往往是多个可观测变量的综合表现。
-
潜在特征(Latent Features):通过矩阵分解得到的低维表示,它们是潜在变量在数学上的具体体现。每个潜在特征可能代表多个原始特征的组合。
维度降低在时间序列分析中的意义
-
原始维度下的计算复杂度:O(n^3),其中n为特征数量;
-
降维后的计算复杂度:O(k^3),其中k为降低后的维度数,通常k << n;
-
较小的奇异值通常对应噪声分量;
-
保留主要奇异值可以实现数据去噪;
-
帮助发现时间序列中的主要趋势和季节性模式;
-
便于识别多个时间序列之间的相关性。
主成分分析(PCA)与MFLE的关系
-
时间敏感性:考虑数据点之间的时间依赖关系
-
预测能力:能够基于历史模式进行预测
-
多序列建模:可以同时处理多个相关的时间序列
MFLE的数学基础
-
W ∈ ℝ^(m×k) 表示基矩阵(basis matrix)
-
H ∈ ℝ^(k×n) 表示编码矩阵(encoding matrix)
-
k 是潜在特征的数量,通常 k << min(m,n)
-
||·||_F 表示Frobenius范数
-
λ 是正则化参数,用于防止过拟合
长期事件(MFLEs)技术实现
数据准备与预处理:
import numpy as np import pandas as pd from sklearn.decomposition import TruncatedSVD from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt
生成合成数据
np.random.seed(42)
n_series = 100 # 时间序列的数量
n_timepoints = 50 # 时间点的数量模拟数据矩阵(行:时间序列,列:时间点)
data_matrix = np.random.rand(n_series, n_timepoints)
df = pd.DataFrame(data_matrix)
print(df.head())
-
n_series = 100:提供足够的样本量以捕获不同的模式;
-
n_timepoints = 50:足够长以体现时间序列的特性,又不会造成过大的计算负担。
矩阵分解实现
svd = TruncatedSVD(n_components=10) # 降至10个潜在特征
latent_features = svd.fit_transform(data_matrix)
# 重构时间序列
reconstructed_matrix = svd.inverse_transform(latent_features)
-
选择理由:通常选择能解释80-90%方差的特征数量
-
计算成本:与特征数量的三次方成正比
-
最佳实践:可以通过explained_variance_ratio_确定
-
优势:内存效率高,计算速度快
-
适用场景:大规模稀疏矩阵
-
数学原理:只计算前k个最大奇异值
预测模型构建
# 准备训练和测试数据集 X = latent_features[:, :-1] y = latent_features[:, -1] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练回归模型 model = LinearRegression() model.fit(X_train, y_train) # 进行预测 y_pred = model.predict(X_test)
-
优势:计算效率高,可解释性强
-
局限:仅能捕获线性关系
-
适用场景:潜在特征间的关系较为简单时
-
标准做法:留出20%作为测试集
-
注意事项:需要考虑时间序列的连续性
可视化分析
""" 原始与重构时间序列的对比 """ import matplotlib.pyplot as plt # 绘制原始与重构时间序列的对比图 series_idx = 0 # 选择特定的时间序列 plt.figure(figsize=(10, 6)) plt.plot(data_matrix[series_idx, :], label="Original", marker="o") plt.plot(reconstructed_matrix[series_idx, :], label="Reconstructed", linestyle="--") plt.title("MFLE: Original vs Reconstructed Time Series") plt.xlabel("Time") plt.ylabel("Values") plt.legend() plt.grid() plt.show()
-
曲线吻合度反映了模型捕获主要模式的能力
-
偏差主要出现在局部波动处
-
整体趋势被很好地保留
-
重构序列更平滑
-
去除了高频波动
-
保留了主要趋势
import matplotlib.pyplot as plt import seaborn as sns # 设置绘图 fig, axes = plt.subplots(2, 2, figsize=(15, 12)) fig.suptitle('Time Series Analysis and Prediction', fontsize=16) # 1. 原始数据与重构数据对比(第一个时间序列) axes[0, 0].plot(data_matrix[:1].T, 'b-', alpha=0.5, label='Original') axes[0, 0].plot(reconstructed_matrix[:1].T, color="Red", label='Reconstructed') axes[0, 0].set_title('Original vs. Reconstructed Data') axes[0, 0].set_xlabel('Time Points') axes[0, 0].set_ylabel('Value') axes[0, 0].legend() # 2. 解释方差比 explained_variance_ratio = svd.explained_variance_ratio_ cumulative_variance_ratio = np.cumsum(explained_variance_ratio) axes[0, 1].plot(range(1, len(explained_variance_ratio) + 1), cumulative_variance_ratio, 'bo-') axes[0, 1].set_title('Cumulative Explained Variance Ratio') axes[0, 1].set_xlabel('Number of Components') axes[0, 1].set_ylabel('Cumulative Explained Variance Ratio') axes[0, 1].set_ylim([0, 1]) # 3. 实际值与预测值对比 axes[1, 0].scatter(y_test, y_pred) axes[1, 0].plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2) axes[1, 0].set_title('Actual vs. Predicted Values') axes[1, 0].set_xlabel('Actual Values') axes[1, 0].set_ylabel('Predicted Values') # 4. 残差图 residuals = y_test - y_pred axes[1, 1].scatter(y_pred, residuals) axes[1, 1].axhline(y=0, color='r', linestyle='--') axes[1, 1].set_title('Residual Plot') axes[1, 1].set_xlabel('Predicted Values') axes[1, 1].set_ylabel('Residuals') plt.tight_layout() plt.show()
-
累积方差比反映了信息保留程度
-
拐点可用于确定最优特征数量
-
通常在90%处截断较为合理
-
散点图集中在对角线附近表示预测准确
-
残差图用于检测系统性偏差
-
残差的分布特征反映了模型假设的合理性
与其他时间序列分析方法对比
传统统计方法对比
-
优势:适合单变量时间序列,模型解释性强
-
局限:难以处理高维数据,计算复杂度高
-
对比:MFLE在处理多变量时更有效率
-
优势:计算简单,适合短期预测
-
局限:无法捕获复杂的时间依赖关系
-
对比:MFLE能够发现更深层的数据结构
深度学习方法对比
-
优势:能够学习复杂的时序依赖
-
局限:需要大量训练数据,计算资源消耗大
-
对比:MFLE在计算效率和可解释性方面更具优势
-
优势:能够学习非线性特征
-
局限:模型复杂,训练不稳定
-
对比:MFLE提供了更简单且可解释的解决方案