我正在使用cPickle
来存储一个字典,该字典的项是对来自sklearn.cluster
的进行k均值聚类的对象进行聚类。我拆开字典时得到的那本字典看起来很好,似乎很管用。然而,当我将它与输入字典进行相等性比较时,它的计算结果为False
。
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
实例不相等吗?相关页面对这件事没有太大帮助。我可以看看sklearn
源代码,但它继承了多个类,我想知道这里的人是否能够更快地解释。
除非有人在对象上显式添加eq(或类似)方法,否则对象的比较不会相等:
>>> class A(object):
... def __init__(self, thing):
... self.thing = thing
>>> b = A(1)
>>> c = A(1)
>>> b == c
False
如果您创建了同一事物的两个副本(本例中为MiniBatchKMeans),而没有对它们进行酸洗,那么它们的比较是否相等?如果是这样的话,那么你可能想用scikit来引发一个bug。如果没有,那么您可能想向scikit提出功能请求!