close

Вход

Забыли?

вход по аккаунту

?

Отчет по СИИ №2

код для вставкиСкачать

МИНОБРНАУКИ РОССИИФедеральное государственное бюджетное образовательное учреждение
высшего профессионального образования "Московский государственный технический университет
радиотехники, электроники и автоматики"
МГТУ МИРЭАФакультет Информационных технологий Базовая кафедра №244 информационных технологий в системах управления при ОАО "НИИАА"
ОТЧЕТ
О выполнении лабораторной работы № 2
Дисциплина: Системы искусственного интеллекта
Студент: Кулаков П.И. Учебная группа: ИТО-2-09
Дата выполнения: 02.11.13
Отметка о защите№
п/пДатаРезультатПодпись преподавателяФ.И.О. преподавателя1.2.
Москва 2013
Оглавление
1. Задание на лабораторную работу3
2. Описание предметной области.3
2.1. Задача линейного классификатора в случае двух классов3
2.2. Обучение однослойного персептрона3
3. Описание программы5
3.1. Входные данные5
3.2. Выходные данные5
3.1.3. Описание классов.5
4. Описание работы программы7
Приложение9
1. Задание на лабораторную работу
1.1. Написать реализацию однослойного персептрона на языке программирования C#. В данной лабораторной работе рассматривается задача обучения однослойного персептрона на примере задачи линейного разделения классов.
2. Описание предметной области.
2.1. Задача линейного классификатора в случае двух классов
Положим .
Линейным классификатором называется алгоритм классификации вида
где - вес -го признака, - порог принятия решения, - вектор весов, - скалярное произведение признакового описания объекта на вектор весов. Предполагается, что искусственно введён "константный" нулевой признак: .
На выходе получаем +1 или -1 в зависимости от входного сигнала. Если сумма всех входов положительная, то на выходе получаем +1, в противном случае -1. 2.2. Обучение однослойного персептрона
Допустим, есть персептрон с 2 входами (координаты) и необходимо отделить входные образы на два класса. В этом случае разделение между классами представляет собой прямую линию, которая задается уравнением:
Положим, что х0=1 и w0=γ, тогда уравнение примет следующий вид:
Метод обучения персептрона представляет собой итерационную процедуру в процессе которой происходит корректировка весов. Где y - выходной сигнал персептрона, d - желаемое выходное значение, γ - параметр обучения.
3. Описание программы
3.1. Входные данные
Координаты точек двух классов, параметр обучения, количество итерация обучения персептрона.
3.2. Выходные данные
Координаты для построения линейной разделяющей поверхности.
3.3. Описание классов
3.1. Класс frmMain: Form
3.1.1. Объекты класса:
- List<Sample> samples - список входных данных персептрона (координаты и идентификатор класса);
- double w1, w2, w0 - векторы весов;
- double alpha = 0.5 - максимальная величина параметра обучения
- double x0 = -1.
- int maxIterations - количество итераций обучения.
Структурная схема классов приведена на рисунке 3.1.
Рисунок 3.1. - Структурная схема классов
3.1.2. Методы класса
3.1.2.1. Метод private void btnLearn_Click(object sender, EventArgs e) - производит обучение персептрона. Вызываемые методы: DrawSeparationLine(); - построение разделяющий линии между объектами двух классов.
3.1.2.2. Метод private void btnClear_Click(object sender, EventArgs e) - осуществляет очистку координатной плоскости.
3.1.2.3. Метод private void DrawSamples() - выполняет отрисовку элементов класса в виде крестиков. 3.1.2.4. Метод private void DrawSeparationLine() - производит отрисовку разделяющий линии между объектами двух классов Вызываемые методы:
DrawSamples();
3.1.2.5. Метод private void pnlCanvas_MouseDown(object sender, MouseEventArgs e) - добавляет элементы двух классов в список. 3.1.2.6. Метод private void trackLearningRate_Scroll(object sender, EventArgs e) - определяет величину параметра обучения.
4. Описание работы программы
Главное окно программы представлено на рисунке 4.1.
Рисунок 4.1. - Главное окно программы
В левой части экрана расположена ось координат для ввода координат двух классов. Параметр обучения γ персептрона задается в диапазоне от 0 до 0,5.
Параметр количество итераций обучения задает число итераций для обучения персептрона.
Для ввода данных необходимо ввести координаты классов путем нажатия правой (координаты первого класса выделяются синим крестиком) или левой (координаты первого класса выделяются красным крестиком) кнопки мыши.
После ввода координат необходимо задать параметр обучения путем перетаскивания ползунка и ввести количество итераций обучения в одноименную форму. В случае, если возникла необходимость задать координаты заново, нужно нажать на кнопку "очистить плоскость". Результат работы программы приведен на рисунке 4.2.
Рисунок 4.2 - Результат работы программы
Приложение
Листинг программы
Programm.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Perceptron
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
}
}
Sample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Perceptron
{
public class Sample
{
double x1;
double x2;
double cls;
public Sample(double x1, double x2, int cls)
{
this.x1 = x1;
this.x2 = x2;
this.cls = cls;
}
public double X1
{
get { return x1; }
set { this.x1 = value; }
}
public double X2
{
get { return x2; }
set { this.x2 = value; }
}
public double Class
{
get { return cls; }
set { this.cls = value; }
}
}
}
FrmMain.cs
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;
namespace Perceptron
{
public partial class frmMain : Form
{
List<Sample> samples = new List<Sample>();
Graphics objGraphics;
Graphics grph;
double w1, w2, w0 = 0;
double alpha = 0.5;
double x0 = -1;
int maxIterations;
public frmMain()
{
InitializeComponent();
}
private void picCanvas_MouseDown(object sender, MouseEventArgs e)
{
}
private void frmMain_Load(object sender, EventArgs e)
{
objGraphics = pnlCanvas.CreateGraphics();
grph = pnlCanvas.CreateGraphics();
}
private void btnLearn_Click(object sender, EventArgs e)
{
int i;
int iterations = 0;
bool error = true;//ошибка (для обозначения конца и начала обучения)
maxIterations = int.Parse(txtIterations.Text);//парсим значение количества итераций
Random rnd = new Random();
w0 = rnd.NextDouble();//присваиваем рандомные начальные веса
w1 = rnd.NextDouble();
w2 = rnd.NextDouble();
alpha = (double)trackLearningRate.Value / 1000;//значение скорости обучения
while (error && iterations < maxIterations)//обучаем перцептрон, пока не достигли максимума количества итераций или не закончили обученние (error=true)
{
error = false;
//Класс Sample содержит значения входные параметров (координат)
for (i = 0; i <= samples.Count - 1; i++)
{
double x1 = samples[i].X1;
double x2 = samples[i].X2;
int y;
if (((w1 * x1) + (w2 * x2) - w0) < 0)//если сумма всех весов не положительная
{
y = -1;//подаем сигнал -1
}
else
{
y = 1;//если сумма положительная, подаем сигнал +1
}
if (y != samples[i].Class)
{
error = true;
w0 = w0 + alpha * (samples[i].Class - y) * x0; // 2; //ak by x0 bolo +1, tak nedelime 2
w1 = w1 + alpha * (samples[i].Class - y) * x1; // 2;
w2 = w2 + alpha * (samples[i].Class - y) * x2; // 2;
}
}
objGraphics.Clear(Color.White);
DrawSeparationLine();
iterations++;//увеличиваем четчик итераций на единицу
}
}
private void picCanvas_MouseMove(object sender, MouseEventArgs e)
{
double posX = (double)(e.X - pnlCanvas.Width / 2) / 10;
double posY = (double)(pnlCanvas.Height / 2 - e.Y) / 10;
this.Text = posX + " " + posY;
}
//Функция очистки экрана private void btnClear_Click(object sender, EventArgs e)
{
samples.Clear();
objGraphics.Clear(Color.White);
objGraphics.DrawLine(new Pen(Color.Gainsboro), new Point(0, pnlCanvas.Height / 2), new Point(pnlCanvas.Width, pnlCanvas.Height / 2));
objGraphics.DrawLine(new Pen(Color.Gainsboro), new Point(pnlCanvas.Width / 2, 0), new Point(pnlCanvas.Width / 2, pnlCanvas.Height));
}
private void DrawSamples()
{
foreach (Sample sample in samples)
{
double posX = (pnlCanvas.Width / 2) + sample.X1 * 10;
double posY = (pnlCanvas.Height / 2) - sample.X2 * 10;
Pen pen;
if (sample.Class == 1)
{
pen = new Pen(Color.Blue);
}
else
{
pen = new Pen(Color.Red);
}
objGraphics.DrawLine(pen, new Point((int)posX - 3, (int)posY), new Point((int)posX + 3, (int)posY));
objGraphics.DrawLine(pen, new Point((int)posX, (int)posY - 3), new Point((int)posX, (int)posY + 3));
}
}
//Функция отрисовки разделительной линии
private void DrawSeparationLine()
{
objGraphics.DrawLine(new Pen(Color.Gainsboro), new Point(0, pnlCanvas.Height / 2), new Point(pnlCanvas.Width, pnlCanvas.Height / 2));
objGraphics.DrawLine(new Pen(Color.Gainsboro), new Point(pnlCanvas.Width / 2, 0), new Point(pnlCanvas.Width / 2, pnlCanvas.Height));
Pen pen = new Pen(Color.DarkGreen);
double x1;
x1 = -10;
double y = -(x1 * w1 / w2) - ((x0*w0) / w2);
double shift = pnlCanvas.Height / 2;
Point p1 = new Point(0, (int)(shift - y * 10));
x1 = 10;
double y2 = -(x1 * w1 / w2) + ((w0) / w2);
Point p2 = new Point(pnlCanvas.Width, (int)(shift - y2 * 10));
if (w2 != 0)
{
objGraphics.DrawLine(pen, p1, p2);
DrawSamples();
}
}
private void trackLearningRate_Scroll(object sender, EventArgs e)
{
lblLearningRate.Text = "Learning Rate: " + (double)trackLearningRate.Value/1000;
}
//Функция отрисовки координат
private void pnlCanvas_MouseDown(object sender, MouseEventArgs e)
{
Sample sample;
Pen pen;
double posX = (double)(e.X - pnlCanvas.Width / 2) / 10;
double posY = (double)(pnlCanvas.Height / 2 - e.Y) / 10;
if (e.Button == MouseButtons.Left)
{
pen = new Pen(Color.Blue);
sample = new Sample(posX, posY, 1);
}
else
{
pen = new Pen(Color.Red);
sample = new Sample(posX, posY, -1);
}
samples.Add(sample);
objGraphics.DrawLine(pen, new Point(e.X - 3, e.Y), new Point(e.X + 3, e.Y));
objGraphics.DrawLine(pen, new Point(e.X, e.Y - 3), new Point(e.X, e.Y + 3));
}
private void pnlCanvas_Paint(object sender, PaintEventArgs e)
{
objGraphics.DrawLine(new Pen(Color.Gainsboro), new Point(0, pnlCanvas.Height / 2), new Point(pnlCanvas.Width, pnlCanvas.Height / 2));
objGraphics.DrawLine(new Pen(Color.Gainsboro), new Point(pnlCanvas.Width / 2, 0), new Point(pnlCanvas.Width / 2, pnlCanvas.Height));
}
private void lblLearningRate_Click(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
}
}
2
Документ
Категория
Рефераты
Просмотров
37
Размер файла
96 Кб
Теги
сии, отчет
1/--страниц
Пожаловаться на содержимое документа