Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

77
LINES

< > BotCompany Repo | #1026916 // Perceptron Spike [learn 3 weights, OK]

JavaX source code (Dynamic Module) [tags: use-pretranspiled] - run with: Stefan's OS

Uses 911K of libraries. Click here for Pure Java version (5136L/26K).

1  
!7
2  
3  
cmodule PerceptronSpike > DynPrintLogAndEnabled {
4  
  sclass Example {
5  
    double[] inputs;
6  
    int answer;
7  
8  
    *() {}
9  
    *(double x, double y, int a) {
10  
      inputs = new double[] {x, y, 1};
11  
      answer = a;
12  
    }
13  
  }
14  
15  
  switchable int nExamples = 200;
16  
  L<Example> examples;
17  
  switchable double c = 1;
18  
  switchable bool randomizeC = false;
19  
  switchable bool startWithRandomWeights = true;
20  
  transient double[] weights;
21  
  transient double error;
22  
23  
  start-thread {
24  
    if (l(examples) != nExamples)
25  
      setField(examples := repF(nExamples, () -> {
26  
        int x = rand(640), y = rand(360);
27  
        ret new Example(x, y, y < f(x) ? -1 : 1);
28  
      }));
29  
      
30  
    int n = l(first(examples).inputs);
31  
    print(+n);
32  
    weights = new double[n];
33  
    if (startWithRandomWeights)
34  
      for i over weights: weights[i] = random(-1.0, 1.0);
35  
36  
    double lastError = -1;
37  
    long round = 0;
38  
    while ping (lastError != 0) {
39  
      if (!enabled) continue with sleepSeconds(1);
40  
      ++round;
41  
      double error = train();
42  
      if (error != lastError) {
43  
        print("Error: " + error + ", round " + round + ", weights: " + sfu(weights));
44  
        lastError = error;
45  
      }
46  
    }
47  
  }
48  
  
49  
  double train() {
50  
    double error = 0;
51  
    for (Example e : examples) error += abs(train(e));
52  
    ret error/l(examples);
53  
  }
54  
  
55  
  // function to be learned
56  
  private double f(double x) {
57  
    ret x * 0.7 + 40;
58  
  }
59  
60  
  int feedForward(double[] inputs) {
61  
    double sum = 0;
62  
    for i over weights: sum += inputs[i] * weights[i];
63  
    ret activate(sum);
64  
  }
65  
66  
  int activate(double s) {
67  
    return s > 0 ? 1 : -1;
68  
  }
69  
70  
  double train(Example e) {
71  
    int guess = feedForward(e.inputs);
72  
    double error = e.answer - guess;
73  
    double cc = c/nExamples;
74  
    for i over weights: weights[i] += (randomizeC ? rand(cc) : cc) * error * e.inputs[i];
75  
    ret error;
76  
  }
77  
}

Author comment

Began life as a copy of #1026915

download  show line numbers  debug dex  old transpilations   

Travelled to 7 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv

No comments. add comment

Snippet ID: #1026916
Snippet name: Perceptron Spike [learn 3 weights, OK]
Eternal ID of this version: #1026916/26
Text MD5: c50d057b14283b664241c70d4bf22ad5
Transpilation MD5: aaa111a1b7c37167503790de9492ef60
Author: stefan
Category: javax
Type: JavaX source code (Dynamic Module)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2020-02-02 19:02:11
Source code size: 1916 bytes / 77 lines
Pitched / IR pitched: No / No
Views / Downloads: 312 / 740
Version history: 25 change(s)
Referenced in: [show references]