概要
paiza.ioでelixirやってみた。
ニューラルネットワークで、and,or,xorの学習と推定、やってみた。
参考にしたページ
サンプルコード
defmodule NeuralNetwork do
@lambda 1.0
@eta 0.1
@spec of([number],[number]) :: number
def of(w, x) when length(w) == 3 and length(x) == 2 do
w
|> Enum.zip([1, x]
|> List.flatten)
|> Enum.map(fn {a, b} ->
a * b
end)
|> Enum.sum
|> sigmoid
end
@spec error_correct(number, {[number], number}) :: [number]
def error_correct(w, {x, y}) do
w
|> Enum.zip([1, x]
|> List.flatten)
|> Enum.map(fn {a, b} ->
a + @eta * (y - of(w, x) * b)
end)
end
@spec training([number], [{[number], number}]) :: [number]
def training(w, data), do: w |> _training(data)
defp _training(w, []), do: w
defp _training(w, [h | t]), do: _training(error_correct(w, h), t)
@spec exec([number],[{[number],number}],number) :: [number]
def exec(w, _, n) when n == 0, do: w
def exec(w, data, n) when n > 0, do: exec(training(w, data), data, n - 1)
def exec(_, _, _), do: false
defp sigmoid(x), do: 1 / (1 + :math.exp(-@lambda * x))
end
alias NeuralNetwork, as: NN
w = [1, 1, 1]
and_data = [{[0, 0], 0}, {[0, 1], 0}, {[1, 0], 0}, {[1, 1], 1}]
v = w
|> NN.exec(and_data, 1000)
IO.puts("and")
IO.write("0, 0 : ")
NN.of(v, [0, 0])
|> IO.inspect
IO.write("0, 1 : ")
NN.of(v, [0, 1])
|> IO.inspect
IO.write("1, 0 : ")
NN.of(v, [1, 0])
|> IO.inspect
IO.write("1, 1 : ")
NN.of(v, [1, 1])
|> IO.inspect
or_data = [{[0, 0], 0}, {[0, 1], 1}, {[1, 0], 1}, {[1, 1], 1}]
v = w
|> NN.exec(or_data, 1000)
IO.puts("or")
IO.write("0, 0 : ")
NN.of(v, [0, 0])
|> IO.inspect
IO.write("0, 1 : ")
NN.of(v, [0, 1])
|> IO.inspect
IO.write("1, 0 : ")
NN.of(v, [1, 0])
|> IO.inspect
IO.write("1, 1 : ")
NN.of(v, [1, 1])
|> IO.inspect
xor_data = [{[0, 0], 0}, {[0, 1], 1}, {[1, 0], 1}, {[1, 1], 0}]
v = w
|> NN.exec(xor_data, 1000)
IO.puts("xor")
IO.write("0, 0 : ")
NN.of(v, [0, 0])
|> IO.inspect
IO.write("0, 1 : ")
NN.of(v, [0, 1])
|> IO.inspect
IO.write("1, 0 : ")
NN.of(v, [1, 0])
|> IO.inspect
IO.write("1, 1 : ")
NN.of(v, [1, 1])
|> IO.inspect
実行結果
and
0, 0 : 1.8616738545650644e-4
0, 1 : 0.048426217768489974
1, 0 : 0.0487058890113323
1, 1 : 0.9333035631517769
or
0, 0 : 0.01050281992405151
0, 1 : 1.0
1, 0 : 1.0
1, 1 : 1.0
xor
0, 0 : 1.778830268595577e-15
0, 1 : 0.6666666666648118
1, 0 : 0.6364094670296399
1, 1 : 0.9999999999999996
成果物
以上。