我正在使用 scikit-learn 进行 GMM 培训,并试图改变混合组件的数量。我遇到了问题,已修复 here

我最终得到了这个代码:

from sklearn.mixture import GMM

class_names = ['name1','name2','name3']
covs =  ['spherical', 'diagonal', 'tied', 'full']
num_comp = [1,2,3]
models = dict()

for c in class_names:
    for cov in covs:
        models[c,cov] = values = []
        for num in num_comp:
            values.append(GMM(n_components=num,covariance_type=cov, init_params='wmc',n_init=1, n_iter=10))
print models

我稍后再次使用模型 dict() 并且遇到问题,因为我不知道如何使用 dict。
training_data={'name1':'path2data1', 'name2': path2data2, 'name3': path2data3}

for cov in covs:
    for c in class_names:
        for num in num_comp:
            models[c][cov].fit(training_data[c])

我收到错误“KeyError:'name1'”

我也试过 models[c,cov].fit(training_data[c]) 但后来我得到错误“AttributeError: 'list' object has no attribute 'fit'”

提前感谢您的任何提示!

最佳答案

在这里,您通过元组为 dict 赋值( c, cov 等效于 (c, cov) ):

models[c,cov] = values = []

因此,在这里您应该通过元组访问 dict 值:
for cov in covs:
    for c in class_names:
        for num in num_comp:
            models[(c, cov)].fit(training_data[c])
AttributeError 抛出,因为您实际上访问了列表:models[(c,cov)] 是您之前创建的列表 (values)

更新评论,试试这个:
for c in class_names:
    models[c] = {}
    for cov in covs:
        models[c][cov] = values = []
        for num in num_comp:
            values.append(GMM(n_components=num,covariance_type=cov, init_params='wmc',n_init=1, n_iter=10))

但在这里你会在 list 中得到 models[c][cov] 并且应该迭代它:
for cov in covs:
    for c in class_names:
        for num in num_comp:
            for f in models[c][cov]
                f.fit(training_data[c])

关于Python:关键错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20400523/

10-09 04:02