如何用Python通过FPCA补全温度曲线?解决代码维度匹配报错
FPCA温度曲线补全及维度不匹配报错解决
报错原因
你遇到的ValueError: Incorrect dimension in data_matrix and grid_points,核心问题是测试数据的网格点数量(100天)和FPCA训练时的网格点数量(365天)不匹配。FPCA模型训练后,要求输入的待转换数据必须和训练数据的维度、网格点完全一致,不能直接用短序列(100天)去调用transform方法。
曲线补全实现步骤及修正代码
要完成前100天数据的补全,需要先把测试数据扩展为365天的维度(缺失部分用NaN填充),再用训练好的FPCA模型处理:
构造带缺失值的测试数据矩阵
把5条仅含前100天的测试曲线,扩展为365天的矩阵,剩余天数用NaN填充,保证和训练数据的维度一致:import numpy as np # 假设testing_data形状为(5, 100),对应5条曲线的前100天数据 # 创建365天的空矩阵,填充NaN test_data_365 = np.full((5, 365), np.nan) # 前100天填入已知数据 test_data_365[:, :100] = testing_data修正FPCA流程代码
使用扩展后的365天测试数据创建FDataGrid,后续流程即可正常执行:from skfda import FDataGrid from skfda.preprocessing.dim_reduction import FPCA # 训练集处理(和原代码一致) train_grid = FDataGrid(data_matrix=training_data, grid_points=day[:365]) fpca = FPCA(n_components=2) fpca.fit(train_grid) # 测试集处理(使用扩展后的365天数据) test_grid = FDataGrid(data_matrix=test_data_365, grid_points=day[:365]) test_scores = fpca.transform(test_grid) # 逆变换得到补全后的365天温度曲线 y_pred = fpca.inverse_transform(test_scores)
关键说明
- 这里依赖
scikit-fda库的FPCA对缺失值的支持,它会自动忽略NaN部分,基于已知的前100天数据计算主成分得分,再通过逆变换补全剩余天数。 - 确保
training_data形状为(15, 365)(15条完整曲线),day是长度为365的时间序列数组,维度对应正确。
内容的提问来源于stack exchange,提问作者bayoote
相关产品推荐
相关产品推荐

