# -*- coding: utf-8 -*- """ learnstock.pyプログラム 単純な帰納的学習の例題プログラム パターン学習器 100個の学習データを読み込んで、 適合する10桁の2進数パターンを答えます 使い方 C:\>python learnstock.py < ldata.txt """ # モジュールのインポート import math import random # グローバル変数 SETSIZE = 100 # 学習データセットの大きさ CNO = 10 # 学習データの桁数 (10桁分) GENMAX = 110000 # 解候補生成回数 SEED = 7 # 乱数のシード # 下請け関数の定義 # readdata()関数 def readdata(data, teacher): """学習データセットの読み込み""" for i in range(SETSIZE): line = input() data[i] = [int(num) for num in line.split()] teacher[i] = data[i][CNO] return # readdata()関数の終わり # calcscore()関数 def calcscore(data, teacher, answer): """解候補パターンのスコア(0~SETSIZE点)の計算""" score = 0 # スコア (0~SETSIZE点) for i in range(SETSIZE): # 一致度計算 point = 0 for j in range(CNO): if answer[j] == 2: point += 1 # ワイルドカード elif answer[j] == data[i][j]: point += 1 # 一致 # スコアの計算 if (point == CNO) and (teacher[i] == 1): score += 1 elif (point != CNO) and (teacher[i] == 0): score += 1 return score # calcscore()関数の終わり # メイン実行部 score = 0 # スコア (0~SETSIZE点) answer = [0 for i in range(CNO)] # 解候補 data = [[] for i in range(SETSIZE)] # 学習データセット teacher = [0 for i in range(SETSIZE)] # 教師データ bestscore = 0 # スコアの最高値 bestanswer = [0 for i in range(CNO)] # 探索中での最良解 # 乱数の初期化 random.seed(SEED) # 学習データセットの読み込み readdata(data, teacher) # 解候補生成と検査 for i in range(GENMAX): # 解候補生成 for j in range(CNO): answer[j] = random.randint(0, 2) # 検査 score = calcscore(data, teacher, answer) # 最良スコアの更新 if (score > bestscore): bestanswer = answer.copy() bestscore = score print(bestanswer, ":score=", bestscore) # 最良解の出力 print("最良解") print(bestanswer, ":score=", bestscore) # learnstock.pyの終わり
1 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 1 0
[1, 0, 1, 2, 0, 0, 2, 0, 1, 2] :score= 76 [2, 1, 0, 2, 0, 0, 2, 2, 2, 0] :score= 77 [0, 2, 0, 2, 1, 2, 2, 0, 0, 2] :score= 79 [2, 2, 0, 2, 0, 2, 1, 2, 0, 1] :score= 81 [1, 1, 0, 2, 2, 2, 2, 2, 0, 2] :score= 83 [2, 2, 0, 2, 2, 2, 0, 2, 0, 2] :score= 84 [2, 2, 0, 2, 2, 2, 1, 2, 0, 1] :score= 85 [2, 2, 0, 1, 2, 2, 2, 2, 0, 2] :score= 88 [2, 1, 0, 2, 2, 2, 2, 2, 0, 2] :score= 89 [2, 2, 0, 2, 2, 2, 2, 0, 0, 2] :score= 90 [2, 2, 0, 2, 2, 2, 2, 2, 0, 2] :score= 100 最良解 [2, 2, 0, 2, 2, 2, 2, 2, 0, 2] :score= 100