2019年8月5日月曜日

開発環境

はじめての機械学習 (小高知宏(著)、オーム社)の第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 コメント:

コメントを投稿