【问题标题】:Save (pickle) Scipy KDE保存(泡菜)Scipy KDE
【发布时间】:2018-12-05 18:10:34
【问题描述】:

如何腌制或保存 scipy kde 以供以后使用?

import scipy.stats as scs
from sklearn.externals import joblib

kde = scs.gaussian_kde(data, bw_method=.15)
joblib.dump(kde, 'test.pkl')

我在上面尝试并收到此错误:

PicklingError: Can't pickle <function gaussian_kde.set_bandwidth.<locals>.<lambda> at 0x1a5b6fb7b8>: it's not found as scipy.stats.kde.gaussian_kde.set_bandwidth.<locals>.<lambda>

【问题讨论】:

    标签: python scikit-learn scipy


    【解决方案1】:

    看起来 joblib 在使用 set_bandwith 方法时遇到了问题,我猜是因为方法中的 lambda 函数 -- pickling lambdas has been discussed here

    with open('test.pkl', 'wb') as fo:  
        joblib.dump(lambda x,y: x+y, fo)
    
    PicklingError: Can't pickle <function <lambda> at 0x7ff89495d598>: it's not found as __main__.<lambda>
    

    cloudpickledill 据我所知都可以工作:

    import cloudpickle
    import dill
    
    with open('test.cp.pkl', 'wb') as f:
        cloudpickle.dump(kde, f)  
    
    with open('test.dill.pkl', 'wb') as f:
        dill.dump(kde, f)
    
    with open('test.cp.pkl', 'rb') as f:
        kde_cp = cloudpickle.load(f)
    
    with open('test.dill.pkl', 'rb') as f:
        kde_dill = dill.load(f)
    

    检查一些数据:

    import numpy as np
    
    print(np.array_equal(kde.dataset, kde_cp.dataset))
    True
    print(np.array_equal(kde.dataset, kde_dill.dataset))
    True
    print(np.array_equal(kde_cp.dataset, kde_dill.dataset))
    True
    
    kde.pdf(10) == kde_cp.pdf(10) == kde_dill.pdf(10)
    array([ True])
    

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2012-02-22
      相关资源
      最近更新 更多