/// <summary> /// 获取数窗口 /// </summary> /// <param name="refKey"></param> /// <returns></returns> public NumeralWindowData <TKey> GetNumeralWindowData(TKey refKey) { foreach (var item in Cashes.Data) { if (item.Key.Contains(refKey)) { return(Cashes[item.Key]); } } //提取数据 NumeralWindowData <TKey> window = new NumeralWindowData <TKey>(int.MaxValue); var seg = this.GetSegmentKeyValue(refKey); if (seg.Value == null) { return(null); } foreach (var item in seg.Value.Data) { window.Add(item.Key, item.Value); } //缓存 Cashes[seg.Key] = window; return(window); }
public static NumeralWindowData operator +(NumeralWindowData data, double val) { NumeralWindowData result = new NumeralWindowData(data.Count); foreach (var item in data) { result.Add(item + val); } return(result); }
public static NumeralWindowData <TKey> operator +(NumeralWindowData <TKey> data, double val) { NumeralWindowData <TKey> result = new NumeralWindowData <TKey>(data.Count); foreach (var item in data.Data) { result.Add(item.Key, item.Value + val); } return(result); }
/// <summary> /// 按键间隔分离小窗口。如果间之间的间距超过了指定宽度,则分离成两个或多个子窗口。 /// </summary> /// <param name="funcKeyToDouble">将Key转换为数值</param> /// <param name="maxKeySpan"></param> /// <returns></returns> public List <NumeralWindowData <TKey> > Split(Func <TKey, double> funcKeyToDouble, double maxKeySpan) { var initSelects = new List <NumeralWindowData <TKey> >(); var window = new NumeralWindowData <TKey>(Int16.MaxValue); initSelects.Add(window); var lastKeyVal = Double.MinValue; foreach (var kv in this.Data) { var key = kv.Key; var val = kv.Value; var keVal = funcKeyToDouble(kv.Key); if (window.Count < 1) { window.Add(kv.Key, kv.Value); lastKeyVal = keVal; continue; } var differ = Math.Abs(lastKeyVal - keVal); var isPassed = differ <= maxKeySpan; if (isPassed) { window.Add(kv.Key, kv.Value); } else { //update window size window.WindowSize = window.Count; //create new window = new NumeralWindowData <TKey>(Int16.MaxValue); initSelects.Add(window); } //update lastKeyVal = keVal; } window.WindowSize = window.Count; return(initSelects); }
/// <summary> /// 采用平均值方法,对值进行比较,如果超限则就地分解。 /// </summary> /// <param name="errorTimes"></param> /// <returns></returns> public List <NumeralWindowData <TKey> > SplitByAverage(int errorTimes) { //1.初选,采用平均法,放大方差要求,将数据进行分段。 //遍历, var initSelects = new List <NumeralWindowData <TKey> >(); var window = new NumeralWindowData <TKey>(Int16.MaxValue); initSelects.Add(window); foreach (var kv in this.Data) { var key = kv.Key; var val = kv.Value; if (window.Count < 1) { window.Add(kv.Key, kv.Value); continue; } var ave = window.Average; var differ = Math.Abs(ave.Value - kv.Value); var rms = ave.Rms == 0 ? double.MaxValue : ave.Rms; var errorThreshold = errorTimes * rms; var isPassed = differ <= errorThreshold; if (isPassed) { window.Add(kv.Key, kv.Value); } else { window.WindowSize = window.Count; window = new NumeralWindowData <TKey>(Int16.MaxValue); initSelects.Add(window); } } window.WindowSize = window.Count; return(initSelects); }
/// <summary> /// 拟合后返回各项的拟合误差 /// </summary> /// <param name="polyFitOrder"></param> /// <returns></returns> public NumeralWindowData <TKey> GetFitErrorWindow(int polyFitOrder) { NumeralWindowData <TKey> errors = new NumeralWindowData <TKey>(this.WindowSize) { KeyToDouble = KeyToDouble }; var fitter = BuildPolyfitter(polyFitOrder); var firstKey = this.TheVeryFirstKey; foreach (var item in this.OrderedData) { var x = KeyToDouble(item.Key) - KeyToDouble(firstKey); var error = item.Value - fitter.GetY(x); errors.Add(item.Key, error); } return(errors); }