首页 > 其他分享 >移动平均一

移动平均一

时间:2023-04-21 16:33:13浏览次数:31  
标签:int series len sourceList Add bufferList 移动 平均


移动平均,滤波,平滑等,这些概念其实都大同小异,其作用都是希望能把信号数值中的毛刺、噪点,给去掉抹平捋顺,留下真值。
这类的程序和工作做了不少,一直没有机会总结归纳整理下。趁着这次空挡的时间,写了一个算法调试工具,顺便写篇博客总结一下。
至于写了算法调试工具的目的,主要是为了提高效率。
我们一般调试算法的步骤是:


Created with Raphaël 2.2.0 开始 写算法,调参数 编译下载,在标准环境中运行 打印数据,复制到Excel 查看效果是否OK? 结束 yes no


如果使用算法调试工具,那我们的流程就可以变成这样


Created with Raphaël 2.2.0 开始 在标准环境下采集原始数据 将原始数据导入到算法调试工具中 调整算法和参数 编译下载,在标准环境中运行 打印数据,复制到Excel 查看效果是否OK? 结束 yes no


按照之前的流程,可能要走很多遍,效率不高。
有了算法调试工具后,理想情况下,一次搞定。
当然这种效率的提高,也是因为前期工作的准备(算法调试工具的开发)。
目前市面上有很多类似的,且更好用的工具,不过自己还是想要结合自身所学,综合考虑,自己开发一个算法调试工具。如下,目前功能还不多,慢慢增加。

移动平均一_滤波

简单移动平均

原理

若依次得到一组原始测定值时,按顺序取一定数量的数据并算得其全部算术平均值,得到的数据就叫做移动平均值
假设:
原始测定值为:移动平均一_卡夫曼_02
一定数量L 为:移动平均一_平滑_03(移动平均的窗口长度)
则:
移动平均值:移动平均一_卡夫曼_04

代码(C#)

int len = (int)simpleLenUpDown.Value;	//移动平均的窗口长度

            simpleList.Clear();//移动平均值队列
            List<double> bufferList = new List<double>();//移动平均窗口队列
            for (int i = 0; i < len; i++)
            {
                if (i >= sourceList.Count)
                    break;
                bufferList.Add(sourceList[i]);
                simpleList.Add(sourceList[i]);
            }
            for (int i = len; i < sourceList.Count; i++)
            {
                simpleList.Add(bufferList.Average());
                bufferList.RemoveAt(0);
                bufferList.Add(sourceList[i]);//移动
            }

			//刷新结果
            chartControl.BeginInit();
            Series series = new Series(simpleStr, ViewType.Line);
            series.Label.ResolveOverlappingMode = ResolveOverlappingMode.HideOverlapped;
            for (int i = 0; i < simpleList.Count; i++)
            {
                SeriesPoint seriesPoint = new SeriesPoint(i, simpleList[i]);
                series.Points.Add(seriesPoint);
            }
            chartControl.Series.Add(series);
            series.ArgumentScaleType = ScaleType.Numerical;
            chartControl.EndInit();

效果图

移动平均的窗口长度L=5

移动平均一_加权_05


移动平均的窗口长度L=50

移动平均一_滤波_06

分析

两张效果图已经很明细了,窗口L如果太小,则平滑效果不好。
窗口L如果太大,则会有明显的迟滞效应。
所以这种简单移动平均的应用很有局限性,需要你小心的调整这个窗口L的大小。

加权移动平均

原理

主要方法是,通过给较近的数值分配较高的权重,给较远的数值分配较低的权重。
主要目的是,在有不错的平滑效果情况下,尽量的减少其迟滞效应,更能反映当前的真值和未来的预测值。
权重分配的方法有很多,用的比较多的是线性法指数法。以下以线性加权移动平均为例。
假设:
原始测定值为:移动平均一_卡夫曼_02
一定数量L 为:移动平均一_平滑_03(移动平均的窗口长度)
则:
线性加权移动平均值:移动平均一_滤波_09

代码(C#)

private double getWeightListAverage(List<double> bufferList)
        {
            double sum = 0;
            int sumIndex = 0;
            for (int i = 0; i < bufferList.Count; i++)
            {
                sumIndex += i;
                sum += (i * bufferList[i]);
            }
            return sum / sumIndex;
        }
        
		private void weightUpdateBtn_Click(object sender, EventArgs e)
        {
            removeSeries(weightStr);

            int len = (int)weightLenUpDown.Value;

            weightList.Clear();
            List<double> bufferList = new List<double>();
            for (int i = 0; i < len; i++)
            {
                if (i >= sourceList.Count)
                    break;
                bufferList.Add(sourceList[i]);
                weightList.Add(sourceList[i]);
            }
            for (int i = len; i < sourceList.Count; i++)
            {
                weightList.Add(getWeightListAverage(bufferList));
                bufferList.RemoveAt(0);
                bufferList.Add(sourceList[i]);
            }

            chartControl.BeginInit();
            Series series = new Series(weightStr, ViewType.Line);
            series.Label.ResolveOverlappingMode = ResolveOverlappingMode.HideOverlapped;
            for (int i = 0; i < weightList.Count; i++)
            {
                SeriesPoint seriesPoint = new SeriesPoint(i, weightList[i]);
                series.Points.Add(seriesPoint);
            }
            chartControl.Series.Add(series);
            series.ArgumentScaleType = ScaleType.Numerical;
            chartControl.EndInit();
        }

效果图

移动平均一_加权_10

卡夫曼自适应移动平均

原理

卡夫曼自适应移动不同于以上两种的移动平均算法,它既能快速反应当前的真值和预测值,又能又较好的平滑效果。

原始测定值为:移动平均一_卡夫曼_02
窗口长度:移动平均一_平滑_12
短(快)周期长度:移动平均一_移动平均_13
长(慢)周期长度:移动平均一_移动平均_14

波动性
移动平均一_滤波_15

方向性
移动平均一_移动平均_16

效率系数
移动平均一_滤波_17

短周期均线系数
移动平均一_加权_18

长周期均线系数
移动平均一_加权_19

平滑系数
移动平均一_平滑_20
移动平均一_加权_21

公式
移动平均一_加权_22

代码(C#)

int len = (int)amaLenUpDown.Value;
            int fastLen = (int)amaFastLenUpDown.Value;
            int slowLen = (int)amaSlowLenUpDown.Value;

            amaList.Clear();
            double ama=0, lastAma=0;
            for (int i = 0; i < len; i++)
            {
                if (i >= sourceList.Count)
                    break;
                lastAma = sourceList[i];
                ama = lastAma;
                amaList.Add(ama);
            }

            for (int i = len; i < sourceList.Count; i++)
            {
                double direction = 0, er = 0, smooth= 0, c = 0, vol = 0;
                double fastest = 2.0 / (fastLen + 1);
                double slowest = 2.0 / (slowLen + 1);

                for (int j = i-len; j < i-1; j++)
                    vol += Math.Abs(sourceList[j] - sourceList[j + 1]);

                if (vol != 0)
                {
                    direction = Math.Abs(sourceList[i] - sourceList[i - len]);
                    er = direction / vol;
                    smooth1 = er * (fastest - slowest) + slowest;
                    c = smooth * smooth;

                    ama = lastAma + c * (sourceList[i] - lastAma);
                    if (c>1000)
                    {   //防止大跳跃,大突变
                        ama = sourceList[i];
                    }
                    lastAma = ama;
                }
                else
                {
                    ama = lastAma;
                } 
                amaList.Add(ama);
            }

            chartControl.BeginInit();
            Series series = new Series(amaStr, ViewType.Line);
            series.Label.ResolveOverlappingMode = ResolveOverlappingMode.HideOverlapped;
            for (int i = 0; i < amaList.Count; i++)
            {
                SeriesPoint seriesPoint = new SeriesPoint(i, amaList[i]);
                series.Points.Add(seriesPoint);
            }
            chartControl.Series.Add(series);
            series.ArgumentScaleType = ScaleType.Numerical;
            chartControl.EndInit();

效果图

移动平均一_卡夫曼_23

分析

不需要很大的窗口,就能有很好的平滑效果,且迟滞性很低。

这次分享到此结束,这类博客还有很多可以写的,后面希望能写出一个系列,分享更多更优更好的算法,迭代功能更强的算法调试工具。


标签:int,series,len,sourceList,Add,bufferList,移动,平均
From: https://blog.51cto.com/u_16081772/6213491

相关文章

  • 使用IDEA时,移动包,发现类爆红,或者类找不到如何解决
    今天因为要在之前做的模块中添加另一个功能,导致这个模块的项目层级需要变动。结果一动完蛋,之前的都爆红了。。。然后我0坤一动,Maven先clean一下再compile一下,结果还是没有解决。下面说一下具体解决方法:1、删除idea、impl跟代码不相关的文件后(idea文件可以不用删),重启idea;2、重......
  • 4.2.3 算平均数
       ......
  • 汇总|2023年十大移动开发IDE工具
    本文将介绍2023年十大移动开发IDE工具。一、AndroidStudio作为Android开发IDE工具的首选,AndroidStudio提供了一个全面的、灵活的开发环境,可以快速构建高质量的应用程序。AndroidStudio不仅可以构建Android应用程序,还可以构建基于Kotlin和Java的移动应用程序。二、Xcode作为iOS开......
  • 移动端开发遇到的坑
    1.移动端不要使用replaceAll,部分手机浏览器对该方法不兼容。请使用replace代替。2.IOS下的日期不支持newDate("2017-08-1112:00:00")格式请将'-'换成'/'。3.Android下的webview不支持8位16进制颜色(一般为6位,后两位表示颜色透明度),建议改成对应的agba格式。......
  • Python ArcPy批量计算多时相遥感影像的各项元平均值
      本文介绍基于Python中ArcPy模块,对大量长时间序列栅格遥感影像文件的每一个像元进行多时序平均值的求取。  在遥感应用中,我们经常需要对某一景遥感影像中的全部像元的像素值进行平均值求取——这一操作很好实现,基于ArcMap软件或者简单的Python代码就可以实现;但有时候,我们会......
  • Vue3移动端适配解决方案
    导读:使用vw和vh解决适配问题vw:viewwidth屏幕宽度,1vw等于屏幕宽度的百分之一vh:viewheight屏幕高度,1vh等于屏幕高度的百分之一使用插件postcss-px-to-viewport可以自动将px转换为vw/vh安装npmipostcss-px-to-viewport-Dvite.config.tsimportvuefrom'@vitejs/plugin......
  • 如何在移动端数据可视化大屏实现分析?
    本文由葡萄城技术团队于原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。项目想做数据可视化,想同时在PC端、手机端查看数据怎么办?业务主要关心的数据包括:销售数据、业绩达成、同比、环比,各产品销售情况及潜客商机、未来收入预测等......
  • sqlserver 移动用户及系统数据库文件位置方法
    查了下文档即使到2019版本,sqlserver移动数据库文件位置依然是要停机的,注意待移动文件大小,估计好停机时间。 sqlserver 移动数据库文件位置分为两大类:用户数据库系统数据库系统数据库又可分为再分为:除master及resource以外的系统数据库(model,msdb,tempdb)master数据库resource数据库......
  • ubuntu 使用移动硬盘出现无法挂载(解决办法)
    使用ubuntu11.04再移动硬盘copy过程中出现非正常关机,重启后无法mount硬盘,出现以下错误: 引用“Errormounting:mountexitedwithexitcode13:$MFTMirrdoesnotmatch$MFT(record0). Failedtomount'/dev/sdb1':Input/outputerror NTFSiseitherinconsistent,o......
  • TensorFlow 智能移动项目:11~12
    原文:IntelligentmobileprojectswithTensorFlow协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN深度学习译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。不要担心自己的形象,只关心如何实现目标。——《原则》,生活原则2.3.c十一、在移动设备上使用TensorFlowLite......