如何用scikit-fda构建m变量n观测的时间信号数据集以执行FDA?
解决scikit-fda FDataGrid维度不匹配问题
你遇到的维度不匹配问题,核心是混淆了输入维度和输出维度的概念:
grid_points参数对应的是输入变量的网格点(这里输入只有时间这1个维度),你设置[t,t]会让scikit-fda认为输入是2维(比如x/y空间坐标),但实际数据是单输入维度的时间序列。- 你的
data_matrix_target形状是(2,100),scikit-fda会将其解析为「2个观测,每个观测是100个点的1维输出」,但你实际需要的是「2个观测,每个观测是100个时间点对应2个变量的输出」,所以数据矩阵的形状需要调整。
正确构造方式
调整数据矩阵的结构,让每个观测对应「时间点数 × 变量数」的数组,再组合成「观测数 × 时间点数 × 变量数」的矩阵,同时将grid_points设为单时间向量:
import numpy as np import skfda # 原始数据 obs1_var1 = np.ones(100, dtype=int) obs2_var1 = np.ones(100, dtype=int)*2 obs1_var2 = np.ones(100, dtype=int)*3 obs2_var2 = np.ones(100, dtype=int)*4 t = np.linspace(0, 100, num=100, dtype=int) # 整理每个观测的变量:将同一观测的两个变量按时间点堆叠 obs1 = np.stack([obs1_var1, obs1_var2], axis=1) obs2 = np.stack([obs2_var1, obs2_var2], axis=1) # 组合成最终的数据矩阵,形状为 (观测数, 时间点数, 变量数) data_matrix_target = np.array([obs1, obs2]) # grid_points对应输入维度(仅时间1维) grid_points_target = [t] # 构造FDataGrid dg_target = skfda.FDataGrid(data_matrix_target, grid_points_target) # 验证结构 print(dg_target.shape) # 输出 (2, 100, 2),对应2个观测、100个时间点、2个变量
额外说明
- 如果是多输入维度的功能数据(比如2D空间网格上的信号),
grid_points才需要传入多个向量(比如x坐标网格和y坐标网格),此时数据矩阵的形状应为「观测数 × 网格点1数量 × 网格点2数量 × 输出维度」。 - 你的场景属于单输入、多输出的功能数据,输入仅时间1维,输出是2个变量,因此只需调整数据矩阵的堆叠方式即可解决维度问题。
内容的提问来源于stack exchange,提问作者Nicola Sparnacci
相关产品推荐
相关产品推荐

