移动标准差以及移动平均值(movstd、movmean)

最近在工作中遇到这样一个问题:
有一个序列长度为 nnn 的序列 T=[t0,t1,…,tn−1]T=[t_0, t_1, \dots, t_{n-1}]T=[t0​,t1​,…,tn−1​],给定一个窗大小 m(m<=n)m (m <= n)m(m<=n),下标从0开始,计算窗大小的均值和标准差,即计算T[0:m-1]、T[1:m]、T[2:m+1]…T[n-m+1:n] 的平均值和标准差

暴力解法

最简单的无脑的方法就是暴力循环了,很明显这种方法特别慢,时间复杂度为 O(n∗m)O(n*m)O(n∗m)

下面为你呈现暴力代码

import numpy as np
import time
# generate time sequence
n = 1000 * 1000
m = 1000
T = np.random.rand(n)
# brute force
means = np.zeros(n - m + 1)
stds = np.zeros(n - m + 1)start_time = time.time()
for i in range(n - m + 1):means[i] = np.mean( T[i:i+m] )
end_time = time.time()
print('Running time of brute force for mean is {}s'.format((end_time - start_time)))start_time = time.time()
for i in range(n - m + 1):stds[i] = np.std( T[i:i+m] )
end_time = time.time()
print('Running time of brute force for std is {}s'.format((end_time - start_time)))
Running time of brute force for mean is 5.774143934249878s
Running time of brute force for std is 20.721827030181885s

movmean

有没有办法进行优化呢?这里介绍移动标准差(movstd)和移动平均值(movmean)

先从移动平均值(movmean)开始,它很简单并且符合直觉:在滑动的过程中,有很多重叠部分,我们可以利用重叠的部分,从而节约计算时间

如上图所示,计算时可以利用前一个均值,这样就避免了不必要的加法操作,平均值的计算复杂度降低为 O(n)O(n)O(n)
μi∗m=(ti+ti+1+⋯+ti+m−1)\mu_i*m = (t_i + t_{i+1} + \dots + t_{i+m-1}) μi​∗m=(ti​+ti+1​+⋯+ti+m−1​)

μi+1∗m=μi∗m−ti+tm\mu_{i+1}*m = \mu_i*m - t_i + t_m μi+1​∗m=μi​∗m−ti​+tm​

下面代码显示了如何实现 movmean

def movmean(T, m):assert(m <= T.shape[0])n = T.shape[0]sums = np.zeros(n - m + 1)sums[0] = np.sum(T[0:m])cumsum = np.cumsum(T)cumsum = np.insert(cumsum, 0, 0) # 在数组开头插入一个0sums = cumsum[m:] - cumsum[:-m]return sums/m
start_time = time.time()
means_2 = movmean(T, m)
end_time = time.time()
print('Running time of movmean is {}s'.format((end_time - start_time)))
Running time of movmean is 0.009449005126953125s

movstd

在介绍移动标准差之前,我们先回顾下标准差计算公式:
σ=1m∑i=1m(ti−u)2\sigma = \sqrt{\frac{1}{m} \sum_{i=1}^m(t_i - u)^2} σ=m1​i=1∑m​(ti​−u)2​

假设有一个长度为 3 的序列 [a, b, c],我们来计算一下它的标准差

首先计算均值:
μ=1m(a+b+c)\mu = \frac{1}{m}(a+b+c) μ=m1​(a+b+c)

然后标准差:
σ=13((a−μ)2+(b−μ)2+(c−μ)2)=13(a2+b2+c2−2aμ−2bμ−2cμ+μ2)=13(a2+b2+c2)−(13(a+b+c))2\begin{array}{l} \sigma &= \sqrt{ \frac{1}{3} ((a-\mu)^2 + (b-\mu)^2 + (c-\mu)^2)} \\ &= \sqrt{ \frac{1}{3} (a^2 + b^2 + c^2 -2a\mu - 2b\mu - 2c\mu + \mu^2)} \\ &= \sqrt{ \frac{1}{3}(a^2+b^2+c^2) - (\frac{1}{3}(a+b+c))^2 } \\ \end{array} σ​=31​((a−μ)2+(b−μ)2+(c−μ)2)​=31​(a2+b2+c2−2aμ−2bμ−2cμ+μ2)​=31​(a2+b2+c2)−(31​(a+b+c))2​​

我们可以发现,标准差的计算可以用累计和来表示,而累加和是可以在 O(n)O(n)O(n)时间内完成,这就是 movstd

下面的代码展示了如何计算 movstd

def movstd(T, m):n = T.shape[0]cumsum = np.cumsum(T)cumsum_square = np.cumsum(T**2)cumsum = np.insert(cumsum, 0, 0)               # 在数组开头插入一个0cumsum_square = np.insert(cumsum_square, 0, 0) # 在数组开头插入一个0seg_sum = cumsum[m:] - cumsum[:-m]seg_sum_square = cumsum_square[m:] - cumsum_square[:-m]return np.sqrt( seg_sum_square/m - (seg_sum/m)**2 )
start_time = time.time()
stds_2 = movstd(T, m)
end_time = time.time()
print('Running time of movstd is {}s'.format((end_time - start_time)))
Running time of movstd is 0.03198814392089844s

总结

通过提前计算好累计和,移动平均和移动标准差以空间换时间,算法速度比起暴力方法提升了几个数量级

移动标准差以及移动平均值(movstd、movmean)相关推荐

  1. xgboost算法_工业大数据:分析算法

    一. 应用背景 大数据分析模型的研究可以分为3个层次,即描述分析(探索历史数据并描述发生了什么).预测分析(未来的概率和趋势)和规范分析(对未来的决策给出建议).工业大数据分析的理论和技术研究仍处于起 ...

  2. 【神经网络】梯度消失与梯度爆炸问题

    梯度消失与梯度爆炸问题 Glorot 和 He 初始化 我们需要信号在两个方向上正确流动:进行预测时,信号为正向:在反向传播梯度时,信号为反向.我们需要每层输出的方差等于输入的方差,并且在反方向流过某 ...

  3. Numpy 统计变量(平均值、标准差、方差、最大、最小、和、乘积、对角线和)

    1. reshape reshape 后的数组,仅仅是原来数组的视图 view ,并没有发生复制元素的行为,这样才能保证 reshape 操作更为高效. In [1]: import numpy as ...

  4. 计算点云之间的平均距离,方差,标准差

    Tips: 看公式,可以推断出计算标准差分为几步: 计算平均值u=(x1+x2+...+xn)/n 计算方差s²=((x1-u)^2 +(x2-u)^2 +...+(xn-u)^2)/n 计算标准差σ ...

  5. 概率论中均值、方差、标准差介绍及C++/OpenCV/Eigen的三种实现

    概率论是用于表示不确定性声明(statement)的数学框架.它不仅提供了量化不确定性的方法,也提供了用于导出新的不确定性声明的公理.在人工智能领域,概率论主要有两种用途.首先,概率法则告诉我们AI系 ...

  6. 方差,标准差,协方差、期望值

    方差:方差是变量与其平均值的平方和的算术平均值,例如: 有一组数据{4,5,6,7}, 平均值为:(4+5+6+7)/4=22/4=5.5 其方差为:[(4-5.5)2+(5-5.5)2+(6-5.5 ...

  7. java 移动平均值_使用用户输入数组移动平均线

    我需要编写一个程序,通过用户输入的数组计算移动平均值 . 数组的第一个元素是窗口大小,输入以0结尾 . 输出值在小数点后打印两位数 . 示例输入: 3 2 4 7 7 8 11 12 0 对应输出: ...

  8. 计算图像的标准差与方差(meanStdDev() 函数)

    转自:https://blog.csdn.net/xiachong27/article/details/88877507 均值反映了图像的亮度,均值越大说明图像亮度越大,反之越小: 标准差反映了图像像 ...

  9. R语言plotly可视化:plotly可视化箱图、基于预先计算好的分位数、均值、中位数等统计指标可视化箱图、箱图中添加缺口、可视化均值和标准差(With Precomputed Quartiles)

    R语言plotly可视化:plotly可视化箱图.基于预先计算好的分位数.均值.中位数等统计指标可视化箱图.箱图中添加缺口.可视化均值和标准差(Box Plot With Precomputed Qu ...

最新文章

  1. Java IO流之内存流
  2. .NET Core 2.1 Preview 2发布 - April 10, 2018
  3. 在hibernate框架中配置显示sql语句
  4. $.post 中文乱码 php,如何解决jquery $.post 乱码问题
  5. 在一个请求分页系统中,假定系统分配给一个作业的物理块数为 3,并且此作业的页面走向为 2、3、2、1、5、2、4、5、3、2、5、2。试用 FIFO和 LRU 两种算法分别计算出程序访问过程中所发生
  6. Java 将图片或者视频模糊化(附代码) | Java工具类
  7. ColorZilla|网页颜色颜色提取
  8. abaqus2020安装教程
  9. win7 php7.1,win7下php7.1运行getenv('REMOTE_ADDR')fastcgi停止运行-Go语言中文社区
  10. 邮箱登陆时显示服务器连接失败,邮箱显示无法连接服务器
  11. Kindle接入HomeAssistant:实现锁屏壁纸显示HA内设备信息并在HA内获取Kindle电量
  12. linux do_irq 报错 代码,linux-2.6.38中断机制分析—asm_do_IRQ
  13. 微前端在平台级管理系统中的最佳实践
  14. 数据库连接池与DBUtils工具
  15. Confluence 6 空间权限概述
  16. 太赫兹芯片是什么原理_芯片测试的颠覆者:太赫兹准光技术
  17. 【知乎Live】狼叔:如何正确的学习Node.js
  18. UiPath常见的变量转换及相关函数整理
  19. 污水处理常用6种流量计
  20. 城市大脑英文论文在2018 IEEE CCSWD会议发表

热门文章

  1. 85后转行java,一名85后阿里老程序员的真心话
  2. python mysql s_Python-MySQL
  3. gradle 编译java配置文件_java – 如何在编译时使gradle使用正确的JDK?
  4. 湖北工业大学计算机学院王泽建,“指尖年轮,感恩成长”计算机学院2019届毕业生晚会圆满举行...
  5. java response 状态码_response(向客户端写入数据、对相应进行设置(状态码、响应头))...
  6. Vue框架搭建快速入门
  7. Linux(三):VMware Tools安装
  8. nextcloud icon_聊一聊爱车吉利ICON带给我的用车感受
  9. qt 实现拖动矩形角度_PPT技巧应用—利用PPT的遮罩效果来实现文字的炫彩变化
  10. java多线程编程_Java多线程编程