WPF 基於五點線性平滑曲線算法

線性算法是基於最小二乘法所計算的平滑算法,

具體可以參考這篇博客幾個簡單的數據點平滑處理算法_Ivan 的專欄-CSDN博客_數據平滑處理

其他的算法原文解釋是:

算法的原理很簡單,以五點三次平滑爲例。取相鄰的5個數據點,可以擬合出一條3次曲線來,然後用3次曲線上相應的位置的數據值作爲濾波後結果。簡單的說就是 Savitzky-Golay 濾波器 。

只不過Savitzky-Golay 濾波器並不特殊考慮邊界的幾個數據點,而這個算法還特意把邊上的幾個點的數據擬合結果給推導了出來。

 

我沒找到具體原公式...這一點很是遺憾,也不知道到底根據什麼算的係數.

代碼不是C#的,但是很好改成C#。

我覺得線性的代碼就很不錯了,速度也很快。

迭代的次數最好是小於20次,不然就趨向於直線了,這個算法也許不一定適用所有的情況,時間序列應該是沒多大問題的。

 

 

這個數據是我截取某個股票的數據,數據點1200個,看得出平滑的效果還是不錯的

 

 

 

修改的代碼

   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;
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章