close

Вход

Забыли?

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

?

ITPZ otchetmoy (2)

код для вставкиСкачать
Федеральное агентство образования РФ
ФГБОУ ВПО "Ижевский государственный технический университет"
Кафедра " Мехатронные системы"
Курсовая работа
Дисциплина: "Интеллектуальные технологии и представление знаний"
Вариант №В2В
Выполнил: студент гр. 7-05-3
Красноперов М.В.
Проверил: Лекомцев П.В.
Ижевск 2011
СОДЕРЖАНИЕ
ТЕХНИЧЕСКОЕ ЗАДАНИЕ3
ВВЕДЕНИЕ4
1 РАЗРАБОТКА МАТЕМАТИЧЕСКОГО АЛГОРИТМАОшибка! Закладка не определена.
2 РАЗРАБОТКА СХЕМЫ АЛГОРИТМА8
3 РАЗРАБОТКА ПРОГРАММЫ10
4 ВЫЧИСЛИТЕЛЬНЫЙ ЭКСПЕРИМЕНТ11
ЗАКЛЮЧЕНИЕ12
ЛИТЕРАТУРА12
ПРИЛОЖЕНИЕ А13
ПРИЛОЖЕНИЕ Б20
ПРИЛОЖЕНИЕ В21
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
Разработать алгоритм и программу на языке высокого уровня в соответствии с вариантом.
В2В - прогнозирование атмосферного давления, метод обучения - обратное распространение ошибки. ВВЕДЕНИЕ
Нейронные сети вошли в практику везде, где нужно решать задачи прогнозирования, классификации или управления. Такой впечатляющий успех определяется несколькими причинами:
* Богатые возможности. Нейронные сети - исключительно мощный метод моделирования, позволяющий воспроизводить чрезвычайно сложные зависимости. В частности, нейронные сети нелинейны по свой природе. На протяжение многих лет линейное моделирование было основным методом моделирования в большинстве областей, поскольку для него хорошо разработаны процедуры оптимизации. В задачах, где линейная аппроксимация неудовлетворительна (а таких достаточно много), линейные модели работают плохо. Кроме того, нейронные сети справляются с "проклятием размерности", которое не позволяет моделировать линейные зависимости в случае большого числа переменных
* Простота в использовании. Нейронные сети учатся на примерах. Пользователь нейронной сети подбирает представительные данные, а затем запускает алгоритм обучения, который автоматически воспринимает структуру данных. При этом от пользователя, конечно, требуется какой-то набор эвристических знаний о том, как следует отбирать и подготавливать данные, выбирать нужную архитектуру сети и интерпретировать результаты, однако уровень знаний, необходимый для успешного применения нейронных сетей, гораздо скромнее, чем, например, при использовании традиционных методов статистики.
Нейронные сети привлекательны с интуитивной точки зрения, ибо они основаны на примитивной биологической модели нервных систем. В будущем развитие таких нейро-биологических моделей может привести к созданию действительно мыслящих компьютеров. 1. РАЗРАБОТКА МАТЕМАТИЧЕСКОГО АЛГОРИТМА
Среди различных структур нейронных сетей (НС) одной из наиболее известных является многослойная структура, в которой каждый нейрон произвольного слоя связан со всеми аксонами нейронов предыдущего слоя или, в случае первого слоя, со всеми входами НС. Такие НС называются полносвязными. В многослойных же сетях оптимальные выходные значения нейронов всех слоев, кроме последнего, как правило, не известны, и двух или более слойный перцептрон уже невозможно обучить, руководствуясь только величинами ошибок на выходах НС. Один из вариантов решения этой проблемы -распространение сигналов ошибки от выходов НС к ее входам, в направлении, обратном прямому распространению сигналов в обычном режиме работы. Этот алгоритм обучения НС получил название процедуры обратного распространения. Согласно методу наименьших квадратов, минимизируемой целевой функцией ошибки НС является величина:
(1)
где - реальное выходное состояние нейрона j выходного слоя N нейронной сети при подаче на ее входы p-го образа; djp - идеальное (желаемое) выходное состояние этого нейрона.
Суммирование ведется по всем нейронам выходного слоя и по всем обрабатываемым сетью образам. Минимизация ведется методом градиентного спуска, что означает подстройку весовых коэффициентов следующим образом:
(2)
Здесь wij - весовой коэффициент синаптической связи, соединяющей i-ый нейрон слоя n-1 с j-ым нейроном слоя n,  - коэффициент скорости обучения, 0<<1.
Как показано в [2],
(3)
Здесь под yj, как и раньше, подразумевается выход нейрона j, а под sj - взвешенная сумма его входных сигналов, то есть аргумент активационной функции. Так как множитель dyj/dsj является производной этой функции по ее аргументу, из этого следует, что производная активационной функция должна быть определена на всей оси абсцисс. В случае сигмоиды
(4)
Третий множитель sj/wij, очевидно, равен выходу нейрона предыдущего слоя yi(n-1).
Что касается первого множителя в (3), он легко раскладывается следующим образом:
(5)
Здесь суммирование по k выполняется среди нейронов слоя n+1.
Введя новую переменную
(6)
мы получим рекурсивную формулу для расчетов величин j(n) слоя n из величин k(n+1) более старшего слоя n+1.
(7)
Для выходного же слоя
(8)
Теперь мы можем записать (2) в раскрытом виде:
(9)
Иногда для придания процессу коррекции весов некоторой инерционности, сглаживающей резкие скачки при перемещении по поверхности целевой функции, (9) дополняется значением изменения веса на предыдущей итерации
(10)
где  - коэффициент инерционности, t - номер текущей итерации.
Таким образом, полный алгоритм обучения НС с помощью процедуры обратного распространения строится так:
1. Подать на входы сети один из возможных образов и в режиме обычного функционирования НС, когда сигналы распространяются от входов к выходам, рассчитать значения последних. Напомним, что
(11)
где M - число нейронов в слое n-1 с учетом нейрона с постоянным выходным состоянием +1, задающего смещение; yi(n-1)=xij(n) - i-ый вход нейрона j слоя n.
yj(n) = f(sj(n)), где f() - сигмоид (12)
yq(0)=Iq,(13)
где Iq - q-ая компонента вектора входного образа.
2. Рассчитать (N) для выходного слоя по формуле (8).
Рассчитать по формуле (9) или (10) изменения весов w(N) слоя N.
3. Рассчитать по формулам (7) и (9) (или (7) и (10)) соответственно (n) и w(n) для всех остальных слоев, n=N-1,...1.
4. Скорректировать все веса в НС
(14)
5. Если ошибка сети существенна, перейти на шаг 1. В противном случае - конец.
Из выражения (9) следует, что когда выходное значение yi(n-1) стремится к нулю, эффективность обучения заметно снижается. 2. РАЗРАБОТКА СХЕМЫ АЛГОРИТМА
Схема алгоритма программы прогнозирования атмосферного давления методом обратного распространения ошибки представлена на рисунке 1.
Рисунок 1 - Схема алгоритма программы прогнозирования атмосферного давления.
На рисунке 2 представлена схема алгоритма обучения ИНС
Рисунок 2 - Схема алгоритма обучения ИНС
На рисунке 3 представлена схема алгоритма прогнозирования давления ИНС
Рисунок 3 - Схема алгоритма прогнозирования давления ИНС
3. РАЗРАБОТКА ПРОГРАММЫ
Данная программа написана на языке программирования С#. C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет строгую статическую типизацию, поддерживает полиморфизм, перегрузку операторов, указатели на функции-члены классов, атрибуты, события, свойства, исключения, комментарии в формате XML. Переняв многое от своих предшественников - языков C++, Delphi, Modula и Smalltalk - С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем: так, C# не поддерживает множественное наследование классов (в отличие от C++). Текст программы построения представлен в приложении А.
4. ВЫЧИСЛИТЕЛЬНЫЙ ЭКСПЕРИМЕНТ
1. Загружаются обучающие данные. Каждая строка в документе - одна обучающая выборка. Значения в первой выборке - данные давления в 2002 году с 5.01-11.01. Последующие выборки с теми же датами, но каждая следующая на год больше.
2. Вводится количество нейронов в слоях (через пробел), количество чисел в поле равно количеству слоев в сети.
3. Обучаем сеть.
4. Загружаются данные для непосредственного прогнозирования. Данные давления за 2012 год с 05.01-10.01.
5. Получение прогноза на 11.01.2012.
Результаты работы программы изображены на рисунках 3,4.
Рисунок 3 -Тестирование программы. Загрузка данных обуч. и создание сети.
Рисунок 4- тестирование программы. Обучение, загрузка экзаменационной выборки, получение прогноза.
Значение прогноза (выхода сети) получилось равное 0,944. Это близко к 1, следовательно, скорее всего давление 11.01.2012 повысится, относительно 10.01.2012. В случае, когда прогноз получается близкий к 0, давление, скорее всего, понизится.
ЗАКЛЮЧЕНИЕ
В ходе выполнения данного курсового проекта была разработана алгоритм и программа прогнозирования атмосферного давления, по данным статистики, на 11.01.2012, методом обратного распространения ошибки. Программа работает исправно, работа программы подтверждена вычислительным экспериментом.
ЛИТЕРАТУРА
1. С.Короткий "Нейронные сети: алгоритм обратного распространения"
2. "Нейронная сеть - обучение ИНС с помощью алгоритма обратного распространения" http://robocraft.ru/blog/algorithm/560.html
ПРИЛОЖЕНИЕ А
ТЕКСТ ПРОГРАММЫ
Текст программы прогнозирования атмосферного давления приведен на рисунке А1.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace NeuralNetPropagation
{public partial class Form2 : Form
{
// глобальная константа для заголовков окна и сообщений
public static string FormCaption = "Прогнозирование атм. давления методом обратного распространения ошибки";
// экземпляр класса, выполняющего чтение данных в файл
private ExcelDataEngine excelDataEngine;
private TextDataEngine textDataEngine;
// Переменные для хранения числа обучающих выборок, чисел нейронов в слоях, числа данных для экз. выборки
private int nLearnCount, nDataCount, nExamDataCount;
private int[] nNeuroCount;
// массив загрузки обучающих данных
private short[,] pressureArray;
// массив загрузки экзам. данных
private short[] pressureExamArray;
// Переменная для хранения скорости обучения
private double dLearnSpeed;
// Счетчик текущей итерации обучения
private int learns=0;
// была ли создана сеть для сохранения
bool canSave = false;
// Объект нейросети
private NeuralNet NN;
public Form2()
{
InitializeComponent();
this.Text = FormCaption;
// Создание экземпляров классов работы с данными внешних файлов
excelDataEngine = new ExcelDataEngine();
textDataEngine = new TextDataEngine();
// Задание параметров окна выбоа чтения/сохранения параметров сети
openFileNetDialog.Filter = saveFileNetDialog.Filter = "Файлы хранения состояния сети (*.net)|*.net";
openFileNetDialog.DefaultExt = saveFileNetDialog.DefaultExt = "net";
Рисунок А1 - Текст программы
// Если в системе доступен MS Excel, сделать возможность выбора файлов .xls
if (excelDataEngine.bExcelAvailable)
{
openFileDialog.Filter = "Текстовые файлы (разделители - точка с запятой)(*.txt)|*.txt|" +
"Файлы MS Excel(*.xls)|*.xls";
}
// иначе только текстовые файлы с разделителями .csv
else
{
openFileDialog.Filter = "Текстовые файлы (разделители - точка с запятой)(*.txt)|*.txt";
}
// По умолчанию - csv
openFileDialog.DefaultExt = "txt";
}
// Кнопка выбора файла данных для обучения
private void srcFileDlgBtn_MouseClick(object sender, MouseEventArgs e)
{
DialogResult res = openFileDialog.ShowDialog();
if (res == DialogResult.OK)
{
// Если указано имя файла то подразумеваем новые данные
// и очищаем поля на форме
learnCount.Text = dataLineCount.Text = "";
dataCount.Text = "";
logBox.Clear();
currentIteration.Text = "";
// получаем имя файла из диалога выбора имени файла
srcFilePath.Text = openFileDialog.FileName;
}
}
// Кнопка Загрузить данные
private void btnDataLoad_MouseClick(object sender, MouseEventArgs e)
{
// проверка на указание имени исходного файла
if (srcFilePath.Text == "")
{
MessageBox.Show("Не указан файл с исходными данными!", FormCaption);
return;
}
try
{
// попытка прочитать введенные размеры массива обучающих данных
if (dataLineCount.Text == "")
nLearnCount = 0;
else
nLearnCount = int.Parse(dataLineCount.Text);
if (dataCount.Text == "")
nDataCount = 0;
else
nDataCount = int.Parse(dataCount.Text);
}
catch (System.FormatException)
{
MessageBox.Show("Неверно указаны параметры загрузки данных", FormCaption);
Рисунок А1 - Продолжение
return;
}
this.Cursor = Cursors.WaitCursor;
// выбор, из какого типа файлов грузятся данные
if (srcFilePath.Text.ToUpper().EndsWith("XLS"))
{
// передаем имя файла с данными в объект работы с данными
excelDataEngine.srcFileName = srcFilePath.Text;
// передаем параметры загрузки данных
excelDataEngine.nDataLineCount = nLearnCount;
excelDataEngine.nDataCount = nDataCount;
// делаем попытку загрузить данные
if (!excelDataEngine.LoadData())
{
this.Cursor = Cursors.Default;
return;
}
// получаем количество обучающих выборок, количество данных в выборке, данные выборок
nLearnCount = excelDataEngine.nDataLineCount;
nDataCount = excelDataEngine.nDataCount;
pressureArray = excelDataEngine.pressureArray;
}
else
{
// передаем имя файла с данными в объект работы с данными
textDataEngine.srcFileName = srcFilePath.Text;
// передаем параметры загрузки данных
textDataEngine.nDataLineCount = nLearnCount;
textDataEngine.nDataCount = nDataCount;
// делаем попытку загрузить данные
if (!textDataEngine.LoadData())
{
this.Cursor = Cursors.Default;
return;
}
// получаем количество обучающих выборок, количество данных в выборке, данные выборок
nLearnCount = textDataEngine.nDataLineCount;
nDataCount = textDataEngine.nDataCount;
pressureArray = textDataEngine.pressureArray;
}
this.Cursor = Cursors.Default;
// отображаем на форме число загруженных выборок и количество данных в выборках
learnCount.Text = dataLineCount.Text = nLearnCount.ToString();
dataCount.Text = nDataCount.ToString();
MessageBox.Show("Данные загружены", FormCaption);
}
Рисунок А1 - Продолжение
// Кнопка Создать сеть
private void button5_MouseClick(object sender, MouseEventArgs e)
{
logBox.Clear();
currentIteration.Text = "";
learns = 0;
try
{
// для создания сети должен быть хотя бы один вход и один выход
if ( nDataCount < 2 )
{
MessageBox.Show("Недостаточно входных данных для создания сети", FormCaption);
return;
}
// попытка прочитать число слоев и нейронов в них string[] strValues = neuroCount.Text.Split(' ');
nNeuroCount = new int[strValues.Length];
for (int i = 0; i < strValues.Length; i++)
{
nNeuroCount[i] = int.Parse(strValues[i]);
if (nNeuroCount[i] == 0)
throw new System.FormatException();
}
// Создать сеть с sizeX входами и двумя слоями
int sizeX = nDataCount-1;
NN = new NeuralNet(sizeX, nNeuroCount);
}
catch (System.FormatException)
{
MessageBox.Show("Неверно указаны параметры создания сети", FormCaption);
return;
}string strNNCreated = "Создана сеть:" + Environment.NewLine+"Количество входов - " + NN.GetX.ToString() + Environment.NewLine+"Количество слоев - "+NeuroCount.Length.ToString() + Environment.NewLine +"Количество нейронов в слоях - " + neuroCount.Text + Environment.NewLine +"Количество выходов - " + NN.GetY.ToString();
MessageBox.Show(strNNCreated, FormCaption);
// установить флаг возможности сохранения данных сети
canSave = true;
}
// Кнопка Обучить сеть
private void button1_MouseClick(object sender, MouseEventArgs e)
{
try
{
// попытка прочитать коэффициент скорости обучения
dLearnSpeed = Double.Parse(learnSpeed.Text);
if (dLearnSpeed == 0)
throw new System.FormatException();
}
catch (System.FormatException)
{
MessageBox.Show("Неверно указаны параметры обучения сети", FormCaption);
return;
Рисунок А1 - Продолжение
}
this.Cursor = Cursors.WaitCursor;
if (learns == nLearnCount)
learns = 0;
// очищаем поле протокола обучения
if (learns == 0)
{
logBox.Clear();
currentIteration.Text = "";
}
// цикл по количеству обучающих выборок
for (; learns < nLearnCount;)
{
// счетчик итераций на форме
currentIteration.Text = (learns+1).ToString();
currentIteration.Update();
// определяем вектора входов и выходов нейросети
double[] X = new double[NN.GetX];
double[] Y = new double[NN.GetY];
// счетчик данных в загруженном массиве
int arrayIndex = 0;
// предыдущее значение для вычисления приращения
short prevValue = 0;
// считываем из загруженного массива элементы входного вектора
for (int i=0; i < X.Length; i++)
{
// если текущее значение в массиве больше предыдущего (давление растет),
// то вход сети получает значение 1, иначе 0
if (pressureArray[learns, arrayIndex] > prevValue)
X[i] = 1;
else
X[i] = 0;
// если текущее значение в массиве больше предыдущего (давление растет),
// то вход сети получает значение 1, если равно, то 0, если меньше, то -1
/*if (pressureArray[learns, arrayIndex] > prevValue)
X[i] = 1;
else
{
if (pressureArray[learns, arrayIndex] == prevValue)
X[i] = 0;
else
X[i] = -1;
}*/
// значение текущего элемента массива на следующей итерации будет предыдущим
prevValue = pressureArray[learns, arrayIndex];
arrayIndex++;
}
// после считывания данных для входов определяем значение для выхода сети
if (pressureArray[learns, arrayIndex] > prevValue)
Y[0] = 1;
else
Y[0] = 0;
Рисунок А1 - Продолжение
// запуск поцедуры обучения сети на данной итерации
// на выходе outErr - получаем значение ошибки для обучающей пары
double outErr = Math.Round(NN.LearnNet(X, Y, dLearnSpeed),5);
// добавляем строку в поле протокола
logBox.AppendText(outErr.ToString()+ Environment.NewLine );
learns++;
if ( stopIteration.Checked == true )
break;
}
this.Cursor = Cursors.Default;
}
// Кнопка выбора файла данных для прогноза
private void button4_MouseClick(object sender, MouseEventArgs e)
{
DialogResult res = openFileDialog.ShowDialog();
if (res == DialogResult.OK)
{
srcExamFilePath.Text = openFileDialog.FileName;
}
}
// Кнопка Загрузить данные для прогноза
private void button3_MouseClick(object sender, MouseEventArgs e)
{
// проверка на указание имени исходного файла
if (srcExamFilePath.Text == "")
{
MessageBox.Show("Не указан файл с данными", FormCaption);
return;
}
try
{
if (examNetX.Text == "")
nExamDataCount = 0;
else
nExamDataCount = int.Parse(examNetX.Text);
}
catch (System.FormatException)
{
MessageBox.Show("Неверно указаны параметры загрузки данных", FormCaption);
return;
}
this.Cursor = Cursors.WaitCursor;
// выбор, из какого типа файлов грузятся данные
if (srcExamFilePath.Text.ToUpper().EndsWith("XLS"))
{
// передаем имя файла с данными в объект работы с данными
excelDataEngine.srcFileName = srcExamFilePath.Text;
// передаем параметры загрузки данных
excelDataEngine.nDataCount = nExamDataCount;
// делаем попытку загрузить данные
if (!excelDataEngine.LoadPropagationData())
Рисунок А1 - Продолжение
{
this.Cursor = Cursors.Default;
return;
}
// получаем количество загруженных данных и массив с данными
nExamDataCount = excelDataEngine.nDataCount;
pressureExamArray = excelDataEngine.pressureExamArray;
}
else
{
// передаем имя файла с данными в объект работы с данными
textDataEngine.srcFileName = srcExamFilePath.Text;
// передаем параметры загрузки данных
textDataEngine.nDataCount = nExamDataCount;
// делаем попытку загрузить данные
if (!textDataEngine.LoadPropagationData())
{
this.Cursor = Cursors.Default;
return;
}
// получаем количество загруженных данных и массив с данными
nExamDataCount = textDataEngine.nDataCount;
pressureExamArray = textDataEngine.pressureExamArray;
}
this.Cursor = Cursors.Default;
// отображаем на форме число загруженных данных
examNetX.Text = nExamDataCount.ToString();
MessageBox.Show("Данные загружены", FormCaption);
}
// отображение окна справки
private void Form2_HelpButtonClicked(object sender, CancelEventArgs e)
{
new HelpForm().ShowDialog();
e.Cancel = true;
}
// кнопка Загрузить параметры сети
private void btnLoadNet_MouseClick(object sender, MouseEventArgs e)
{
string netDataOpenFile;
DialogResult res = openFileNetDialog.ShowDialog();
if (res == DialogResult.OK)
{
// Получить имя файла с данными
netDataOpenFile = openFileNetDialog.FileName;
}
else
return;
this.Cursor = Cursors.WaitCursor;
Рисунок А1 - Продолжение
// открыть поток чтения файла, получить данные сети
Stream stream;
stream = File.Open(netDataOpenFile, FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
// создать сеть из загруженных данных
NN = (NeuralNet)formatter.Deserialize(stream);
stream.Close();
// отобразить параметры загруженной сети
neuroCount.Text = "";
for (int i = 0; i < NN.CountLayers; i++)
{
if (i > 0)
neuroCount.AppendText(" ");
neuroCount.AppendText(NN.Layers[i].countY.ToString());
}
this.Cursor = Cursors.Default;
MessageBox.Show("Чтение завершено");
// Показать состояние загруженной сети
ShowNetStatus();
}
// кнопка Сохранить параметры сети
private void btnSaveNet_MouseClick(object sender, MouseEventArgs e)
{
string netDataSaveFile;
// проверить возможность сохранения данных
if (!canSave)
{
MessageBox.Show("Сеть не была создана, невозможно сохранить", FormCaption);
return;
}
// Показать состояние сохраняемой сети
ShowNetStatus();
this.Cursor = Cursors.WaitCursor;
DialogResult res = saveFileNetDialog.ShowDialog();
if (res == DialogResult.OK)
{
// Получить имя файла для сохранения данных
netDataSaveFile = saveFileNetDialog.FileName;
}
else
return;
// открыть поток файла сохранения данных
Stream stream = File.Open(netDataSaveFile, FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
// выгрузить сеть
formatter.Serialize(stream, NN);
stream.Close();
this.Cursor = Cursors.Default;
MessageBox.Show("Запись завершена");
Рисунок А1 - Продолжение
}
// Получение прогноза
private void button2_MouseClick(object sender, MouseEventArgs e)
{
this.Cursor = Cursors.WaitCursor;
examNetY.Text="";
// вектор входов с экзаменационными данными
double[] X = new double[nExamDataCount];
// вектор, который будет получать данные из сети
double[] Y;
short prevValue = 0;
// считываем из загруженного массива элементы входного вектора
for (int i = 0; i < nExamDataCount; i++)
{
// если текущее значение в массиве больше предыдущего (давление растет),
// то вход сети получает значение 1, иначе 0
if (pressureExamArray[i] > prevValue)
X[i] = 1;
else
X[i] = 0;
// если текущее значение в массиве больше предыдущего (давление растет),
// то вход сети получает значение 1, если равно, то 0, если меньше, то -1
/*if (pressureExamArray[i] > prevValue)
X[i] = 1;
else
{
if (pressureExamArray[i] == prevValue)
X[i] = 0;
else
X[i] = -1;
}*/
// значение текущего элемента массива на следующей итерации будет предыдущим
prevValue = pressureExamArray[i];
}
// вычислить значения выходов сети на основании имеющихся загруженных или обученных данных
NN.NetOUT(X, out Y);
// отобразить данные в поле на форме
for (int i = 0; i < Y.Length; i++)
{
// Если на выходе сети более одного элемента, и элемент не первый,
// то вставить пробел перед значением выхода
if (i > 0)
examNetY.AppendText(" ");
// для краткости округлить значения до целого числа
double d = Math.Round(Y[i], 3);
// добавить в поле непосредственно само значение
examNetY.AppendText( d.ToString() );
}
Рисунок А1 - Продолжение
this.Cursor = Cursors.Default;
}
private void ShowNetStatus()
{
string strNetLayers="";
for (int i = 0; i < NN.CountLayers; i++)
{
if (i > 0)
strNetLayers += " ";
strNetLayers += NN.Layers[i].countY;
}
string strNNStatus = "Состояние сети:" + Environment.NewLine +
"Количество входов - " + NN.GetX.ToString() + Environment.NewLine +
"Количество слоев - " + NN.CountLayers.ToString() + Environment.NewLine +
"Количество нейронов в слоях - " + strNetLayers + Environment.NewLine +
"Количество выходов - " + NN.GetY.ToString();
MessageBox.Show(strNNStatus, FormCaption);
}
private void srcFilePath_TextChanged(object sender, EventArgs e)
{
}
}
}
Рисунок А1 - Продолжение
ПРИЛОЖЕНИЕ Б РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
Программа представляет собой приложение, позволяющее прогнозировать атмосферное давление на основе статистических данных. При запуске программы вы наблюдаете диалоговое окно. Окно представлены на рисунках 3.
1) Для запуска программы нужно запустить файл NeuralNetPropagation.exe. 2) необходимо произвести загрузку данных для обучения, затем создать сеть(указав количество нейроно на слоях,через пробел). 3) Обучить ИНС вручную, автоматически или загрузить уже обученную ИНС.
4) Для получения прогноза, необходимо загрузить данные за последний период и нажать кнопку "Получить прогноз". 5) Рядом в текстовом поле появится результат прогнозирования.
6) Для завершения работы следует нажать кнопку "Закрыть".
ПРИЛОЖЕНИЕ В РУКОВОДСТВО ПРОГРАММИСТА
Программа разработана в Microsoft Visual Studio 2005. Был разработан класс Neuron - класс нейрона.
PressureArray - массив входных сигналов Weights - массив весовых коэффициентов
Delta - изменение весов
countX, countY - количество сигналов kLearn - скорость обучения Weights = new double[cX, cY] - инициализация весовых коэффициентов
S - функция активации
Layers()- изменение весовых коэффициентов
NN.NetOUT()-вычисление значений выходов
kErr - вычисление ошибоки LearnNet() - обучение 2
Документ
Категория
Рефераты
Просмотров
34
Размер файла
325 Кб
Теги
itpz, otchetmoy
1/--страниц
Пожаловаться на содержимое документа