public static void perfom() { //var chi2val = SpecialFunction.chisq(1, 0.5); //return; // load file var infSys = new DecisionSystem(); string filename = @"data/iris.csv"; //string filename = @"data/input1.csv"; StreamReader reader = new StreamReader(filename); infSys.ConditionAttributes = new int[] { 1, 2, 3, 4 }; infSys.DecisionAttribute = 5; // Universe reader.ReadLine(); // ignore header line List<double?[]> objs = new List<double?[]>(); List<double?> obj; int idTracker = 0; Dictionary<int, List<double>> attrDomain = new Dictionary<int,List<double>>(); for(int i = 0; i < 6; i ++) attrDomain.Add(i, new List<double>()); while (!reader.EndOfStream) { string line = reader.ReadLine(); obj = new List<double?>(); obj.Add(++idTracker); var numbers = line.Split(',') .Select((x, i) => new {str = x, idx = i}) .Where(o => o.idx < 5) .Select(t => (double?)Double.Parse(t.str)) .ToList(); obj.AddRange(numbers); objs.Add(obj.ToArray()); // get value domain of all attrs // ignore the id (i = 0) of object for (int i = 1; i < 6; i++) { if(obj[i] != null && !attrDomain[i].Contains((double)obj[i]) ) attrDomain[i].Add((double)obj[i]); } } infSys.Universe = objs.ToArray(); infSys.AttributesDomain = attrDomain .OrderBy(p => p.Key) .Select(p => p.Value.ToArray()) .ToArray(); reader.Close(); printDS(infSys, @"data/inputDS.txt"); // get begin inconsistency rate var apprSpace = new StandardApproximationSpace(infSys, infSys.ConditionAttributes); double rate = apprSpace.InConsistencyRate(); // Process data Chi2Discretizer dis = new Chi2Discretizer(infSys); dis.Process(); // Get resulted DS var processedDS = dis.BuildProcessedDS(); printDS(processedDS, @"data/processedDS.txt"); // get rate after processed var apprSpace2 = new StandardApproximationSpace(processedDS, processedDS.ConditionAttributes); double rate2 = apprSpace2.InConsistencyRate(); Console.WriteLine(rate2); // Print report StreamWriter writer = new StreamWriter(@"data/report.txt", false); writer.WriteLine("Data file: " + filename); writer.WriteLine("- Item Count: " + infSys.Universe.Length); writer.WriteLine("- Original condition attributes: " + string.Join(",", infSys.ConditionAttributes)); writer.WriteLine("- Selected attributes (reduct): " + string.Join(",", dis.SelectedConditionAttrs)); writer.WriteLine("- Original domain count: "); foreach (int attr in infSys.ConditionAttributes) { writer.Write(attr + ": "); writer.WriteLine(infSys.AttributesDomain[attr].Length.ToString()); } writer.WriteLine("- Processed domain count: "); foreach (int attr in processedDS.ConditionAttributes) { writer.Write(attr + ": "); writer.WriteLine(processedDS.AttributesDomain[attr].Length.ToString()); } writer.WriteLine("- Removed attributes: " + string.Join(",", dis.RemovedConditionAttrs)); writer.WriteLine("- Original in-consistency rate: " + rate); writer.WriteLine("- Processed in-consistency rate: " + rate2); if (rate2 > 0) { var inConClasses = apprSpace2.IndiscernibilityClasses() .Where(X => ApproximationSpace.GetAllDecisionClasses(X, processedDS.DecisionAttribute).Count() > 1); writer.WriteLine("- All in-consistent classes:"); int count = 0; foreach(var klass in inConClasses){ count++; writer.WriteLine("\t+ Class: " + count); foreach (var o in klass) { writer.WriteLine("\t\t" + string.Join(",", o)); } } } writer.Close(); }
// check whether new inconsistency rate will exceed the original rate private bool WillNextMergedIntervalIncreaseInConsisRate(int targetAttr, List<double> chi2Values) { int firstIntervalIdx = chi2Values.IndexOf(chi2Values.Min()); double replacedInterval = this.processedAttrDomains[targetAttr][firstIntervalIdx]; double removedInterval = this.processedAttrDomains[targetAttr][firstIntervalIdx + 1]; var newUniverse = this.crnUniverse.Select(x => (double?[])x.Clone()).ToArray(); for (int i = 0; i < newUniverse.Count(); i++) { var newObj = newUniverse[i]; //FIXME: for test if (newObj[0] == 77) Console.WriteLine(); if (newObj[targetAttr] == removedInterval) newObj[targetAttr] = replacedInterval; } var newDS = new DecisionSystem(newUniverse.ToArray(), this.SelectedConditionAttrs, this.DS.DecisionAttribute); var newApprSpace = new StandardApproximationSpace(newDS, this.SelectedConditionAttrs); var newRate = newApprSpace.InConsistencyRate(); return (newRate > this.Delta); }