2016-06-25 4 views
0

私は現在、音声認識と機械学習に関連するプロジェクトを行っています。 私は今、2つのクラスを持っており、それぞれのクラスに対して2つのGMMクラシファイアを作成します。ラベルは「happy」と「sad」GMMクラシファイアで実行するたびに異なる結果が出る

MFCCベクトルでGMM分類子を訓練します。

私はラベルごとに2つのGMM分類子を使用しています。 (これまではファイルごとにGMMが使用されていました)

しかし、私はスクリプトを実行するたびに別の結果が出ています。 同じテストとトレーンのサンプルでは、​​その原因は何でしょうか?

classifiers = {'happy':[],'sad':[]} 
probability = {'happy':0,'sad':0} 

def createGMMClassifiers(): 
    for name, data in training.iteritems(): 
     #For every class: In our case it is two, happy and sad 
     classifier = mixture.GMM(n_components = n_classes,n_iter=50) 
     #two classifiers. 
     for mfcc in data: 
      classifier.fit(mfcc) 
     addClassifier(name, classifier) 
    for testData in testing['happy']: 
     classify(testData) 

def addClassifier(name,classifier): 
    classifiers[name]=classifier 

def classify(testMFCC): 
    for name, classifier in classifiers.iteritems(): 
     prediction = classifier.predict_proba(testMFCC) 
     for f, s in prediction: 
      probability[name]+=f 
    print 'happy ',probability['happy'],'sad ',probability['sad'] 

サンプル出力1:

happy 154.300420496 sad 152.808941585 
happy 
happy 321.17737915 sad 318.621788517 
happy 
happy 465.294473363 sad 461.609246112 
happy 
happy 647.771003768 sad 640.451097035 
happy 
happy 792.420461416 sad 778.709674995 
happy 
happy 976.09526992 sad 961.337361541 
happy 
happy 1137.83592093 sad 1121.34722203 
happy 
happy 1297.14692405 sad 1278.51011583 
happy 
happy 1447.26926553 sad 1425.74595666 
happy 
happy 1593.00403707 sad 1569.85670672 
happy 
Iは各ラインは、順序付けられたテストサンプル

コードの結果に対応する10個の試験サンプルと を持っていることを注意してください以下の出力で

サンプル出力2:

happy 51.699579504 sad 152.808941585 
sad 
happy 81.8226208497 sad 318.621788517 
sad 
happy 134.705526637 sad 461.609246112 
sad 
happy 167.228996232 sad 640.451097035 
sad 
happy 219.579538584 sad 778.709674995 
sad 
happy 248.90473008 sad 961.337361541 
sad 
happy 301.164079068 sad 1121.34722203 
sad 
happy 334.853075952 sad 1278.51011583 
sad 
happy 378.730734469 sad 1425.74595666 
sad 
happy 443.995962929 sad 1569.85670672 
sad 

答えて

1

しかし、私はスクリプトを実行するたびに異なる結果が出ています。どのようなテストと電車のサンプルでそれの原因かもしれない?

scikit-learnはランダムイニシャライザを使用します。あなたが再現可能な結果を​​したい場合は、名前のためにrandom_state argument

random_state: RandomState or an int seed (None by default) 

を設定することができ、training.iteritemsのデータ():あなたが最後のサンプルにのみ訓練以来

これは正しくありません。フィットを実行する前に、ラベルごとの機能を1つの配列に連結する必要があります。これにはnp.concatenateを使用できます。

+0

まず、訂正と解説をいただきありがとうございます。 私はデータサイズを大幅に増やしましたが、スクリプトを実行するたびに異なる結果が得られました。時には20%の精度が得られることもありますが、テストデータによるこの問題は80%です。 また、予測結果は2つのクラスを持つ[x y]を持つ配列を返します。つまり、値XはGMMがそのラベルで訓練される確率を表しますか?私はすべてのscikitのドキュメントを読んだが、答えを見つけることができなかった。 最後に、GMM分類結果の大半を最終結果として選択する必要がありますが、何をお勧めしますか? – Ugur

+0

あなたは一度にあまりにも多くの質問をして、一緒にすべてをまとめているわけではなく、ひとつずつ別々に質問してみてください。可能な限り多くの情報を質問に提供する。完全なコードまたはその一部ではなく、完全なコードの説明を提供してください。何をしているのかが明確になります。私はまた、あなたが別々に各ファイルからGMMを訓練しているのを見て、これはよく考えられる良い考えではありません。一度にすべてのファイルに対してGMMをトレーニングする必要があります。アルゴリズムを確認する必要があります。 –

+0

私はアルゴリズムを改訂し、GMMあたりのファイルではなく2つの異なるクラスに対してGMMを作成しました。私が言及したように、私がスクリプトを実行するたびに、私は別の結果を得る。 私は質問とコードと出力を編集しました。 – Ugur

関連する問題