public List <AnomalyReport> detect(IDictionary <string, List <float> > table)
        {
            List <AnomalyReport> anomalyReport = new List <AnomalyReport>();

            foreach (CorrelatedFeatures correlatedFeature in cf)
            {
                for (int i = 0; i < table[correlatedFeature.Feature1].Count; i++)
                {
                    Point p = new Point(table[correlatedFeature.Feature1].ElementAt(i), table[correlatedFeature.Feature1].ElementAt(i));
                    if (!MinCircle.IsPointInside(correlatedFeature.CircleThreshold, p))
                    {
                        anomalyReport.Add(new AnomalyReport(correlatedFeature.Feature1 + "-" + correlatedFeature.Feature2, i));
                    }
                }
            }
            return(anomalyReport);
        }
        public void LearnNormal(IDictionary <string, List <float> > table)
        {
            int columnSize = table.ElementAt(0).Value.Count; //table.Keys.ElementAt(0)
            int rowSize    = table.Count;

            for (int i = 0; i < table.Count; i++)
            {
                CorrelatedFeatures cfs = new CorrelatedFeatures();
                cfs.Corr     = -1;
                cfs.Feature1 = table.ElementAt(i).Key;
                for (int j = i + 1; j < table.Count; j++)
                {
                    float correlation = AnomalyUtils.Pearson(table.ElementAt(i).Value, table.ElementAt(j).Value);
                    if (correlation > correlationThreshold)
                    {
                        if (correlation > cfs.Corr)
                        {
                            cfs.Feature2 = table.ElementAt(j).Key;
                            cfs.Corr     = correlation;
                            cfs.Lin_Reg  = AnomalyUtils.LinearReg(table.ElementAt(i).Value,
                                                                  table.ElementAt(j).Value);
                            cfs.Threshold = HighestDev(table.ElementAt(i).Value,
                                                       table.ElementAt(j).Value, cfs.Lin_Reg);

                            List <Point> pointsList = new List <Point>();
                            for (int k = 1; k < columnSize; k++)
                            {
                                pointsList.Add(new Point(table[cfs.Feature1].ElementAt(k), table[cfs.Feature2].ElementAt(k)));
                            }

                            cfs.CircleThreshold         = MinCircle.FindMinCircle(pointsList);
                            cfs.CircleThreshold.radius *= 1.1;
                        }
                    }
                }
                if (cfs.Corr > -1)
                {
                    cf.Add(cfs);
                }
            }
        }