Perceptron: Difference between revisions

Content deleted Content added
PureFox (talk | contribs)
Added Wren
Line 2,447: Line 2,447:
After 500 trainings: 99.777 % accuracy
After 500 trainings: 99.777 % accuracy
After 1000 trainings: 98.523 % accuracy</pre>
After 1000 trainings: 98.523 % accuracy</pre>

=={{header|Wren}}==
{{trans|Pascal}}
<lang ecmascript>import "random" for Random

var rand = Random.new()

// the function being learned is f(x) = 2x + 1
var targetOutput = Fn.new { |a, b| (a * 2 + 1 < b) ? 1 : -1 }

var showTargetOutput = Fn.new {
for (y in 10..-9) {
for (x in -9..10) {
if (targetOutput.call(x, y) == 1) {
System.write("#")
} else {
System.write("O")
}
}
System.print()
}
System.print()
}

var randomWeights = Fn.new { |ws|
for (i in 0..2) ws[i] = rand.float() * 2 - 1
}

var feedForward = Fn.new { |ins, ws|
// the perceptron outputs 1 if the sum of its inputs multiplied by
// its input weights is positive, otherwise -1
var sum = 0
for (i in 0..2) sum = sum + ins[i] * ws[i]
return (sum > 0) ? 1 : -1
}

var showOutput = Fn.new { |ws|
var inputs = List.filled(3, 0)
inputs[2] = 1 // bias
for (y in 10..-9) {
for (x in -9..10) {
inputs[0] = x
inputs[1] = y
if (feedForward.call(inputs, ws) == 1) {
System.write("#")
} else {
System.write("O")
}
}
System.print()
}
System.print()
}

var train = Fn.new { |ws, runs|
var inputs = List.filled(3, 0)
inputs[2] = 1 // bias
for (i in 1..runs) {
for (y in 10..-9) {
for (x in -9..10) {
inputs[0] = x
inputs[1] = y
var error = targetOutput.call(x, y) - feedForward.call(inputs, ws)
for (j in 0..2) {
ws[j] = ws[j] + error * inputs[j] * 0.01 // 0.01 is the learning constant
}
}
}
}
}

var weights = List.filled(3, 0)
System.print("Target output for the function f(x) = 2x + 1:")
showTargetOutput.call()
randomWeights.call(weights)
System.print("Output from untrained perceptron:")
showOutput.call(weights)
train.call(weights, 1)
System.print("Output from perceptron after 1 training run:")
showOutput.call(weights)
train.call(weights, 4)
System.print("Output from perceptron after 5 training runs:")
showOutput.call(weights)</lang>

{{out}}
<pre>
Target output for the function f(x) = 2x + 1:
##############OOOOOO
#############OOOOOOO
#############OOOOOOO
############OOOOOOOO
############OOOOOOOO
###########OOOOOOOOO
###########OOOOOOOOO
##########OOOOOOOOOO
##########OOOOOOOOOO
#########OOOOOOOOOOO
#########OOOOOOOOOOO
########OOOOOOOOOOOO
########OOOOOOOOOOOO
#######OOOOOOOOOOOOO
#######OOOOOOOOOOOOO
######OOOOOOOOOOOOOO
######OOOOOOOOOOOOOO
#####OOOOOOOOOOOOOOO
#####OOOOOOOOOOOOOOO
####OOOOOOOOOOOOOOOO

Output from untrained perceptron:
######OOOOOOOOOOOOOO
######OOOOOOOOOOOOOO
#######OOOOOOOOOOOOO
#######OOOOOOOOOOOOO
#######OOOOOOOOOOOOO
#######OOOOOOOOOOOOO
#######OOOOOOOOOOOOO
########OOOOOOOOOOOO
########OOOOOOOOOOOO
########OOOOOOOOOOOO
########OOOOOOOOOOOO
#########OOOOOOOOOOO
#########OOOOOOOOOOO
#########OOOOOOOOOOO
#########OOOOOOOOOOO
#########OOOOOOOOOOO
##########OOOOOOOOOO
##########OOOOOOOOOO
##########OOOOOOOOOO
##########OOOOOOOOOO

Output from perceptron after 1 training run:
##############OOOOOO
#############OOOOOOO
#############OOOOOOO
############OOOOOOOO
############OOOOOOOO
###########OOOOOOOOO
###########OOOOOOOOO
##########OOOOOOOOOO
##########OOOOOOOOOO
#########OOOOOOOOOOO
#########OOOOOOOOOOO
########OOOOOOOOOOOO
########OOOOOOOOOOOO
#######OOOOOOOOOOOOO
#######OOOOOOOOOOOOO
######OOOOOOOOOOOOOO
######OOOOOOOOOOOOOO
#####OOOOOOOOOOOOOOO
#####OOOOOOOOOOOOOOO
####OOOOOOOOOOOOOOOO

Output from perceptron after 5 training runs:
##############OOOOOO
#############OOOOOOO
#############OOOOOOO
############OOOOOOOO
############OOOOOOOO
###########OOOOOOOOO
###########OOOOOOOOO
##########OOOOOOOOOO
##########OOOOOOOOOO
#########OOOOOOOOOOO
#########OOOOOOOOOOO
########OOOOOOOOOOOO
########OOOOOOOOOOOO
#######OOOOOOOOOOOOO
#######OOOOOOOOOOOOO
######OOOOOOOOOOOOOO
######OOOOOOOOOOOOOO
#####OOOOOOOOOOOOOOO
#####OOOOOOOOOOOOOOO
####OOOOOOOOOOOOOOOO
</pre>


=={{header|XLISP}}==
=={{header|XLISP}}==