2019年5月28日火曜日

読書環境

開発環境

機械学習と深層学習 ―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 コメント:

コメントを投稿