使用GMM分类器每次运行结果不同

我目前正在进行一个语音识别和机器学习相关的项目。我有两个类别,并且为每个类别创建了两个GMM分类器,分别用于标签“快乐”和“悲伤”。

我想用MFCC向量来训练GMM分类器。

我为每个标签使用了两个GMM分类器。(之前是每个文件一个GMM):

但每次运行脚本时,我得到的结果都不一样。使用相同的测试和训练样本,为什么会这样呢?

请注意,以下输出中有10个测试样本,每行对应有序测试样本的结果

代码:

classifiers = {'happy':[],'sad':[]}
probability = {'happy':0,'sad':0}
def createGMMClassifiers():
    for name, data in training.iteritems():
        #对于每个类别:在我们的案例中是两个,快乐和悲伤
        classifier = mixture.GMM(n_components = n_classes,n_iter=50)
        #两个分类器。
        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.808941585happy
happy  321.17737915 sad  318.621788517happy
happy  465.294473363 sad  461.609246112happy
happy  647.771003768 sad  640.451097035happy
happy  792.420461416 sad  778.709674995happy
happy  976.09526992 sad  961.337361541happy
happy  1137.83592093 sad  1121.34722203happy
happy  1297.14692405 sad  1278.51011583happy
happy  1447.26926553 sad  1425.74595666happy
happy  1593.00403707 sad  1569.85670672happy

样本输出2:

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

回答:

但每次运行脚本时,我得到的结果都不一样。使用相同的测试和训练样本,为什么会这样呢?

scikit-learn使用随机初始化器。如果你想要可重复的结果,你可以设置random_state参数

random_state: RandomState或一个整数种子(默认None)

for name, data in training.iteritems():

这是不正确的,因为你只在最后一个样本上进行训练。你需要将每个标签的特征连接成一个数组,然后再运行fit。你可以使用np.concatenate来实现这一点。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注