public void FindClassificationErrorFullPossibility() { double step = 0.00001; Class1ErrorAssignmentChance = 0; Class1ErrorNotAssignedChance = 0; DoubleRange range1 = NormalDistributionClass1.GetRange(0.99); DoubleRange range2 = NormalDistributionClass2.GetRange(0.99); double begin = range2.Min; double end = FindDistributionEqualityPoint(); double f1(double x) => Chance2 / Math.Sqrt(Variance2 * 2 * Math.PI) * Math.Exp(Math.Pow((x - Mean2), 2) / (-2 * Variance2)); Class1ErrorAssignmentChance = DoubleExponentialTransformation.Integrate(f1, begin, end, 1e-5); begin = end; end = range1.Max; double f2(double x) => Chance1 / Math.Sqrt(Variance1 * 2 * Math.PI) * Math.Exp(Math.Pow((x - Mean1), 2) / (-2 * Variance1)); Class1ErrorNotAssignedChance = DoubleExponentialTransformation.Integrate(f2, begin, end, 1e-5); //double x = Math.Min(range1.Min, range2.Min); //double max = Math.Max(range2.Max, range1.Max); //bool equalityPointPassed = false; //while (x < max) //{ // double dens1 = NormalDistributionClass1.ProbabilityDensityFunction(x); // double dens2 = NormalDistributionClass2.ProbabilityDensityFunction(x); // if (!equalityPointPassed) // Class1ErrorAssignmentChance += dens2 * chance2; // else // Class1ErrorNotAssignedChance += dens1 * chance1; // if (Math.Abs(dens1 - dens2) < 0.00003) // equalityPointPassed = true; // x += step; //} }
public double FindDistributionEqualityPoint(double step = 0.0001, double accuracy = 0.0001) { DoubleRange range1 = NormalDistributionClass1.GetRange(0.99); DoubleRange range2 = NormalDistributionClass2.GetRange(0.99); double x = Math.Min(range1.Min, range2.Min); double max = Math.Max(range2.Max, range1.Max); while (x < max) { double dens1 = NormalDistributionClass1.ProbabilityDensityFunction(x) * Chance1; double dens2 = NormalDistributionClass2.ProbabilityDensityFunction(x) * Chance2; if (Math.Abs(dens1 - dens2) < accuracy) { return(x); } x += step; } throw new InvalidOperationException(); }