開発環境
- 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 コメント:
コメントを投稿