public FittingResult Predict(Spectrum specInput, bool needFilter = true, int numOfId = 5, int topK = 1) { var spec = specInput.Clone(); var y = new MWNumericArray(specInput.Data.Lenght, 1, specInput.Data.Y); //进行预处理 if (needFilter && this._filters != null) { y = Preprocesser.ProcessForPredict(this._filters, y); spec.Data.Y = (double[])y.ToVector(MWArrayComponent.Real); } var handler = Tools.ModelHandler; var rlst = handler.FitPredictor(5, this._lib.X, y, this._wind, (MWNumericArray)this._region.VarIndex, topK); var tq = (MWNumericArray)rlst[0]; var sq = (MWNumericArray)rlst[1]; var ratio = (MWNumericArray)rlst[2]; var idx = (MWNumericArray)rlst[3]; var fit = (MWNumericArray)rlst[4]; var fitspec = spec.Clone(); fitspec.Components = this._lib.Components.Clone(); fitspec.Data.Y = (double[])fit.ToVector(MWArrayComponent.Real); var r = new FittingResult() { SpecOriginal = spec, SQ = sq.ToScalarDouble(), TQ = tq.ToScalarDouble(), FitSpec = fitspec, MinSQ = this._minSQ, MinTQ = this._TQ, Wind = this._wind, VarIndex = this._region.VarIndex }; var flst = new List <FittingSpec>(); for (int i = 1; i <= ratio.NumberOfElements; i++) { if ((double)ratio[i] <= double.Epsilon) { break; } flst.Add(new FittingSpec() { Spec = this._lib[(int)idx[i] - 1], Rate = (double)ratio[i] }); } r.Specs = flst.ToArray(); this.getResult(ref r); r.Result = r.TQ >= this._TQ && r.SQ >= this._minSQ; return(r); }
private static SpecBase mix(Spectrum s, double[] v1, double[] v2, double[] v3, string[] names) { var lib = new SpecBase(); lib.Comp_Add(new Component() { Name = names[0], Eps = 2 }); lib.Comp_Add(new Component() { Name = names[1], Eps = 2 }); lib.Comp_Add(new Component() { Name = names[2], Eps = 2 }); var rlst = Tools.ToolHandler.Mix3(4, (MWNumericArray)v1, (MWNumericArray)v2, (MWNumericArray)v3); var x = (MWNumericArray)rlst[0]; var c1 = (double[])((MWNumericArray)rlst[1]).ToVector(MWArrayComponent.Real); var c2 = (double[])((MWNumericArray)rlst[2]).ToVector(MWArrayComponent.Real); var c3 = (double[])((MWNumericArray)rlst[3]).ToVector(MWArrayComponent.Real); for (int i = 0; i < x.Dimensions[1]; i++) { var st = s.Clone(); st.Usage = UsageTypeEnum.Calibrate; st.Components.Clear(); st.Components.Add(new Component() { Name = names[0], ActualValue = c1[i] }); st.Components.Add(new Component() { Name = names[1], ActualValue = c2[i] }); st.Components.Add(new Component() { Name = names[2], ActualValue = c3[i] }); st.Name = (i + 1).ToString(); st.Color = Spectrum.RandomColor(); st.Data.Y = (double[])Tools.SelectColumn(x, i + 1).ToVector(MWArrayComponent.Real); lib.Add(st); } return(lib); }
public IdentifyResult Predict(Spectrum speciii, bool needFilter = true, int numOfId = 5, int topK = 1) { if (this._lib == null || speciii == null) { throw new ArgumentNullException(""); } var spec = speciii.Clone(); var y = new MWNumericArray(speciii.Data.Lenght, 1, speciii.Data.Y); //进行预处理 if (needFilter && this._filters != null) { y = Preprocesser.ProcessForPredict(this._filters, y); spec.Data.Y = (double[])y.ToVector(MWArrayComponent.Real); } var handler = Tools.ModelHandler; //Tools.ToolHandler.Save(this._lib.X, "x", "x"); //Tools.ToolHandler.Save(y, "y", "y"); //Tools.ToolHandler.Save(this._baseLib.X, "xa", "xa"); //this.LibBase.FullPath = "aaaa.lib"; //this.LibBase.Save(); this._maxNum = Math.Min(this._maxNum, this._lib.X.Dimensions[1]); var rlst = handler.IdentifyPredictor(3, this._lib.X, y, this._wind, this._maxNum, this._p, this._w, this._t, topK); var minSQ = (MWNumericArray)rlst[0]; var minTQ = (MWNumericArray)rlst[1]; var ad = (MWNumericArray)rlst[2]; var r = new IdentifyResult() { Spec = spec, MinSQ = this.MinSQ, MinTQ = this.TQ }; //设置结果 var itemlst = new List <IdentifyItem>(); // r.Items = new IdentifyItem[ad.NumberOfElements]; for (int i = 0; i < this._maxNum; i++) { var adidx = (int)ad[i + 1] - 1; if (adidx >= this._lib.Count || adidx < 0) { break; } itemlst.Add(new IdentifyItem() { Parent = r, TQ = (double)minTQ[i + 1], SQ = (double)minSQ[i + 1], Spec = this._lib[adidx], Wind = this._wind, SpecOriginal = r.Spec }); } r.Items = itemlst.ToArray(); r = GetPredictValue(r, r.Items.Length, numOfId); r.IsId = r.Items.Where(d => d.Result).Count() > 0; return(r); }
private void btnCompute_Click(object sender, EventArgs e) { if (spec1 == null || spec2 == null) { MessageBox.Show(string.Format("第{0}条光谱为空,请先选择。", spec1 == null ? 1 : 2), "信息提示"); return; } int mwin = 0; if (!int.TryParse(txbmwin.Text, out mwin)) { MessageBox.Show("移动窗口大小必须为整数", "信息提示"); return; } IList <IFilter> filters = new List <IFilter>(); if (this._model != null) { if (this._model is IdentifyModel) { filters = ((IdentifyModel)this._model).Filters; } else if (this._model is FittingModel) { filters = ((FittingModel)this._model).Filters; } } var s1 = spec1.Clone(); var s2 = spec2.Clone(); //对光谱预处理 if (filters != null) { var ya = new MWNumericArray(s1.Data.Lenght, 1, s1.Data.Y); var yb = new MWNumericArray(s2.Data.Lenght, 1, s2.Data.Y); bool splitadd = false; var y1 = (MWNumericArray)ya.Clone(); var y2 = (MWNumericArray)yb.Clone(); var x1 = Serialize.DeepClone <double[]>(s1.Data.X); var x2 = Serialize.DeepClone <double[]>(s2.Data.X); var y1lst = new List <MWNumericArray>(); var x1lst = new List <double[]>(); var y2lst = new List <MWNumericArray>(); var x2lst = new List <double[]>(); foreach (var tf in filters) { var f = RIPP.Lib.Serialize.DeepClone <RIPP.NIR.Data.Filter.IFilter>(tf); if (f is Spliter) { if (splitadd) { x1lst.Add(x1); y1lst.Add(y1); x2lst.Add(x2); y2lst.Add(y2); } splitadd = false; y1 = (MWNumericArray)ya.Clone(); y2 = (MWNumericArray)yb.Clone(); x1 = Serialize.DeepClone <double[]>(s1.Data.X); x2 = Serialize.DeepClone <double[]>(s2.Data.X); } else { splitadd = true; } y1 = f.Process(y1); y2 = f.Process(y2); if (f.FType == FilterType.VarFilter) { x1 = f.VarProcess(x1); x2 = f.VarProcess(x2); } } if (splitadd) { x1lst.Add(x1); y1lst.Add(y1); x2lst.Add(x2); y2lst.Add(y2); } //合并 if (x1lst.Count > 0) { s1.Data.X = x1lst[0]; s1.Data.Y = (double[])y1lst[0].ToVector(MWArrayComponent.Real); s2.Data.X = x2lst[0]; s2.Data.Y = (double[])y2lst[0].ToVector(MWArrayComponent.Real); for (int i = 1; i < x1lst.Count; i++) { s1.Data.X = RIPP.NIR.Data.Tools.InsertColumn(s1.Data.X, x1lst[i], s1.Data.X.Length + 1); s1.Data.Y = RIPP.NIR.Data.Tools.InsertColumn(s1.Data.Y, (double[])y1lst[i].ToVector(MWArrayComponent.Real), s1.Data.Y.Length + 1); s2.Data.X = RIPP.NIR.Data.Tools.InsertColumn(s2.Data.X, x2lst[i], s2.Data.X.Length + 1); s2.Data.Y = RIPP.NIR.Data.Tools.InsertColumn(s2.Data.Y, (double[])y2lst[i].ToVector(MWArrayComponent.Real), s2.Data.Y.Length + 1); } } else { s1.Data.X = x1; s1.Data.Y = (double[])y1.ToVector(MWArrayComponent.Real); s2.Data.X = x2; s2.Data.Y = (double[])y2.ToVector(MWArrayComponent.Real); } //s1.Data.Y = (double[])y1.ToVector(MWArrayComponent.Real); //s2.Data.Y = (double[])y2.ToVector(MWArrayComponent.Real); } if (this._model is FittingModel) { var f = ((FittingModel)this._model).IdRegion; s1.Data.X = f.VarProcess(s1.Data.X); s2.Data.X = f.VarProcess(s2.Data.X); s1.Data.Y = f.VarProcess(s1.Data.Y); s2.Data.Y = f.VarProcess(s2.Data.Y); } //绘制 var lst = new List <Spectrum>(); lst.Add(s1); lst.Add(s2); this.specGraph3.DrawSpec(lst); this.specGraph3.SetTitle("预处理后光谱"); double[] tSQ; double tTQ; RIPP.NIR.Data.Tools.MWCorr(s1.Data.Y, s2.Data.Y, mwin, out tTQ, out tSQ); var spec = RIPP.Lib.Serialize.DeepClone <Spectrum>(s1); spec.Data.Y = tSQ; spec.Name = "SQ"; spec.Color = Color.Blue; this.specGraph2.DrawSpec(new List <Spectrum>() { spec }); this.txbTQ.Text = tTQ.ToString("f3"); this.txbSQ.Text = tSQ.Min().ToString("f3"); }
/// <summary> /// 预测 /// </summary> /// <param name="spec"></param> /// <param name="needFilter">是否需要前处理</param> /// <returns></returns> public PLS1Result Predict(Spectrum spec, bool needFilter = true, int numOfId = 5, int topK = 1) { if (spec == null) { throw new ArgumentNullException(""); } var s = spec.Clone(); if (s.Data == null || s.Data.Y == null || s.Data.Y.Length == 0) { return(null); } var x = new MWNumericArray(s.Data.Lenght, 1, s.Data.Y); //进行预处理 if (needFilter && this._filters != null) { x = Preprocesser.ProcessForPredict(this._filters, x); s.Data.Y = (double[])x.ToVector(MWArrayComponent.Real); } var c = this._comp.Clone(); //定义变量 double[] SR, MD, ND, Ylast; var handler = Tools.ModelHandler; if (this._annType != PLSAnnEnum.None) { var r = handler.PLS1Predictor(5, x, this._Scores, this._Loads, this._Weights, this._Bias, this._Score_Length, this._centerSpecData, this._centerCompValue, (int)this._method); var toolHandler = Tools.ToolHandler; // SR,MD,nd,XScores Ylast = (double[])((MWNumericArray)r[0]).ToVector(MWArrayComponent.Real); SR = (double[])((MWNumericArray)r[1]).ToVector(MWArrayComponent.Real); MD = (double[])((MWNumericArray)r[2]).ToVector(MWArrayComponent.Real); ND = (double[])((MWNumericArray)r[3]).ToVector(MWArrayComponent.Real); var mscores = (MWNumericArray)toolHandler.Centring(1, r[4], this._ScoresMean)[0]; var annp = (MWNumericArray)handler.annp(1, mscores, this._annModel.w1, this._annModel.b1, this._annModel.w2, this._annModel.b2, this._annArgus.F1.GetDescription(), this._annArgus.F2.GetDescription())[0]; Ylast[this._factor - 1] = annp.ToScalarDouble() + this._centerCompValue; } else { var r = handler.PLS1Predictor(5, x, this._Scores, this._Loads, this._Weights, this._Bias, this._Score_Length, this._centerSpecData, this._centerCompValue, (int)this._method); Ylast = (double[])((MWNumericArray)r[0]).ToVector(MWArrayComponent.Real); SR = (double[])((MWNumericArray)r[1]).ToVector(MWArrayComponent.Real); MD = (double[])((MWNumericArray)r[2]).ToVector(MWArrayComponent.Real); ND = (double[])((MWNumericArray)r[3]).ToVector(MWArrayComponent.Real); } c.PredictedValue = Ylast[this.Factor - 1]; // c.PredictedValue = this._Nonnegative && c.PredictedValue < 0 ? 0 : c.PredictedValue; c.PredictedValue = this._Nonnegative && c.PredictedValue < 0 ? Math.Pow(10, -c.Eps) : c.PredictedValue; if (s.Components != null && s.Components.Contains(c.Name)) { c.ActualValue = s.Components[c.Name].ActualValue; c.Error = c.PredictedValue - c.ActualValue; } //加入判定条件,设置样式 int errorcount = 0; if (MD[this._factor - 1] > this._MDMin) { errorcount++; } else if (SR[this._factor - 1] > this._SRMin) { errorcount++; } else if (ND[this._factor - 1] > this._NNDMin) { errorcount++; } switch (errorcount) { case 0: c.State = ComponentStatu.Pass; break; case 1: c.State = ComponentStatu.Green; break; case 2: c.State = ComponentStatu.Blue; break; default: c.State = ComponentStatu.Red; break; } PLS1Result item = new PLS1Result() { Spec = s, MDMin = this._MDMin, NDMin = this._NNDMin, SRMin = this._SRMin, Comp = c, MahDist = MD, ND = ND, SR = SR, YLast = Ylast, Factor = this.Factor }; return(item); }