線性演算法是基于最小二乘法所計算的平滑演算法,
具體可以參考這篇博客幾個簡單的資料點平滑處理演算法_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; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/287274.html
標籤:WPF
