2015-12-14 2 views
0

Я использую cPickle для хранения словаря, элементы которого являются объектами кластеризации от sklearn.cluster, которые делают k-mean кластеризация. Словарь, который я получаю, когда распечатывается, выглядит хорошо и, похоже, работает. Однако, когда я сравниваю его для равенства с входным словарем, он оценивается как False.Тестирование незаполненного словаря в Python

amino_acid = 'ILE' 
clusterers = {'2 ILE_chi1': MiniBatchKMeans(...), 
       '2 ILE_chi2': MiniBatchKMeans(...)} 
output = open(''.join([amino_acid, '.pkl']), 'wb') 
cPickle.dump(clusterers, output, -1) 
output.close() 
# Test that we can unpickle it. 
input = open(''.join([amino_acid, '.pkl']), 'rb') 
unpickled = cPickle.load(input) 
print type(unpickled) 
if clusterers == unpickled: 
    print "Pickled successfully." 
    print clusterers 
else: 
    print "Didn't pickle." 
    print unpickled 
    print clusterers 
    print type(unpickled['2 ILE_chi1']) 
    print unpickled.keys() == clusterers.keys() 
    print unpickled.values() == clusterers.values() 
input.close() 

Соответствующий выход:

Didn't pickle. 
{'2 ILE_chi1': MiniBatchKMeans(...), '2 ILE_chi2': MiniBatchKMeans(...)} 
{'2 ILE_chi1': MiniBatchKMeans(...), '2 ILE_chi2': MiniBatchKMeans(...)} 
<class 'sklearn.cluster.k_means_.MiniBatchKMeans'> 
True 
False 

Кто-нибудь знает, почему MiniBatchKMeans случаи не равны? relevant page не очень помогает в этом вопросе. Я могу взглянуть на источник sklearn, но он наследуется от нескольких классов, и я задавался вопросом, может ли кто-то здесь объяснить это быстрее.

+0

Что произойдет, если вы сравните их, просто произнесите «unpickled == clusterers»? Ключи и их значения могут быть возвращены в любом порядке, поэтому их сложно сравнивать с помощью этих двух методов. – nofinator

+0

Извините, я включил это в первую итерацию. Они не сравниваются одинаково. Я думаю, что моя проблема может заключаться в том, что предложил Том Далтон ниже. –

ответ

3

объекты не считаются равными, если кто-то явно не добавляет экв (или аналогичные) методы на них:

>>> class A(object): 
...  def __init__(self, thing): 
...   self.thing = thing 

>>> b = A(1) 
>>> c = A(1) 
>>> b == c 
False 

Если вы создаете 2 копии одного и того же (MiniBatchKMeans в данном случае), без засолки их, сравнивают ли они равные? Если это так, вы можете поднять ошибку с помощью scikit. Если нет, тогда вам может понадобиться поднять запрос функции с помощью scikit!

+0

Да, ты прав. Копия, сгенерированная с помощью 'copy.deepcopy', не оценивается как равная. Я могу поднять запрос функции, но я не уверен, что существует много прецедентов за пределами «Я параноик, и это некоторые из моих данных PhD». Я соглашусь, когда SO позволит мне (через 3 минуты ...). –

+0

Я не просто повторил алгоритм, если может быть какая-то стохастичность. –

+0

Звучит как полезная функция в любом случае! удачи –

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