Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Федеральное государственное бюджетное образовательное учреждение



МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«ИЖЕВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Кафедра «Программная инженерия»

 

ОТЧЕТ

по лабораторной работе №2

по дисциплине «Математическое моделирование»

на тему «Классификатор Байеса»

 

 

Выполнил: Васильева А.В.

студент группы М 01-511-1

 

Принял:

доктор физ.-мат. наук, профессор Тененев В.А.

 

Ижевск 2011

1. ПОСТАНОВКА ЗАДАЧИ

1. Написать программу, реализующую классификатор Байеса.

2. Построить график элементов обучающей и тестирующей выборки, посчитать ошибку обучения.

 

2. МАТЕМАТИЧЕСКАЯ ПОСТАНОВКА ЗАДАЧИ

Формула Байеса:

Пусть – полная группа несовместных событий.

, при i j

Тогда апостериорная вероятность имеет вид:

Алгоритм:

1) Разбиение на классы выходной переменной

, K – количество классов выходной переменной.

2) Разбиение на классы входных переменных

3) Предположение о независимости входных признаков:

4) Нахождение априорных вероятностей составляет обучение классификатора

- количество точек с признаком q для выходной переменной и класса h для j-ой переменной.

- количество точек с признаком q для выходной переменной.

Априорные вероятности:

, l – общее количество точек.

После обучения классификатор готов к классификации новых точек, которые не входили в обучающую выборку. Используется принцип максимализма апостериорной вероятности.

Вычисляется:

– апостериорная вероятность.

Класс q, дающий max , соответствует классу точки x.


 

3. РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ

Рис. 3.1. Окно программы

Рис. 3.2. Окно программы после заполнения таблицы значений функции

Рис. 3.3. График распределения значений функции после обучения на обучающей выборке

Рис. 3.4. Нахождение принадлежности к классу по вычисленной вероятности по значениям входного вектора X1…Xn

4. ТЕКСТ ПРОГРАММЫ

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

 

namespace bayes

{

public partial class Form1: Form

{

public Form1()

{

InitializeComponent();

trainGraph = new Graph(panel1.Width, panel1.Height);

testGraph = new Graph(panel2.Width, panel2.Height);

panel1.Controls.Add(trainGraph);

panel2.Controls.Add(testGraph);

}

 

double[,] x;

int[,] discretX;

int n, m, classCountX, classCountY, countTrainRows;

double[] minX, maxX;

double[,,] Pjqh;

double[] Pq;

Graph trainGraph, testGraph;

 

void saveToArray(StreamReader sr)

{



string[] s = sr.ReadLine().Split(' ');

n = int.Parse(s[0]);

m = int.Parse(s[1]);

x = new double[m, n];

for (int i = 0; i < m; i++)

{

s = sr.ReadLine().Split(' ');

for (int j = 0; j < n; j++)

x[i, j] = double.Parse(s[j]);

}

dataGridView1.ColumnCount = n;

dataGridView1.RowCount = m;

for (int i = 0; i < m; i++)

{

for (int j = 0; j < n; j++)

{

dataGridView1[j, i].Value = x[i, j];

dataGridView1.Columns[j].Width = 50;

}

}

dataGridView3.ColumnCount = n - 1;

dataGridView3.RowCount = 1;

dataGridView4.ColumnCount = n;

dataGridView4.RowCount = 2;

}

 

int getClass(double x, int col)

{

if (col == 0)

return Math.Min((int)Math.Truncate((x - minX[col]) * classCountY / (maxX[col] - minX[col])), classCountY - 1);

return Math.Min((int)Math.Truncate((x - minX[col]) * classCountX / (maxX[col] - minX[col])), classCountX - 1);

}

 

void discretization()

{

classCountX = int.Parse(textBox1.Text);

classCountY = int.Parse(textBox2.Text);

minX = new double[n];

maxX = new double[n];

discretX = new int[m, n];

for (int i = 0; i < m; i++)

{

for (int j = 0; j < n; j++)

{

if (i == 0)

{

minX[j] = x[i, j];

maxX[j] = x[i, j];

}

else

{

minX[j] = Math.Min(minX[j], x[i, j]);

maxX[j] = Math.Max(maxX[j], x[i, j]);

}

}

}

dataGridView2.RowCount = m;

dataGridView2.ColumnCount = n;

for (int i = 0; i < m; i++)

{

for (int j = 0; j < n; j++)

{

discretX[i, j] = getClass(x[i, j], j);

dataGridView2[j, i].Value = discretX[i, j];

dataGridView2.Columns[j].Width = 50;

}

}

}

 

void Train()

{

countTrainRows = (int)Math.Round(m * double.Parse(textBox3.Text) / 100.0);

int[,,] Njqh = new int[n, classCountY, classCountX];

int[] Nq = new int[classCountY];

Pq = new double[classCountY];

Pjqh = new double[n, classCountY, classCountX];

for (int i = 1; i < n; i++)

{

for (int j = 0; j < countTrainRows; j++)

Njqh[(i - 1), discretX[j, 0], discretX[j, i]]++;

}

for (int i = 0; i < countTrainRows; i++)

Nq[discretX[i, 0]]++;

for (int i = 0; i < classCountY; i++)

Pq[i] = (double)Nq[i] / countTrainRows;

for (int i = 0; i < n; i++)

{

for (int j = 0; j < classCountY; j++)

{

for (int k = 0; k < classCountX; k++)

Pjqh[i, j, k] = (Nq[j] > 0)? (double)Njqh[i, j, k] / Nq[j]: 0;

}

}

}

 

public int GetClassCl(int[] X)

{

double[] PqX = new double[classCountY], PXq = new double[classCountY];

int maxClass = 0;

double denominator = 0;

for (int i = 0; i < classCountY; i++)

{

PXq[i] = 1;

for (int j = 0; j < n - 1; j++)

PXq[i] *= Pjqh[j, i, X[j]];

denominator += Pq[i] * PXq[i];

}

maxClass = 0;

for (int i = 0; i < classCountY; i++)

{

PqX[i] = Pq[i] * PXq[i] / denominator;

if (PqX[i] > PqX[maxClass])

maxClass = i;

}

return maxClass;

}

void TestResult()

{

int[,] learnY = new int[countTrainRows, 2], testY = new int[m - countTrainRows, 2];

int[] X = new int[n - 1];

for (int i = 0; i < countTrainRows; i++)

{

learnY[i, 0] = discretX[i, 0];

for (int j = 1; j < n; j++)

X[j - 1] = discretX[i, j];

learnY[i, 1] = GetClassCl(X);

}

for (int i = 0; i < m - countTrainRows; i++)

{

testY[i, 0] = discretX[i + countTrainRows, 0];

for (int j = 1; j < n; j++)

X[j - 1] = discretX[i + countTrainRows, j];

testY[i, 1] = GetClassCl(X);

}

trainGraph.SetParams(classCountY, countTrainRows, learnY);

testGraph.SetParams(classCountY, m - countTrainRows, testY);

label5.Text = "Количество ошибок: " + Math.Round((double)trainGraph.errors / countTrainRows * 100.0) + "%";

label6.Text = "Количество ошибок: " + Math.Round((double)testGraph.errors / (m - countTrainRows) * 100.0) + "%";

}

 

private void button1_Click(object sender, EventArgs e)

{

if ((openFileDialog1.ShowDialog() == DialogResult.OK) && (openFileDialog1.FileName!= ""))

{

StreamReader sr = new StreamReader(openFileDialog1.FileName);

saveToArray(sr);

discretization();

button1.Enabled = true;

label3.Text = "Классификатор не обучен";

label3.Image = Properties.Resources.bullet_red;

}

}

private void button2_Click(object sender, EventArgs e)

{

discretization();

Train();

TestResult();

label3.Text = "Классификатор обучен";

label3.Image = Properties.Resources.bullet_green;

}

private void button3_Click(object sender, EventArgs e)

{

dataGridView4[0, 0].Value = "Y";

for (int i = 1; i < n; i++)

{

dataGridView4[i, 0].Value = "X" + i;

dataGridView4.Columns[0].Width = 50;

}

int[] x = new int[n - 1];

for (int i = 0; i < n - 1; i++)

{

x[i] = getClass(double.Parse(dataGridView3[i, 0].Value.ToString()), i + 1);

dataGridView4[i + 1, 1].Value = x[i];

dataGridView4.Columns[i + 1].Width = 50;

}

dataGridView4[0, 1].Value = GetClassCl(x);

dataGridView4.Columns[0].Width = 50;

}

}

public partial class Graph: UserControl

{

private int countClass = 0, countPoints = 0;

private int[,] coords, points;

public int errors;

 

public Graph(int Width, int Height)

{

this.Width = Width;

this.Height = Height;

}

 

public void SetParams(int _countClass, int _countPoints, int[,] x)

{

countClass = _countClass;

countPoints = _countPoints;

coords = new int[countClass, 2];

errors = 0;

for (int i = 0; i < countClass; i++)

{

coords[i, 0] = ((this.Width - 60) / (countClass - 1)) * i + 20;

coords[i, 1] = ((this.Height - 60) / (countClass - 1)) * (countClass - i - 1) + 20;

}

Random rand = new Random();

points = new int[countPoints, 2];

for (int i = 0; i < countPoints; i++)

{

points[i, 0] = ((this.Width - 60) / (countClass - 1)) * x[i, 0] + 20 + rand.Next(-10, 11);

points[i, 1] = (this.Height - 40) - (((this.Height - 60) / (countClass - 1)) * x[i, 1] + rand.Next(-10, 11));

if (x[i, 0]!= x[i, 1])

errors++;

}

this.Invalidate();

this.Update();

}

protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

using (Graphics g = e.Graphics)

{

g.DrawLine(Pens.Black, 20, 20, 20, this.Height - 40);

g.DrawLine(Pens.Black, 20, this.Height - 40, this.Width - 40, this.Height - 40);

for (int i = 1; i < countClass; i++)

{

g.DrawLine(Pens.Black, coords[i, 0], this.Height - 44, coords[i, 0], this.Height - 36);

g.DrawLine(Pens.Black, 16, coords[i, 1], 24, coords[i, 1]);

}

for (int i = 0; i < countPoints; i++)

g.FillEllipse(Brushes.DarkRed, points[i, 0], points[i, 1], 3, 3);

}

}

}

}

5. АНАЛИЗ РЕЗУЛЬТАТОВ И ВЫВОД

Далее приведена таблица результатов, в которой представлен процент ошибок, который допустил обученный классификатор на тестовой выборке значений при различных значениях параметров: количество классов значений переменных X, количество классов значений функции Y и процент выборки, на которой классификатор обучался.

Кол. X

Кол. Y

% обуч.выб.

% ошибок

       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       

 

Из таблицы видно, что процент ошибок меньше тогда, когда количество выходной переменной (Y) меньше количества классов входных переменных (X). Минимальная ошибка была получена при классификации входных переменных на 7 классов, 3 классов выходной переменной и проценте обучающей выборки 50%. При отклонении от этих значений как вправо, так и влево, процент ошибок увеличивается.


Дата добавления: 2015-11-04; просмотров: 17 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
~PE_OpenFile('F:\Леготкина.pex') 11 страница | Invert selection - виділення усіх об’єктів директорії

mybiblioteka.su - 2015-2024 год. (0.03 сек.)