1

私は、プログラムanimal.pyによって得られた知識を保存および取得する方法を追加しようとしています。これは、二分決定木を介して機能する「20 の質問」学習アルゴリズムです。(リンクをクリックすると元のプログラムが表示されます)

元のプログラムに、各ノードに状態「up」を追加して、決定ツリー内のノードの親を指すようにしました。これにより、ツリーを上下に移動しやすくなりました。また、正規表現を使用して英数字以外のすべてのユーザー入力をスペースに変更したため、ユーザーは次の 2 つの新しい関数を混同できません。

def know(know):
    #Load preset knowledge
    p=node("")
    knowledge=p
    for char in know:
            if char not in "+-":p.question+=char
            if char=="+":
                    p.right=node("")
                    p.right.up=p
                    p.left=node("")
                    p.left.up=p
                    p=p.right
            if char=="-": p=p.up.left
    return knowledge

def output(node,accum=""):
    #Output all knowledge
    accum=accum+node.question
    if node.right!= None : accum=output(node.right,accum+"+")
    if node.left!= None : accum=output(node.left,accum+"-")
    return accum

関数 "output" は、渡されたノードの下にある完全なツリーを単一の文字列として返すように設計されており、"+" と "-" の文字は、文字列がどのノードに続いているかを示します。関数 "know" は、"output" によって以前に作成された文字列を取得し、二分決定木を作成して、トップ ノードへのポインターを返すことになっています。これは、私が理解できないほどうまく機能していない部分です。(現在、初期知識文字列をプログラムソースに直接入力しています。ファイルのロードと保存は後で追加され、簡単な作業のようです)

例: output(know('mineral+crystal+quartz-obsidian-nothing')) 戻り値: 'mineral+crystal+quartz-obsidiannothing-'

元の文字列を返す必要があります: 'mineral+crystal+quartz-obsidian-nothing'

これは (理論的には) うまくいくと確信していますが、壁にぶち当たり、なぜうまくいかないのか本当に迷っています。

私の考えは間違っていますか、それとも単に実装しようとしているのでしょうか? 元のプログラムから作成された決定木を保存するより良い方法はありますか?

私は熱心な読者ですが、stackoverflow への投稿は初めてで、このサイトの才能に畏敬の念を抱いているので、あなたのアイデアをとても楽しみにしています。

4

2 に答える 2

0

リクエストに応じて、「guess the animal」の実装を見つけることができませんでしたが、それによって生成されたアーカイブされた pickle ファイルを見つけました。解釈できるようにするために元のアプリは必要なかったことに注意してください。

>>> import pickle
>>> with open('animal.pickle') as inf:
...     animals = pickle.load(inf)
... 
>>> import pprint
>>> pprint.pprint(animals)
['is it fuzzy',
 ['does it have a tail',
  ['is it a pack hunter',
   'dog',
   ['does it have thumbs',
    'lemur',
    ['Does it have a bushy tail',
     'chipmunk',
     ['Does it have a horn', 'rhinoceros', 'cat']]]],
  'chimp'],
 ['can it breathe air',
  ['Does it have feathers',
   'cockatoo',
   ['Does it have 8 legs', 'spider', 'iguana']],
  'catfish']]

このネストされたリストとしてのツリーを作成するプログラムの実装は、読者の課題として残されています。私の記憶では、質問にリンクされているものとほぼ同じ長さと一般的なアプローチであり、リスト操作に慣れることができます。

于 2013-05-03T11:31:53.763 に答える
0

pickle モジュールは、複雑な構造をシリアライズおよびアンシリアライズできます。これは次のように簡単です。

with open('animal.dat', 'w') as outf:
    pickle.dump(knowledge, outf)

with open('animal.dat', 'r') as inf:
    knowledge = pickle.load(inf)

「電池が入っている」と言うように、標準ライブラリを学習すれば難しいことも簡単に飛ばすことができます。

于 2013-05-03T10:42:18.007 に答える