Скачиваний:
31
Добавлен:
01.05.2014
Размер:
7 Кб
Скачать
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