読書環境
- Kindle(白黒)
- iPad Pro 10.5 + Kindle(カラー)
- 紙
開発環境
- macOS Mojave - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Python 3.7 (プログラミング言語)
機械学習と深層学習 ―C言語によるシミュレーション― (小高知宏(著)、オーム社)を入手した理由、第2章(機械学習の基礎)、2.1(帰納学習)まで読んだ感想と、C言語ではなくPythonによるシミュレーションのためのプログラムのコードを書いてみる。
入手したのはタイトルにC言語によるシミュレーションとあったから。機械学習や深層学習がどういうものかを知ることができるだけではなく、コードを書いて、実際にプログラムを動かしながら実感出来そうなのが理由。
第1章を読んだところ、本著のコードはWindowsとVisual Studioで動作確認してあるみたい。注意事項としては、環境構築、設定についての詳細は書いてないから、わからないという人は自分で調べる必要有り。もちろん、C言語だからVisual StudioではなくGCCでもいいし、WindowsではなくmacOS、Linux、FreeBSD等でも問題なさそう。
C言語で取り組むのは大変だから、Pythonで取り組むことに。Go言語も考えたけど、まだ学習途中だから、使い慣れたPythonを選択。もしPythonの速度では満足できなくなったりしたらGo言語で取り組むかも。そして、Go言語でも遅いと感じたら、その時は本著のようにC言語、あるいはPythonとC言語を組み合わせたりすることに。
ということで、早速、2.1(帰納学習)のPythonによるシミュレーションを書いてみる。
コード
Python 3
#!/usr/bin/env python3 import random import sys if len(sys.argv) == 2: gen_max = int(sys.argv[1]) else: gen_max = 10000 def calc_score(data: list, teacher: list, answer: list) -> int: score = 0 for d, t in zip(data, teacher): point = 0 for i, n in enumerate(answer): if n == 2: point += 1 elif n == d[i]: point += 1 if point == 10 and t == 1: score += 1 elif point != 10 and t == 0: score += 1 return score data = [] teacher = [] while True: try: line = input() except EOFError: break line = line.strip() nums = [int(n) for n in line.split()] data.append(nums[:-1]) teacher.append(nums[-1]) best_score = 0 for _ in range(gen_max): answer = [random.randrange(3) for _ in range(10)] score = calc_score(data, teacher, answer) if score > best_score: best_score = score best_answer = answer print(' '.join([str(n) for n in best_answer]), f':score={best_score}') print() print('最良解') print(' '.join([str(n) for n in best_answer]), f':score={best_score}')
入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))
C:\Users\...>py learnstock.py < ldata.txt 0 0 2 0 2 2 1 2 2 0 :score=75 1 0 1 1 0 0 1 0 2 2 :score=76 0 0 0 2 1 0 2 2 2 1 :score=79 2 0 0 0 1 2 2 0 0 2 :score=80 2 1 0 2 2 1 2 1 0 2 :score=82 2 2 0 2 0 2 2 2 0 1 :score=83 2 2 0 2 2 0 2 2 0 2 :score=88 2 2 0 2 2 2 2 2 0 2 :score=100 最良解 2 2 0 2 2 2 2 2 0 2 :score=100 C:\Users\...>py learnstock.py < ldata.txt 0 1 0 0 2 2 1 0 2 1 :score=75 2 1 0 0 0 0 0 2 2 0 :score=77 1 1 2 2 0 2 1 0 0 2 :score=78 2 2 0 1 2 1 1 2 2 2 :score=80 2 2 2 2 2 0 2 0 0 1 :score=81 2 1 0 2 2 1 1 2 0 2 :score=83 2 2 0 2 1 2 1 2 0 2 :score=84 2 2 0 2 2 2 2 2 0 0 :score=86 2 2 0 2 1 2 2 2 0 2 :score=88 最良解 2 2 0 2 1 2 2 2 0 2 :score=88 C:\Users\...>py learnstock.py < ldata.txt 2 1 0 2 2 0 1 0 2 1 :score=75 2 0 1 1 1 1 1 0 0 1 :score=76 2 2 0 2 0 0 1 2 2 2 :score=77 1 2 2 1 2 1 2 1 2 0 :score=78 2 1 2 1 2 1 2 2 0 1 :score=79 2 2 0 1 0 2 2 0 2 2 :score=81 0 2 0 1 2 2 2 2 0 2 :score=83 2 2 0 2 2 2 2 0 0 1 :score=86 2 2 0 0 2 2 2 2 0 2 :score=88 最良解 2 2 0 0 2 2 2 2 0 2 :score=88 C:\Users\...>py learnstock.py < ldata.txt 2 0 0 0 1 0 0 0 1 2 :score=76 2 2 2 0 1 0 2 0 0 1 :score=78 2 2 0 2 1 2 2 1 0 0 :score=79 0 0 0 2 2 0 2 2 2 1 :score=80 1 2 0 2 2 2 2 0 2 2 :score=81 2 0 0 2 1 2 2 0 0 2 :score=82 2 2 0 2 2 2 2 1 0 2 :score=86 2 0 0 2 2 2 2 2 0 2 :score=87 2 1 0 2 2 2 2 2 0 2 :score=89 2 2 0 2 2 2 1 2 0 2 :score=92 最良解 2 2 0 2 2 2 1 2 0 2 :score=92 C:\Users\...>py learnstock.py < ldata.txt 0 0 0 0 2 2 2 1 1 2 :score=75 0 0 2 1 0 0 1 1 1 0 :score=76 2 2 0 2 2 1 1 1 2 2 :score=79 2 1 0 2 2 1 2 1 0 1 :score=80 0 2 0 1 2 2 2 2 2 1 :score=81 2 2 0 2 2 1 2 2 0 1 :score=83 2 2 0 1 2 2 1 2 0 2 :score=85 最良解 2 2 0 1 2 2 1 2 0 2 :score=85 C:\Users\...>py learnstock.py 20000 < ldata.txt 1 2 1 1 0 0 0 0 0 1 :score=76 1 1 0 1 0 0 2 2 0 2 :score=77 2 0 0 1 1 2 2 2 0 2 :score=78 0 2 0 2 1 2 1 1 0 2 :score=79 2 2 0 1 2 2 2 2 0 2 :score=88 2 2 0 2 2 2 2 2 0 1 :score=90 最良解 2 2 0 2 2 2 2 2 0 1 :score=90 C:\Users\...>py learnstock.py 50000 < ldata.txt 1 0 0 0 1 0 0 0 0 1 :score=76 2 2 2 2 2 1 1 1 0 0 :score=77 2 1 0 2 1 1 1 1 0 2 :score=80 2 2 0 2 2 1 2 2 0 1 :score=83 2 2 0 2 2 2 2 2 0 1 :score=90 2 2 0 2 2 2 1 2 0 2 :score=92 2 2 0 2 2 2 2 2 0 2 :score=100 最良解 2 2 0 2 2 2 2 2 0 2 :score=100 C:\Users\...>py learnstock.py 50000 < ldata.txt 1 2 2 1 0 0 0 1 2 0 :score=76 2 0 0 1 1 2 2 0 0 2 :score=78 2 1 0 2 0 1 2 0 0 1 :score=79 0 1 0 1 2 2 2 2 2 1 :score=80 2 0 0 2 2 2 2 0 2 1 :score=81 2 2 0 2 1 1 2 2 0 2 :score=82 2 2 0 2 2 2 2 0 0 1 :score=86 2 2 0 2 2 2 2 2 0 2 :score=100 最良解 2 2 0 2 2 2 2 2 0 2 :score=100 C:\Users\...>py learnstock.py 25000 < ldata.txt 1 2 2 1 0 1 2 2 2 0 :score=77 1 2 0 1 2 2 2 2 0 0 :score=78 2 2 0 2 2 2 1 2 0 0 :score=83 2 0 0 2 2 0 2 2 0 2 :score=84 2 1 0 2 2 2 2 2 0 2 :score=89 最良解 2 1 0 2 2 2 2 2 0 2 :score=89 C:\Users\...>
コマンドライン引数で指定できるようにして適当に解候補生成回数を変更してみたら、50000回で最高スコア100の解を発見。
今のところ、Pythonでも実行速度について問題なし。
0 コメント:
コメントを投稿