開発環境
- macOS Mojave - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Python 3.7 (プログラミング言語)
はじめての機械学習 (小高知宏(著)、オーム社)の第4章(教示学習)、4.2(教示学習に基づくデータ分類システムの構成)、4.2.2(分類知識の機械学習プログラム)をC言語ではなくPythonで取り組んでみる。
コード
Python 3
#!/usr/bin/env python3 import sys import random from typing import List ATTR_NO = 4 TERM_NO = 3 MIN_VAL = 0.7 def get_formula() -> List[List[int]]: return [[random.randrange(2) for _ in range(ATTR_NO * 2)] for _ in range(TERM_NO)] def eval_formula(formula: List[List[int]], dataset: List[List[int]]) -> float: point = sum([eval_score(formula, subset) for subset in dataset]) return point / len(dataset) def eval_score(formula: List[List[int]], subset: List[int]) -> int: and_val = 1 for formula_row in formula: or_val = 0 for j, formula_col in enumerate(formula_row): if j % 2 == 0: or_val += subset[j // 2] * formula_col else: or_val += not_val(subset[j // 2]) * formula_col if or_val == 0: and_val = 0 else: and_val *= 1 if and_val == subset[ATTR_NO]: return 1 return 0 def not_val(val: int) -> int: if val == 0: return 1 return 0 dataset = [[int(s) for s in line.split()] for line in sys.stdin.readlines()] for _ in range(1000): formula = get_formula() score = eval_formula(formula, dataset) if score > MIN_VAL: print(f'スコア: {score}') for row in formula: for col in row: print(f'{col} ', end='') print() print()
入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))
$ ./eml.py < ex.txt スコア: 0.8 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 スコア: 0.8 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 スコア: 0.8 0 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 スコア: 0.8 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 スコア: 1.0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 スコア: 0.9 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 1 1 0 $ ./eml.py < ex.txt スコア: 0.9 0 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 スコア: 0.8 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 スコア: 0.8 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 スコア: 0.8 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 スコア: 0.8 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 1 0 スコア: 0.9 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 スコア: 0.8 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0 スコア: 0.8 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 スコア: 0.8 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 スコア: 0.8 0 1 0 1 1 0 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 $
0 コメント:
コメントを投稿