我正在使用GMM
中的sklearn
工具包构建基本的说话人识别器。我有3个班级,每个班级我都有一个分类器。在测试阶段,应选择概率最高的说话人GMM
,程序应返回每个测试样本的预测类。我想改变混合组件的数量,并在此示例代码中设置n_components=4
。
如果我使用4个混合成分,我的分类器的输出将是0,1,2或3.如果我使用3个混合成分,它将是0,1或2.我感觉分类器返回预测的混合成分而不是整个GMM。但我希望它能预测班级:1,2或3。
这是我的代码:
import numpy as np
from sklearn.mixture import GMM
#set path
path="path"
class_names = [1,2,3]
covs = ['spherical', 'diag', 'tied', 'full']
training_data = {1: np.loadtxt(path+"/01_train_debug.data"), 2: np.loadtxt(path+"/02_train_debug.data"), 3: np.loadtxt(path+"/03_train_debug.data")}
print "Training models"
models = {}
for c in class_names:
# make a GMM for each of the classes in class_names
models[c] = dict((covar_type,GMM(n_components=4,
covariance_type=covar_type, init_params='wmc',n_init=1, n_iter=20))
for covar_type in covs)
for cov in covs:
for c in class_names:
models[c][cov].fit(training_data[c])
#define test set
test01 = np.loadtxt(path+"/01_test_debug.data")
test02 = np.loadtxt(path+"/02_test_debug.data")
test03 = np.loadtxt(path+"/03_test_debug.data")
testing_data = {1: test01, 2: test02, 3: test03}
probs = {}
print "Calculating Probabilities"
for c in class_names:
probs[c] = {}
for cov in covs:
probs[c][cov] = {}
for p in class_names:
probs[c][cov] = models[p][cov].predict(testing_data[c])
for c in class_names:
print c
for cov in covs:
print " ",cov,
for p in class_names:
print p, probs,
print
我的假设是否正确,或者我的代码中是否存在逻辑错误? 有没有办法在sklearn中解决这个问题? 在此先感谢您的帮助!
答案 0 :(得分:3)
在您的代码中,第一次我误读了您的代码,抱歉。models
dict的键是协方差类型,第二次键是类名。
修改:如果您希望在拟合的GMM模型下获得数据的每样本可能性,则应使用score_samples
方法。 predict
方法不会返回概率,而是返回组件分配。
默认情况下,GMM也是非监督模式。如果你想用一堆GMM模型构建一个监督模型,你应该把它包装成一个估算器类来包装它们并实现fit / predict API,以便能够通过交叉验证来估计它的准确性并调整超参数值通过网格搜索。 Pull request #2468正在实施这样的事情。它可以及时合并到下一个scikit-learn版本中(0.15应该在2014年初发布)。