Python:list迭代只返回最后一个值



我正在使用scikit learn进行GMM训练,并试图通过在整数列表上循环来改变混合成分的数量。但当我打印我得到的模型时,我只得到那些有3种混合物成分的模型,或者我在列表中最后一项的模型。

这是我的代码:

from sklearn.mixture import GMM
class_names = ['name1','name2','name3']
covs =  ['spherical', 'diagonal', 'tied', 'full']
num_comp = [1,2,3]
models = {}
for c in class_names:
    models[c] = dict((covar_type,GMM(n_components=num,
                covariance_type=covar_type, init_params='wmc',n_init=1, n_iter=10)) for covar_type in covs for num in num_comp)
print models

有人能帮忙吗?非常感谢!

这是因为在表达式中:

dict((covar_type,GMM(n_components=num,
                covariance_type=covar_type, init_params='wmc',n_init=1, n_iter=10)) for covar_type in covs for num in num_comp)

在所有迭代中使用相同的covar_type作为关键字,从而重写相同的元素。

如果我们以更可读的方式编写代码,这就是它正在发生的事情:

data = dict()
for covar_type in covs:
    for num in num_comp:
        # covar_type is the same for all iterations of this loop
        # hence only the last one "survives"
        data[covar_type] = GMM(...)

如果要保留所有值,则应使用值列表,而不是单个值更改键。

对于值列表:

data = dict()
for covar_type in covs:
    data[covar_type] = values = []
    for num in num_comp:
        values.append(GMM(...))

对于不同的密钥:

data = dict()
for covar_type in covs:
    for num in num_comp:
        data[(covar_type, num)] = GMM(...)

相关内容

  • 没有找到相关文章

最新更新