移动标准差以及移动平均值(movstd、movmean)
移动标准差以及移动平均值(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} σ=m1i=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)相关推荐
- xgboost算法_工业大数据:分析算法
一. 应用背景 大数据分析模型的研究可以分为3个层次,即描述分析(探索历史数据并描述发生了什么).预测分析(未来的概率和趋势)和规范分析(对未来的决策给出建议).工业大数据分析的理论和技术研究仍处于起 ...
- 【神经网络】梯度消失与梯度爆炸问题
梯度消失与梯度爆炸问题 Glorot 和 He 初始化 我们需要信号在两个方向上正确流动:进行预测时,信号为正向:在反向传播梯度时,信号为反向.我们需要每层输出的方差等于输入的方差,并且在反方向流过某 ...
- Numpy 统计变量(平均值、标准差、方差、最大、最小、和、乘积、对角线和)
1. reshape reshape 后的数组,仅仅是原来数组的视图 view ,并没有发生复制元素的行为,这样才能保证 reshape 操作更为高效. In [1]: import numpy as ...
- 计算点云之间的平均距离,方差,标准差
Tips: 看公式,可以推断出计算标准差分为几步: 计算平均值u=(x1+x2+...+xn)/n 计算方差s²=((x1-u)^2 +(x2-u)^2 +...+(xn-u)^2)/n 计算标准差σ ...
- 概率论中均值、方差、标准差介绍及C++/OpenCV/Eigen的三种实现
概率论是用于表示不确定性声明(statement)的数学框架.它不仅提供了量化不确定性的方法,也提供了用于导出新的不确定性声明的公理.在人工智能领域,概率论主要有两种用途.首先,概率法则告诉我们AI系 ...
- 方差,标准差,协方差、期望值
方差:方差是变量与其平均值的平方和的算术平均值,例如: 有一组数据{4,5,6,7}, 平均值为:(4+5+6+7)/4=22/4=5.5 其方差为:[(4-5.5)2+(5-5.5)2+(6-5.5 ...
- java 移动平均值_使用用户输入数组移动平均线
我需要编写一个程序,通过用户输入的数组计算移动平均值 . 数组的第一个元素是窗口大小,输入以0结尾 . 输出值在小数点后打印两位数 . 示例输入: 3 2 4 7 7 8 11 12 0 对应输出: ...
- 计算图像的标准差与方差(meanStdDev() 函数)
转自:https://blog.csdn.net/xiachong27/article/details/88877507 均值反映了图像的亮度,均值越大说明图像亮度越大,反之越小: 标准差反映了图像像 ...
- R语言plotly可视化:plotly可视化箱图、基于预先计算好的分位数、均值、中位数等统计指标可视化箱图、箱图中添加缺口、可视化均值和标准差(With Precomputed Quartiles)
R语言plotly可视化:plotly可视化箱图.基于预先计算好的分位数.均值.中位数等统计指标可视化箱图.箱图中添加缺口.可视化均值和标准差(Box Plot With Precomputed Qu ...
最新文章
- Java IO流之内存流
- .NET Core 2.1 Preview 2发布 - April 10, 2018
- 在hibernate框架中配置显示sql语句
- $.post 中文乱码 php,如何解决jquery $.post 乱码问题
- 在一个请求分页系统中,假定系统分配给一个作业的物理块数为 3,并且此作业的页面走向为 2、3、2、1、5、2、4、5、3、2、5、2。试用 FIFO和 LRU 两种算法分别计算出程序访问过程中所发生
- Java 将图片或者视频模糊化(附代码) | Java工具类
- ColorZilla|网页颜色颜色提取
- abaqus2020安装教程
- win7 php7.1,win7下php7.1运行getenv('REMOTE_ADDR')fastcgi停止运行-Go语言中文社区
- 邮箱登陆时显示服务器连接失败,邮箱显示无法连接服务器
- Kindle接入HomeAssistant:实现锁屏壁纸显示HA内设备信息并在HA内获取Kindle电量
- linux do_irq 报错 代码,linux-2.6.38中断机制分析—asm_do_IRQ
- 微前端在平台级管理系统中的最佳实践
- 数据库连接池与DBUtils工具
- Confluence 6 空间权限概述
- 太赫兹芯片是什么原理_芯片测试的颠覆者:太赫兹准光技术
- 【知乎Live】狼叔:如何正确的学习Node.js
- UiPath常见的变量转换及相关函数整理
- 污水处理常用6种流量计
- 城市大脑英文论文在2018 IEEE CCSWD会议发表
热门文章
- 85后转行java,一名85后阿里老程序员的真心话
- python mysql s_Python-MySQL
- gradle 编译java配置文件_java – 如何在编译时使gradle使用正确的JDK?
- 湖北工业大学计算机学院王泽建,“指尖年轮,感恩成长”计算机学院2019届毕业生晚会圆满举行...
- java response 状态码_response(向客户端写入数据、对相应进行设置(状态码、响应头))...
- Vue框架搭建快速入门
- Linux(三):VMware Tools安装
- nextcloud icon_聊一聊爱车吉利ICON带给我的用车感受
- qt 实现拖动矩形角度_PPT技巧应用—利用PPT的遮罩效果来实现文字的炫彩变化
- java多线程编程_Java多线程编程