名前 題名 ▼ takiさん > 次に呼び出し側の分です。 > ------------------------------------------------------------------- > unit Unit1; > > interface > > uses > Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, > Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Types, Vcl.ExtCtrls; > > type > TForm1 = class(TForm) > Button1: TButton; > Image1: TImage; > Label1: TLabel; > Label2: TLabel; > Label3: TLabel; > Button2: TButton; > Edit1: TEdit; > Edit2: TEdit; > Label4: TLabel; > Label5: TLabel; > Label6: TLabel; > procedure Button1Click(Sender: TObject); > procedure Button2Click(Sender: TObject); > private > { Private 宣言 } > public > { Public 宣言 } > end; > > var > Form1: TForm1; > > procedure ShowKekka; > > implementation > > uses UnitSimplePerceptron; > > {$R *.dfm} > > procedure ShowKekka; > var > i,j,xx,yy,lp:integer; > aa,cc:double; > begin > with Form1 do begin > Application.ProcessMessages; > Image1.Picture := nil; > for i := 0 to 99 do begin > xx := round(TeachingData[i][1] * 80); // '特売'の出現回数 > yy := round(TeachingData[i][2] * 80); // '今すぐクリック'の出現回数 > yy := Image1.Height - yy; > if TeachingLabel[i] = 1 then begin // SPAMっぽい > Image1.Canvas.Pixels[xx,yy] := clRed; > Image1.Canvas.Pixels[xx+1,yy] := clRed; > Image1.Canvas.Pixels[xx+1,yy+1] := clRed; > Image1.Canvas.Pixels[xx,yy+1] := clRed; > end else begin > Image1.Canvas.Pixels[xx,yy] := clBlack; > Image1.Canvas.Pixels[xx+1,yy] := clBlack; > Image1.Canvas.Pixels[xx+1,yy+1] := clBlack; > Image1.Canvas.Pixels[xx,yy+1] := clBlack; > end; > end; > aa := -WeightVector[1]/WeightVector[2]; > cc := -WeightVector[0]/WeightVector[2]; > label1.Caption := floattostr(aa); > label2.Caption := floattostr(cc); > label3.Caption := inttostr(lp); // ループの回数 > xx := 0; > yy := round(aa*xx+cc); > Image1.Canvas.MoveTo(xx*80,Image1.Height - yy*80); > // > yy := 0; > xx := round((yy - cc) / aa); > Image1.Canvas.LineTo(xx*80,Image1.Height - yy*80); > // Application.ProcessMessages; > // sleep(100); > // Application.ProcessMessages; > end; > end; > > procedure TForm1.Button1Click(Sender: TObject); > var > i,j,xx,yy,lp:integer; > aa,cc:double; > begin > CrtTeachingData(2,100); // (1,x1,x2)…100個 > // > SetLength(InputVector,2 + 1); > SetLength(WeightVector,2 + 1); > lp := MachineLearning(2,100,1000); > if lp > 0 then begin > ShowKekka; > end; > > end; > > // 入力結果の判定 > procedure TForm1.Button2Click(Sender: TObject); > begin > // テストしたいデータをInputVectorにセットする > InputVector[0] := 1; > InputVector[1] := strtofloat(Edit1.Text); > InputVector[2] := strtofloat(Edit2.Text); > if DiscriminantFunction(InputVector,WeightVector) >= 0 then begin > label4.Caption := 'SPAM'; > end else begin > label4.Caption := '非SPAM'; > end; > end; > > end. > ------------------------------------------------------------------- > > "特売"や"今すぐクリック"などの語句の出現数でSPAM度を計算しました。 > "特売"はx1回、"今すぐクリック"はx2回含まれていたとして教師データを作成 > しました。 > また、2つの語句の合計が3.8回以上使われていたらSPAMメールとしました。 > > 今回は黒点は非SPAMデータ、赤点はSPAMデータ、識別の線も表示しました。 > > 困っている現象は、識別線のマイナス側(非SPAM側)に赤点(SPAM)データが > 何個かある事です。 > 何度やってみても混ざり込みます。 > > 機械学習のループでは全ての教師データが正確に識別された時にのみループから > 抜け出す筈です。 > > しかしながら、最大ループ回数以下でループを抜け出しているのに混在する > 理由がわかりません。 > > Button2はX1,X2に適当な数を入れてクリックすると、学習済みの識別関数を > 使って結果が求まる事をテストしています。 > 識別関数は合計が約3.8回で学習しているので、3回は非SPAMという判定です。 > > 長文すみません。 GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link