欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF 基于五点线性平滑曲线算法

程序员文章站 2022-05-03 10:41:26
线性算法是基于最小二乘法所计算的平滑算法, 具体可以参考这篇博客几个简单的数据点平滑处理算法_Ivan 的专栏-CSDN博客_数据平滑处理 其他的算法原文解释是: 算法的原理很简单,以五点三次平滑为例。取相邻的5个数据点,可以拟合出一条3次曲线来,然后用3次曲线上相应的位置的数据值作为滤波后结果。简 ......

线性算法是基于最小二乘法所计算的平滑算法,

具体可以参考这篇博客几个简单的数据点平滑处理算法_ivan 的专栏-csdn博客_数据平滑处理

其他的算法原文解释是:

算法的原理很简单,以五点三次平滑为例。取相邻的5个数据点,可以拟合出一条3次曲线来,然后用3次曲线上相应的位置的数据值作为滤波后结果。简单的说就是 savitzky-golay 滤波器 。

只不过savitzky-golay 滤波器并不特殊考虑边界的几个数据点,而这个算法还特意把边上的几个点的数据拟合结果给推导了出来。

 

我没找到具体原公式...这一点很是遗憾,也不知道到底根据什么算的系数.

代码不是c#的,但是很好改成c#。

我觉得线性的代码就很不错了,速度也很快。

迭代的次数最好是小于20次,不然就趋向于直线了,这个算法也许不一定适用所有的情况,时间序列应该是没多大问题的。

 

WPF  基于五点线性平滑曲线算法

 

这个数据是我截取某个股票的数据,数据点1200个,看得出平滑的效果还是不错的

 

WPF  基于五点线性平滑曲线算法

 

 

修改的代码

   private list<point> linearsmooth5(list<point> data)
        {

            list<point> restult = new list<point>();
            var count = data.count;
            if (count <= 5)
            {
                for (int i = 0; i <= count - 1; i++)
                {

                    restult.add(data[i]);
                }
            }
            else
            {

                double y = (3.0 * data[0].y + 2.0 * data[1].y + data[2].y - data[4].y) / 5.0;
                restult.add(new point(data[0].x, y));
                y = (4.0 * data[0].y + 3.0 * data[1].y + 2 * data[2].y + data[3].y) / 10.0;
                restult.add(new point(data[1].x, y));
                for (int i = 2; i <= count - 3; i++)
                {
                    y = (data[i - 2].y + data[i - 1].y + data[i].y + data[i + 1].y + data[i + 2].y) / 5.0;
                    restult.add(new point(data[i].x, y));
                }
                y = (4.0 * data[count - 1].y + 3.0 * data[count - 2].y + 2 * data[count - 3].y + data[count - 4].y) / 10.0;
                restult.add(new point(data[count - 2].x, y));
                y = (3.0 * data[count - 1].y + 2.0 * data[count - 2].y + data[count - 3].y - data[count - 5].y) / 5.0;
                restult.add(new point(data[count - 1].x, y));
            }
            return restult;
        }