j1 j2 ... js ... jm
c1 c2 ... cs ... cm
2.3 Описание тестового примера.
В файле train.txt задается обучающая последовательность. Формат файла следующий: в первой строчке задается k - количество нейронов распределительного слоя, во второй строчке задается n - количество нейронов слоя Кохонена, в третьей строчке задается m - длина обучающей последовательности ( количество обучающих векторов ), далее задается обучающая последовательность в соответствии с введенными выше параметрами, состоящая из бинарных векторов. В файле test.txt задается тестовый бинарный вектор, который должен соответствовать параметрам из файла train.txt, находящимся в первых трех строчках. Признаками кластера является нахождение группы единиц в векторе.
2.4 Программный комплекс.
Программа выполнена на языке программирования Borland C++ 3.1 .
Она находится в файле koch.cpp. Текст программы приведён ниже.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include<conio.h>
//количество нейронов слоя Кохонена задается в первой строчке файла trenir.dat
int n;
//количество нейронов распределительного слоя задается в второй строчке файла trenir.dat
int k;
//длина обучающей последовательности задается в третьей строчке файла trenir.dat
int m;
//время,характеризующее длительность процесса обучения
const int T=100;
int i,j,t,yi;
float eps=0.001;
// определение массивов весов
float alpha[500],alphaS[500];
//обучающая последовательность
float Xs[500][20];
float temp[20];
int s,l=0,ii;
char ch,input;
FILE *test,*trenir,*ves_ner;
/* описание подпрограмм*/
float Function_Activat(float y);
int Otklik( float *Xs, float *alpha); //step - 4
int g(int r, int t);
void Function_Korrect(int yi,int t, float *Xs, float *alpha);// step - 5
void Obuchen (void);
void Test_net (void);
void Exit_prog (void);
/*Основная программа*/
main()
{
l1:
clrscr();
puts("Моделирование работы сети Кохонена, ее обучение и выполнение ");
puts(" тестового примера");
puts("\n.........обучающая последовательность задана в файле trenir.dat");
puts(".........тестовая последовательность задана в файле test.dat");
puts("\nДля начала обучения нажмите Enter...");
puts("\nДля выхода Esc...");
input=getch();
if (input==0) input=getch() ;
if (input==27) Exit_prog (); ;
Obuchen();
Test_net();
goto l1;
} /*Конец программы*/
/* Функция g(r,t), */
int g(int r, int t)
{
const int D=100;
if (r<D/t) return 1;
else return 0;
}
/* Сигмоидальная функция активации */
float Function_Activat(float y)
{
float fy;
fy=1/(1+exp(-y));
return fy;
}
/* Функция, выполняющая коррекцию весов */
void Function_Korrect(int yi,int t, float *Xs, float *alpha)
{
int r;
float gamma=0.1; // константа , характеризующая скорость обучения
for (j=0;j<n;j++)
for (i=0;i<k;i++)
{
r=abs(yi-j); // расстояние между нейронами сети Кохонена
alpha[i+j*k]+=gamma*g(r,t)*(Xs[i]-alpha[i+j*k]);
}
}
/* Определение откликов всех нейронов слоя Кохонена */
int Otklik(float *Xs,float *alpha)
{
int i,j;
float y[20],max;
for (j=0;j<n;y[j++]=0);
for (j=0;j<n;j++)
{
for (i=0;i<k;i++) y[j]+=alpha[i+j*k]*Xs[i];
y[j]=Function_Activat(y[j]);
}
yi=0;
max=y[yi];
for (j=1;j<n;j++)
if (y[j]>max)
{
max=y[j];
yi=j;
}
return yi;
}
/* Блок обучения сети Кохонена */
void Obuchen (void)
{
clrscr();
puts("Обучение начато...");
trenir=fopen("trenir.dat","r");
puts("...Чтение файла начато");
fscanf(trenir,"%d",&k); //Определение нейронов распределительного слоя
fscanf(trenir,"%d",&n);//Определение нейронов слоя Кохонена
fscanf(trenir,"%d",&m);//Количество векторов
fgetc(trenir);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.