Скачиваний:
29
Добавлен:
01.05.2014
Размер:
7.12 Кб
Скачать
unit FMyEM;

interface

uses
Attribute,FastVector,Windows,Instances, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ComCtrls, DBCtrls, ExtCtrls,TypeEM,m_EM,emg,math,core;

type
TMyEM = class(TForm)
text1: TLabel;
text2: TLabel;
param1: TEdit;
param2: TEdit;
Image1: TImage;
output: TDBRichEdit;
Image: TImage;
START: TButton;
MainMenu1: TMainMenu;
file1: TMenuItem;
Exit1: TMenuItem;
View1: TMenuItem;
Graphicresults1: TMenuItem;
Help1: TMenuItem;
about1: TMenuItem;
s1: TMenuItem;
procedure display;
procedure draw;
procedure Exit1Click(Sender: TObject);
procedure about1Click(Sender: TObject);
procedure Graphicresults1Click(Sender: TObject);
procedure STARTClick(Sender: TObject);
procedure outputChange(Sender: TObject);
procedure s1Click(Sender: TObject);
private
gr:integer;
key: integer;
{ Private declarations }
public
EM:TEM;
save: integer;
procedure init(var core1: TDMCore);
{ Public declarations }
end;

var
FEM:TMyEM;
core2: TDMcore;
inst: TDMInstances;
insti: TDMInstances;



implementation

{$R *.dfm}

procedure TMyEM.init(var core1: TDMCore);
var
EMd: TEMList2;
i,j,c1,c2:integer;
A: TDMinstances;
temp: double;
att: TDMAttribute;
cl:integer;
begin
core2:=core1;
inst:=core1.GetData();
A:=core1.getdata;
i:=A.numInstances;
j:=A.numattributes;
setlength(EMd,i,j);
for c1:=0 to i-1 do
for c2:=0 to j-1 do
EMd[c1,c2]:=A.instance(c1).value(c2);
EM:=TEM.create();
EM.setdata(EMd);
FEM.ShowModal();
if FEM.save=1 then begin
FEM.save:=0;
insti:=core2.getdata;

att:=TDMAttribute.Create('Cluster number');
insti.insertAttributeAt(att,0);
temp:=0.0;
for c1:=0 to i-1 do begin
for c2:=0 to EM.getnumofcl -1 do begin
if temp<EM.propose(c1,c2) then begin temp:=EM.propose(c1,c2); cl:=c2; end;
end;
insti.instance(c1).setvalue(0,cl);
temp:=0.0;
end;
core1.SetData(insti);
end;
end;

procedure TMyEM.Exit1Click(Sender: TObject);
begin
close;
emgraph.Close;
end;

procedure TMyEM.about1Click(Sender: TObject);
begin
key:=1;
output.clear;
output.Font.Color:=$ffffff;
output.lines.add('ЕМ модуль v 1.0');
output.lines.add('Авторы: Волков Александр и Марьяскин Евгений');
output.lines.add('Дата создания: 3.10.2006');
output.lines.add('Дата последней модификации: 26.12.2006');
end;

procedure TMyEM.Graphicresults1Click(Sender: TObject);
begin
if gr=1 then begin emgraph.Visible:=false;gr:=0;end else
begin gr:=1;
STARTClick(FEM);end;
end;

procedure TMyEM.STARTClick(Sender: TObject);
var
i,j:string;
begin
key:=2;
i:=param1.Text;
j:=param2.Text;
EM.setnumofcl(StrToInt(i));
EM.setnumofit(StrToInt(j));
EM.learn;
display;
if gr=1 then draw;

end;

procedure TMyEM.display;
var
i,j:integer;
begin
i:=0;j:=0;
for i:=0 to EM.getnumofcl() - 1 do
begin
output.lines.Add('Claster №'+inttostr(i)+':');
output.lines.Add('Probability = '+floatToStr(EM.getP(i)));
output.lines.Add('Offset = '+FloatToStr(EM.getV(j)));
output.lines.add('Center = ');
for j:=0 to EM.get_d() - 1 do
begin
output.lines.Add(FloatToStr(EM.getU(i,j)));
end;
output.lines.Add('');
output.lines.Add('');
end;
output.lines.Add('');
for i:=0 to EM.getN()-1 do
begin
for j:=0 to EM.getnumofcl()-1 do
begin
output.lines.add('P('+inttostr(i)+'|'+inttostr(j)+')='
+floattostr(EM.propose(i,j))+' ');
end;
output.lines.Add('');
end;
for i:=0 to EM.getN()-1 do
begin
for j:=0 to EM.get_d()-1 do
output.lines.add('X['+IntToStr(i)+','+IntToStr(j)+'] = '
+FloatToStr(EM.getD(i,j))+' ');
output.lines.add('');
end;
end;



procedure TMyEM.draw;
const
colors : array[0..14] of TColor = (TColor($FF0000),TColor($00FF00),TColor($0000FF),
TColor($FFFF00),TColor($FF00FF),TColor($00FFFF),TColor($FFFFFF),
TColor($808080),TColor($800000),TColor($008000),TColor($000080),
TColor($808000),TColor($800080),TColor($008080),TColor($000080));
var
i : integer;
rect : TRect;
centX, centY : double;
normX, normY : double;
maxX,maxY:Integer;
begin
maxX:= 305;
maxY:= 257;
emgraph.Visible:=true;
rect.Top:=0;
rect.Left:=0;
rect.Right:=maxx;
rect.Bottom:=maxy;
centX:=EM.getd(0,0);
if EM.get_d>1 then centY:=EM.getD(0,1)
else centY:=0.0;
normX:=centX;
normY:=centY;

for i:=1 to EM.getN()-1 do
begin
if centX>EM.getd(i,0) then centX:=EM.getD(i,0);
if normX<EM.getd(i,0) then normX:=EM.getd(i,0);
end;
if EM.get_d()>1 then
for i:=1 to EM.getN()-1 do
begin
if centY>EM.getd(i,1) then centY:=EM.getd(i,1);
if normY<EM.getd(i,1) then normY:=EM.getd(i,1);
end
else normY:=1.0;
normX:=normX-centX;
normY:=normY-centY;
centX:=centX-normX/20;
centY:=centY-normY/20;
normX:=(maxX-20)/(normX+normX/10);
normY:=maxY/(normY+normY/10);
emgraph.EMimg.Canvas.Brush.Color:=TColor(clBlack);
emgraph.EMimg.Canvas.FillRect(rect);
if EM.get_d>1 then
begin
for i:=0 to EM.getnumofcl()-1 do
begin
emgraph.EMimg.Canvas.Pen.Color:=colors[i mod 15];
//emgraph.EMimg.Canvas.Arc(Floor((EM.getu(i,0)-EM.getv(i)-centX)*normX),maxY-Floor((EM.getu(i,1)-EM.getv(i)-centY)*normY),Floor((EM.getu(i,0)+EM.getv(i)-centX)*normX),0,0,0,0,0);
emgraph.EMimg.Canvas.Font.Color:=colors[i mod 15];
emgraph.EMimg.Canvas.Font.Size:=10;
emgraph.EMimg.Canvas.TextOut(maxX-20,i*20,IntToStr(i));
end;
for i:=0 to EM.getN()-1 do
emgraph.EMimg.Canvas.Pixels[Floor((EM.getd(i,0)-centX)*normX),maxY-Floor((EM.getD(i,1)-centY)*normY)]:=colors[EM.cluster(i) mod 15];
end
else
begin
for i:=0 to EM.getnumofcl()-1 do
begin
emgraph.EMimg.Canvas.Pen.Color:=colors[i mod 15];
//emgraph.EMimg.Canvas.Arc(Floor((EM.getu(i,0)-EM.getv(i)-centX)*normX),Floor(maxY/2-20),Floor((EM.getu(i,0)+EM.getv(i)-centX)*normX),Floor(maxY/2+20),0,0,0,0);
emgraph.EMimg.Canvas.Font.Color:=colors[i mod 15];
emgraph.EMimg.Canvas.Font.Size:=10;
emgraph.EMimg.Canvas.TextOut(maxX-20,i*20,IntToStr(i));
end;
for i:=0 to EM.getN()-1 do
emgraph.EMimg.Canvas.Pixels[Floor((EM.getD(i,0)-centX)*normX),Floor(maxY/2)]:=colors[EM.cluster(i) mod 15];
end;
emgraph.EMimg.Canvas.Refresh;
end;


procedure TMyEM.outputChange(Sender: TObject);
begin
if key=2 then begin
output.Clear;
display;end;
end;

procedure TMyEM.s1Click(Sender: TObject);
begin
save:=1;
end;

end.
Соседние файлы в папке MyEM