public virtual double ClassifyLearnSamples(KnowlegeBasePCRules Source) //attention only for multicore processor optimized { Requires(Source != null && LearnSamplesSet.DataRows != null); int sum = LearnSamplesSet.DataRows.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism).Count(x => x.StringOutput.Equals(classifyBase(x.InputAttributeValue, Source), StringComparison.OrdinalIgnoreCase)); return((double)sum / (double)LearnSamplesSet.CountSamples * 100.0); }
public string classifyBase(double[] object_c, KnowlegeBasePCRules Source) { Requires(Source != null); Requires(object_c != null); double max_sum = 0; bool correct_classificate = false; string result = ""; var RulesOfClass = Source.RulesDatabase.GroupBy(x => x.LabelOfClass); foreach (var RulesOfOneClass in RulesOfClass) { double sum = 0; foreach (var Rule in RulesOfOneClass) { double mul = Rule.ListTermsInRule.Where(x => AcceptedFeatures[x.NumVar]).Select(y => y.LevelOfMembership(object_c)).Aggregate(1.0, (p, n) => p * n); sum += mul * Rule.CF; } if (max_sum < sum) { correct_classificate = true; max_sum = sum; result = RulesOfOneClass.Key; } } if (!correct_classificate) { return("nonResult"); //throw (new ArgumentException( // "Невозможно классифицировать объект скорее всего существуют не накрытые участи на признаках")); } return(result); }
public virtual double ClassifyTestSamples(KnowlegeBasePCRules Source) { Requires(Source != null && TestSamplesSet.DataRows != null); int sum = TestSamplesSet.DataRows.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism).Count(x => x.StringOutput.Equals(classifyBase(x.InputAttributeValue, Source), StringComparison.OrdinalIgnoreCase)); return((double)sum / (double)TestSamplesSet.CountSamples * 100.0); }
public KnowlegeBasePCRules(KnowlegeBasePCRules source, List <bool> used_rules = null) { for (int i = 0; i < source.TermsSet.Count; i++) { Term temp_term = new Term(source.TermsSet[i]); TermsSet.Add(temp_term); } for (int j = 0; j < source.RulesDatabase.Count; j++) { if ((used_rules == null) || (used_rules[j])) { int [] order = new int[source.RulesDatabase[j].ListTermsInRule.Count]; for (int k = 0; k < source.RulesDatabase[j].ListTermsInRule.Count; k++) { Term temp_term = source.RulesDatabase[j].ListTermsInRule[k]; order[k] = source.TermsSet.FindIndex(x => x == temp_term); } string temp_class_label = source.RulesDatabase[j].LabelOfClass; double temp_cf = source.RulesDatabase[j].CF; PCRule temp_rule = new PCRule(TermsSet, order, temp_class_label, temp_cf); RulesDatabase.Add(temp_rule); } } }