Решение задач кластеризации и аппроксимации в нейросетевом логическом базисе. Описание сети Кохонена (алгоритм работы), страница 2

 


  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);