Perceptron: Difference between revisions

Content added Content deleted
No edit summary
Line 18: Line 18:
* [https://youtu.be/dXuNAkHsos4?t=16m44s Machine Learning - Perceptrons (youtube)]
* [https://youtu.be/dXuNAkHsos4?t=16m44s Machine Learning - Perceptrons (youtube)]
<br><br>
<br><br>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{libheader| System.Classes}}
{{libheader| Vcl.Graphics}}
{{libheader| Vcl.Forms}}
{{libheader| Vcl.ExtCtrls}}
{{libheader| System.UITypes}}
{{Trans|Java}}
<lang Delphi>
unit main;

interface

uses
System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Forms, Vcl.ExtCtrls,
System.UITypes;

type
TTrainer = class
inputs: TArray<Double>;
answer: Integer;
constructor Create(x, y: Double; a: Integer);
end;

TForm1 = class(TForm)
tmr1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure tmr1Timer(Sender: TObject);
private
procedure Perceptron(n: Integer);
function FeedForward(inputs: Tarray<double>): integer;
procedure Train(inputs: Tarray<double>; desired: integer);
end;

var
Form1: TForm1;
Training: TArray<TTrainer>;
weights: TArray<Double>;
c: double = 0.00001;
count: Integer = 0;

implementation

{$R *.dfm}

{ TTrainer }

constructor TTrainer.Create(x, y: Double; a: Integer);
begin
inputs := [x, y, 1];
answer := a;
end;

function f(x: double): double;
begin
Result := x * 0.7 + 40;
end;

function activateFn(s: double): integer;
begin
if (s > 0) then
Result := 1
else
Result := -1;
end;

procedure TForm1.FormPaint(Sender: TObject);
const
DotColor: array[Boolean] of TColor = (clRed, clBlue);
var
i, x, y, guess: Integer;
begin
with Canvas do
begin
Brush.Color := Tcolors.Whitesmoke;
FillRect(ClipRect);

x := ClientWidth;
y := Trunc(f(x));
Pen.Width := 3;
pen.Color := TColors.Orange;
Pen.Style := TPenStyle.psSolid;
MoveTo(0, Trunc(f(0)));
LineTo(x, y);
Train(training[count].inputs, training[count].answer);
count := (count + 1) mod length(training);

Pen.Width := 1;
pen.Color := TColors.Black;

for i := 0 to count do
begin
guess := FeedForward(training[i].inputs);
x := trunc(training[i].inputs[0] - 4);
y := trunc(training[i].inputs[1] - 4);

Brush.Style := TBrushStyle.bsSolid;
Pen.Style := TPenStyle.psClear;

Brush.Color := DotColor[guess > 0];
Ellipse(rect(x, y, x + 8, y + 8));
end;
end;
end;

procedure TForm1.Perceptron(n: Integer);
const
answers: array[Boolean] of integer = (-1, 1);
var
i, x, y, answer: Integer;
begin
SetLength(weights, n);
for i := 0 to high(weights) do
weights[i] := Random * 2 - 1;

for i := 0 to High(Training) do
begin
x := Trunc(Random() * ClientWidth);
y := Trunc(Random() * ClientHeight);

answer := answers[y < f(x)];

training[i] := TTrainer.Create(x, y, answer);
end;
tmr1.Enabled := true;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
Invalidate;
end;

function TForm1.FeedForward(inputs: Tarray<double>): integer;
var
sum: double;
i: Integer;
begin
Assert(length(inputs) = length(weights), 'weights and input length mismatch');
sum := 0;
for i := 0 to high(weights) do
sum := sum + inputs[i] * weights[i];
result := activateFn(sum);
end;

procedure TForm1.Train(inputs: Tarray<double>; desired: integer);
var
guess: Integer;
error: Double;
i: Integer;
begin
guess := FeedForward(inputs);
error := desired - guess;
for i := 0 to length(weights) - 1 do
weights[i] := weights[i] + c * error * inputs[i];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(Training, 2000);
Perceptron(3);
end;

end.</lang>
Form settings (main.dfm)
<lang Delphi>
object Form1: TForm1
ClientHeight = 360
ClientWidth = 640
DoubleBuffered = True
OnCreate = FormCreate
OnPaint = FormPaint
object tmr1: TTimer
Enabled = False
Interval = 10
OnTimer = tmr1Timer
end
end
</lang>
{{out}}
[[https://ibb.co/pX7QHLS]]


=={{header|Forth}}==
=={{header|Forth}}==