DownSampling向下采样

本文介绍了降采样技术,一种降低数据采样率或分辨率的方法。通过实例展示了如何使用降采样器将大量数据点聚合为单一值,以简化图表展示。文章还详细解释了时间间隔和聚合函数的概念,以及在不同版本的OpenTSDB中实现降采样的方法。
简述:
     降采样(或在信号处理,抽取中)是降低数据采样率或分辨率的过程。 例如,假设温度传感器每秒钟都向OpenTSDB系统发送数据。 如果用户在一小时内查询数据,他们将获得3,600个数据点,这些数据点可以相当容易地绘制出来。 但是现在,如果用户要求整整一周的数据,他们将获得604,800个数据点,并且突然间图形可能变得非常混乱。 使用下采样器,单个时间序列在一个时间范围内的多个数据点在一个对齐的时间戳中与数学函数一起聚合成单个值。 这样我们可以将数量从604,800减少到168。

向下采样至少需要两个组件:
  •      时间间隔(Interval) - 一个时间范围(或存储桶),用于汇总这些值。 例如,我们可以将多个值汇总1分钟或1小时甚至整整一天。 间隔以<大小> <单位>格式指定,例如1小时1小时或30分钟30分钟。 从2.3开始,所有间隔现在可用于将时间范围内的所有结果缩减为一个值。 例如。 0all-sum将从查询开始到结束总结所有值。 请注意,数值仍然是必需的,但它可以是零或任何其他值。
  • 聚合函数 - 确定如何合并区间中的值的数学函数。 该功能使用Aggregation文档中的聚合函数。
例如,采取以下时间序列A和B.数据点覆盖70秒的时间间隔,每10秒一个值。 假设我们希望缩减到30秒,因为用户正在查看更宽时间跨度的图。 此外,我们使用总和聚合器将这两个系列分组为一个。 我们可以指定一个30s-sum的下采样器,它将创建30秒钟的桶并对每个桶中的所有数据点进行求和。 这将为我们提供每个系列的三个数据点



正如您所看到的,对于每个时间序列,我们生成一个合成序列,其时间戳标准化为区间边界(每30秒),以便我们在t0,t0 + 30s和t0 + 60s处具有一个值。 每个间隔或存储桶将包含包含存储桶时间戳(开始)的数据点,并且不包括以下存储桶的时间戳(结束)。 在这种情况下,第一个桶将从t0延伸到t0 + 29.9999s。 使用提供的聚合器,将所有值合并为一个新值。 例如。 对于A系列,我们总结t0,t0 + 10s和t0 + 20s的值,以在t0时刻达到20的新值。 最后,查询使用总和进行分组,以便我们添加两个合成时间序列。 此时,OpenTSDB总是在缩减采样后执行分组聚合。


对于早期版本的OpenTSDB,新数据点的实际时间戳将是时间跨度中每个数据点的时间戳的平均值。 从2.1和更高版本开始,每个点的时间戳与基于当前时间和下采样间隔的模的时间桶的开始对齐。

降采样时间戳基于原始数据点时间戳的剩余部分除以下采样间隔(以毫秒为单位),即模数进行归一化。 在Java中,代码是时间戳 - (时间戳记%interval_ms)。 例如,给定1388550980000或2014年1月1日04:36:20的时间戳和小时间隔(相当于3600000毫秒),则生成的时间戳将四舍五入为1388548800000. 4和5 UTC之间的所有数据点将风 在4 AM桶中。 如果您在1小时内查询了一天的数据下采样,您将收到24个数据点(假设所有24小时都有数据)。


使用0all-interval时,结果的时间戳将成为查询的开始时间。

标准化对于常见查询非常有效,例如将一天的数据下采样到1分钟或1小时。 但是,如果您尝试在奇数间隔(如36分钟)下采样,则由于模数计算的性质,时间戳可能看起来有点奇怪。 给定36分钟的时间间隔以及我们上面的示例,时间间隔为2160000毫秒,结果时间戳为1388549520或04:12:00 UTC。 04:12至04:48之间的所有数据点将在单个桶中结束。


从OpenTSDB 2.3开始,用户可以指定基于日历的下采样而不是快速模数方法。 这对于报告目的更为有用,例如查看与人类时代相关的值,例如数月,数周或数天。 此外,下采样可以考虑时区,并纳入夏时制时间偏移和区域偏移。

要使用日历边界,请查看您正在查询的端点的文档。 例如,V2 URI端点具有要使用的特定时区参数,例如&timezone = Asia / Kabul,并通过在间隔时间单位中追加c来启用基于日历的下采样,如&m = sum:1dc-sum:my.metric。 对于JSON查询,在顶层使用单独的时区字段以及useCalendar布尔标志。 如果未提供时区,则日历将使用UTC时间。

通过日历缩减采样,第一个时间间隔在指定时区的查询年份的00:00:00捕捉到1月1日。 从那里开始计算间隔桶直到查询结束。 每个存储桶都标有存储桶开始的时间戳(含),并包含所有值,直到下一个存储桶开始为止。

填充政策:

降采样通常用于调整时间戳,以避免在执行分组时进行插值。 由于OpenTSDB不会对时间对齐或值存在时施加约束,因此必须在查询时指定这些约束。 使用下采样执行分组聚合时,如果所有序列都缺少预期间隔的值,则不会发射任何数据。 例如,如果一系列数据从t0到t0 + 6m每分钟都在写数据,但由于某些原因,源在t0 + 3m时未能写入数据,则当用户期望6时,只有5个值将被序列化。 2.2和更高版本,您现在可以选择为t0 + 3m发射什么值,以便用户(或应用程序)可以看到特定时间戳的值缺失,而不必找出缺少哪个时间戳。 只要下采样桶为空,填充策略就会简单地发出预定义的值。

可用的政策包括:
  • 无(none) - 默认行为,在序列化期间不会发出缺失值,并在聚合系列时执行线性插值(或以其他方式指定的插值)。
  • NaN(nan) - 在串行输出中缺少所有值时发出NaN。 当值丢失时跳过聚合中的系列,而不是将整个组计算转换为NaN。
  • Null(null) - 与NaN相同的行为,除了在序列化期间它会发出null而不是NaN。
  • 零(零) - 当时间戳丢失时替换为零。 零值将被合并到汇总结果中。
要使用填充策略,请将策略名称(括号中的术语)附加到由连字符分隔的缩减采样聚合函数的末尾。 例如。 1h-sum-nan或1m-avg-zero。




如果我们要求没有填充策略的输出,则不会在t0 + 20s或t0 + 40s发射任何值或时间戳。 另外,
系列B的t0 + 30s和t0 + 50s的值将被线性内插以填入要与系列A相加的值。






### 小波变换中的下采样操作 小波变换是一种多分辨率分析工具,在信号处理和图像处理领域广泛应用。对于二维图像的小波变换,通常涉及分解过程中的低通滤波器和高通滤波器的应用以及随后的下采样操作。 #### 下采样的定义与作用 在离散小波变换过程中,经过滤波后的数据会经历一个称为“下采样”的步骤[^1]。该步骤通过丢弃一半的数据点来减少序列长度,从而达到压缩的效果并降低计算复杂度。具体来说,就是保留偶数索引位置上的样本而舍去奇数索引处的样本(或反之),这被称为二抽取(down-sampling by two)。 #### PyTorch Wavelets库实现示例 `pytorch_wavelets` 是一个用于执行快速小波变换(FWT)及其逆变换(IWT)的PyTorch扩展包。下面是一个简单的例子展示如何利用此库来进行一维信号的小波变换,并对其进行下采样: ```python import torch from pytorch_wavelets import DWTForward, DWTInverse # 初始化前向DWT对象,默认采用haar基函数 dwt = DWTForward(J=1) # 创建测试张量 x = torch.randn((1, 1, 64)) # 执行前向变换得到近似系数(approximation coefficients) 和细节系数(detail coefficients) A, D = dwt(x) print("原始输入大小:", x.shape) print("近似系数大小:", A.shape) print("细节系数大小:", D[0].shape) # 对近似系数进行下采样 downsampled_A = A[:, :, ::2] print("\n下采样后的近似系数大小:", downsampled_A.shape) ``` 上述代码片段展示了怎样使用 `pytorch_wavelets` 库完成一次单级的一维离散小波变换,并对产生的近似系数进行了简单形式的下采样操作。实际应用中可能还需要考虑边界条件等问题以确保结果准确性。 #### 图像分割中的应用 在图像分割任务里,可以先运用小波变换提取不同尺度下的特征信息,再结合其他算法如阈值法、区域生长等技术实施有效的分割策略。研究表明,这种方法能够有效提高边缘保持能力和抗噪性能[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值