求助:如何在Python中实现PAA(分段聚合近似)算法进行时间序列降维
Python实现分段聚合近似(PAA)算法
核心原理
PAA的本质是时间序列的分段均值压缩:将长度为N的原始序列划分为M个连续分段,每个分段内所有数据点的平均值作为降维后序列的对应元素,最终得到长度为M的简化序列。若N无法被M整除,前若干个分段会多包含一个数据点,确保所有原始数据都被利用。
代码实现
使用numpy实现高效的PAA转换,同时处理序列长度无法被分段数整除的通用情况:
import numpy as np def paa_transform(ts, num_segments): ts = np.asarray(ts) n = len(ts) m = num_segments if m == n: return ts.copy() if m > n: raise ValueError("分段数不能大于原始时间序列的长度") segment_base_len = n // m remainder = n % m paa_sequence = [] start_idx = 0 for i in range(m): # 前remainder个分段各多一个数据点 current_len = segment_base_len + 1 if i < remainder else segment_base_len end_idx = start_idx + current_len # 计算当前分段的均值 segment_mean = np.mean(ts[start_idx:end_idx]) paa_sequence.append(segment_mean) start_idx = end_idx return np.array(paa_sequence)
使用示例
# 生成一个长度为17的随机时间序列 original_ts = np.random.randn(17) print(f"原始序列长度: {len(original_ts)}") print(f"原始序列: {original_ts.round(4)}") # 降维到6个分段 paa_result = paa_transform(original_ts, 6) print(f"\nPAA降维后序列长度: {len(paa_result)}") print(f"PAA降维后序列: {paa_result.round(4)}")
说明
- 输入可以是Python列表或numpy数组,函数内部会统一转换为numpy数组以提升计算效率
- 当分段数等于原始序列长度时,直接返回原序列的副本
- 若分段数大于原始序列长度,会抛出参数错误,避免无意义的降维
内容的提问来源于stack exchange,提问作者user22379888
相关产品推荐
相关产品推荐

