2013-12-05 3 views
0

Я использую scikit-learn для обучения GMM и пытаюсь изменить количество компонентов смеси, перейдя по списку целых чисел. Но когда я печатаю мои результирующие модели, я получаю только те, у которых есть 3 компонента смеси, или все, что я ставлю в качестве последнего элемента в моем списке.Python: list iteration возвращает только последнее значение

Это мой код:

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 

Может кто-то помочь, пожалуйста? Большое спасибо заранее!

ответ

2

Это происходит потому, что в выражении:

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(...) 
+0

Отлично, спасибо! Я выбрал последний вариант. Есть ли способ отсортировать вывод таким образом, чтобы у меня сначала были все модели для class_name 1, затем все модели для class_name 2, затем все модели для class_name 3? На данный момент это очень грязно, и трудно понять результаты. – Kaly

+0

Вы должны задать вопрос о сортировке в новом посте, поскольку он не связан с вашим исходным сообщением. –

+0

@ пользователь1372560 Пожалуйста, делайте * не * задайте вопрос об этом. Просто выполните поиск 'python dict sorting', и вы найдете десятки ответов на свой вопрос. В частности: 'dict' не сортируются *, если вы хотите отсортированный вывод, вам нужно поместить данные в список ('data = list (the_dict.items())), после чего вы хотите отсортировать данные с заданным 'ключ':' data.sort (ключ = ...) '. В вашем случае вы можете использовать 'key = lambda item: (item [0] [:: - 1], item [1])', который сортирует весь элемент сначала по количеству компонентов, затем по 'covar_type', а затем по значению. – Bakuriu

Смежные вопросы