【问题标题】:Testing unpickled dictionary in Python在 Python 中测试未腌制的字典
【发布时间】:2015-12-14 18:30:14
【问题描述】:

我正在使用cPickle 存储一个字典,其项目是来自sklearn.cluster 的聚类对象,这些对象进行k-means 聚类。我在拆解时得到的字典看起来很好,而且似乎可以工作。但是,当我将它与输入字典进行比较时,它的计算结果为 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 实例不相等吗? relevant page 在这个特定问题上不是很有帮助。我可以看一下sklearn 源,但它继承自多个类,我想知道这里是否有人能够更快地解释。

【问题讨论】:

  • 如果你通过简单地说unpickled == clusterers来比较它们会发生什么?它们的键和值可以按任何顺序返回,因此很难使用这两种方法进行比较。
  • 对不起,我在第一次迭代中包含了它。他们不比较平等。我认为我的问题可能是 Tom Dalton 在下面提出的建议。

标签: python scikit-learn pickle


【解决方案1】:

除非有人明确地在对象上添加 eq(或类似的)方法,否则对象不会比较相等:

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

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

如果您创建相同事物的 2 个副本(在本例中为 MiniBatchKMeans),而不对它们进行酸洗,它们比较是否相等?如果是这样,那么您可能想用 scikit 提出一个错误。如果没有,那么您可能想使用 scikit 提出功能请求!

【讨论】:

  • 是的,你是对的。使用copy.deepcopy 生成的副本不会评估为相等。我可能会提出功能请求,但我不确定除了“我很偏执,这是我的一些博士数据”之外还有很多用例。当 SO 允许时,我会接受(在 3 分钟内......)。
  • 我不只是重新运行算法,以防可能存在一些随机性。
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2018-08-18
  • 2018-03-12
  • 2011-05-04
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
相关资源
最近更新 更多