# モジュールのインポート
import math
import sys
# グローバル変数
INPUTNO = 2 # 入力数
HIDDENNO = 2 # 中間層のセル数
MAXINPUTNO = 100 # データの最大個数
# 下請け関数の定義
# getdata()関数
def getdata(e):
"""学習データの読み込み"""
n_of_e = 0 # データセットの個数
# データの入力
for line in sys.stdin:
e[n_of_e] = [float(num) for num in line.split()]
n_of_e += 1
return n_of_e
# getdata()関数の終わり
# forward()関数
def forward(wh, wo, hi, e):
"""順方向の計算"""
# hiの計算
for i in range(HIDDENNO):
u = 0.0
for j in range(INPUTNO):
u += e[j] * wh[i][j]
u -= wh[i][INPUTNO] # しきい値の処理
hi[i] = f(u)
# 出力oの計算
o = 0.0
for i in range(HIDDENNO):
o += hi[i] * wo[i]
o -= wo[HIDDENNO] # しきい値の処理
return f(o)
# forward()関数の終わり
# f()関数
def f(u):
"""伝達関数"""
# ステップ関数の計算
if u >= 0:
return 1.0
else:
return 0.0
# シグモイド関数の計算
# return 1.0 / (1.0 + math.exp(-u))
# f()関数の終わり
# メイン実行部
wh = [[-2, 3, -1], [-2, 1, 0.5]] # 中間層の重み
wo = [-60, 94, -1] # 出力層の重み
e = [[0.0 for i in range(INPUTNO)]
for j in range(MAXINPUTNO)] # データセット
hi = [0 for i in range(HIDDENNO + 1)] # 中間層の出力
# 入力データの読み込み
n_of_e = getdata(e)
print("データの個数:", n_of_e)
# 計算の本体
for i in range(n_of_e):
print(i, ":", e[i], "->", forward(wh, wo, hi, e[i]))
# nn.pyの終わり
IyDjg6Ljgrjjg6Xjg7zjg6vjga7jgqTjg7Pjg53jg7zjg4gKaW1wb3J0IG1hdGgKaW1wb3J0IHN5cwoKIyDjgrDjg63jg7zjg5Djg6vlpInmlbAKSU5QVVROTyA9IDIgICAgICAgIyDlhaXlipvmlbAKSElEREVOTk8gPSAyICAgICAgIyDkuK3plpPlsaTjga7jgrvjg6vmlbAKTUFYSU5QVVROTyA9IDEwMCAgIyDjg4fjg7zjgr/jga7mnIDlpKflgIvmlbAKCiMg5LiL6KuL44GR6Zai5pWw44Gu5a6a576pCiMgZ2V0ZGF0YSgp6Zai5pWwCmRlZiBnZXRkYXRhKGUpOgogICAgIiIi5a2m57+S44OH44O844K/44Gu6Kqt44G/6L6844G/IiIiCiAgICBuX29mX2UgPSAwICMg44OH44O844K/44K744OD44OI44Gu5YCL5pWwCiAgICAjIOODh+ODvOOCv+OBruWFpeWKmwogICAgZm9yIGxpbmUgaW4gc3lzLnN0ZGluOgogICAgICAgIGVbbl9vZl9lXSA9IFtmbG9hdChudW0pIGZvciBudW0gaW4gbGluZS5zcGxpdCgpXQogICAgICAgIG5fb2ZfZSArPSAxCiAgICByZXR1cm4gbl9vZl9lCiMgZ2V0ZGF0YSgp6Zai5pWw44Gu57WC44KP44KKCgojIGZvcndhcmQoKemWouaVsApkZWYgZm9yd2FyZCh3aCwgd28sIGhpLCBlKToKICAgICIiIumghuaWueWQkeOBruioiOeulyIiIgogICAgIyBoaeOBruioiOeulwogICAgZm9yIGkgaW4gcmFuZ2UoSElEREVOTk8pOgogICAgICAgIHUgPSAwLjAKICAgICAgICBmb3IgaiBpbiByYW5nZShJTlBVVE5PKToKICAgICAgICAgICAgdSArPSBlW2pdICogd2hbaV1bal0KICAgICAgICB1IC09IHdoW2ldW0lOUFVUTk9dICMg44GX44GN44GE5YCk44Gu5Yem55CGCiAgICAgICAgaGlbaV0gPSBmKHUpCiAgICAKICAgICMg5Ye65Yqbb+OBruioiOeulwogICAgbyA9IDAuMAogICAgZm9yIGkgaW4gcmFuZ2UoSElEREVOTk8pOgogICAgICAgIG8gKz0gaGlbaV0gKiB3b1tpXQogICAgbyAtPSB3b1tISURERU5OT10gIyDjgZfjgY3jgYTlgKTjga7lh6bnkIYKICAgIHJldHVybiBmKG8pCiMgZm9yd2FyZCgp6Zai5pWw44Gu57WC44KP44KKCgojIGYoKemWouaVsApkZWYgZih1KToKICAgICIiIuS8nemBlOmWouaVsCIiIgogICAgIyDjgrnjg4bjg4Pjg5fplqLmlbDjga7oqIjnrpcKICAgIGlmIHUgPj0gMDoKICAgICAgICByZXR1cm4gMS4wCiAgICBlbHNlOgogICAgICAgIHJldHVybiAwLjAKICAgICMg44K344Kw44Oi44Kk44OJ6Zai5pWw44Gu6KiI566XCiAgICAjIHJldHVybiAxLjAgLyAoMS4wICsgbWF0aC5leHAoLXUpKQojIGYoKemWouaVsOOBrue1guOCj+OCigoKIyDjg6HjgqTjg7Plrp/ooYzpg6gKd2ggPSBbWy0yLCAzLCAtMV0sIFstMiwgMSwgMC41XV0gICMg5Lit6ZaT5bGk44Gu6YeN44G/CndvID0gWy02MCwgOTQsIC0xXSAgICAgICAgICAgICAgICAjIOWHuuWKm+WxpOOBrumHjeOBvwplID0gW1swLjAgZm9yIGkgaW4gcmFuZ2UoSU5QVVROTyldCiAgICAgZm9yIGogaW4gcmFuZ2UoTUFYSU5QVVROTyldICAjIOODh+ODvOOCv+OCu+ODg+ODiApoaSA9IFswIGZvciBpIGluIHJhbmdlKEhJRERFTk5PICsgMSldICMg5Lit6ZaT5bGk44Gu5Ye65YqbCgojIOWFpeWKm+ODh+ODvOOCv+OBruiqreOBv+i+vOOBvwpuX29mX2UgPSBnZXRkYXRhKGUpCnByaW50KCLjg4fjg7zjgr/jga7lgIvmlbA6Iiwgbl9vZl9lKQoKIyDoqIjnrpfjga7mnKzkvZMKZm9yIGkgaW4gcmFuZ2Uobl9vZl9lKToKICAgIHByaW50KGksICI6IiwgZVtpXSwgIi0+IiwgZm9yd2FyZCh3aCwgd28sIGhpLCBlW2ldKSkKIyBubi5weeOBrue1guOCj+OCig==