static void Main(string[] args) { List <PointXD> data = Read("test.txt"); PointXD test = new PointXD(null, 6.3, 2.7, 5.5, 2.1); // пример из методички //List<PointXD> data = Read("test2.txt"); //PointXD test = new PointXD(null, "<=30", "средний", "да", "хороший"); string winnerClass = BayesClassifier(data, test); Console.WriteLine("Found class: " + winnerClass); }
private static string BayesClassifier(List <PointXD> data, PointXD test) { int n; Dictionary <string, int> classes = new Dictionary <string, int>(); // названия всех классов и количество объектов в каждом классе for (int i = 0; i < data.Count; i++) { if (!classes.Keys.Contains(data[i].Class)) { classes.Add(data[i].Class, 1); } else { classes[data[i].Class]++; } } List <PointXD> probabilities = new List <PointXD>(); // вероятности атрибутов для каждого класса (по тесту) List <object> probs; for (int i = 0; i < classes.Count; i++) { probs = new List <object>(); for (int j = 0; j < test.Count; j++) { n = 0; string testData = test.Attributes[j].ToString().Replace(',', '.'); for (int z = 0; z < data.Count; z++) { if (data[z].Attributes[j].Equals(testData) && data[z].Class == classes.Keys.ToList()[i].ToString()) { n++; } } probs.Add(n / (double)classes.Values.ToList()[i]); } probabilities.Add(new PointXD(classes.Keys.ToList()[i].ToString(), probs.ToArray())); } List <double> probabilities2 = new List <double>(); // вероятности теста для каждого класса for (int i = 0; i < classes.Count; i++) { double multiplication = 1; for (int j = 0; j < probabilities[i].Count; j++) { multiplication *= Convert.ToDouble(probabilities[i].Attributes[j]); } probabilities2.Add(multiplication * classes.Values.ToList()[i] / data.Count); // вероятности теста для каждого класса, умноженные на вероятность класса } int index = probabilities2.IndexOf(probabilities2.Max()); return(classes.Keys.ToList()[index]); }