【问题标题】:Why does the "partial_fit" method take much longer than the "fit" method为什么“partial_fit”方法比“fit”方法花费的时间长得多
【发布时间】:2014-10-17 10:09:03
【问题描述】:

我正在研究 scikit-learn 库的字典学习,我想根据一系列图像构建字典。我尝试使用MiniBatchDictionaryLearningpartial_fit 方法,发现它比fit 需要更长的时间。我的代码看起来如何(以 lena 为例):

import numpy as np
from scipy.misc import lena
from sklearn.decomposition import MiniBatchDictionaryLearning
from sklearn.feature_extraction.image import extract_patches_2d

lena = lena()
lena = lena[::2, ::2] + lena[1::2, ::2] + lena[::2, 1::2] + lena[1::2, 1::2]
height, width = lena.shape

patch_size = (7, 7)
data = extract_patches_2d(lena, patch_size)
data = data.reshape(data.shape[0], -1)
dico = MiniBatchDictionaryLearning(n_components=100, n_iter=500,transform_algorithm ='lars', alpha=1,transform_n_nonzero_coefs=5,verbose=1)
dicObj = dico.partial_fit(data)

这需要很长时间才能完成,而如果我将 partial_fit 替换为 fit ... 需要几秒钟。

(我有 scikit-learn 15.2)

这是为什么?

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    这很可能是因为 partial_fit 旨在针对小批量数据调用。

    fit 方法实际上和partial_fit 做的一样——它调用了一个在线字典学习函数。不同之处在于fit 使用对象构造时指示的批量大小,默认情况下为 3,而partial_fit 处理您提供的完整数据(如果您提供太多样本,这可能需要很长时间。@ 987654327@ 不是为此而设计的)。

    Here 是函数,所以你可以看看发生了什么。

    【讨论】:

    • 我当时改变了这个批量大小,但这没有帮助。
    • 它不会 -- partial_fit 总是使用整个数据,因为它认为它是一批。
    • 你可以做的是循环数据中的小批量,例如for i in xrange(0, len(data), 3): dico.partial_fit(data[i:i + 3])
    • (但是,在这种情况下,您显然应该更喜欢fit
    • 似乎您的循环解决方案仍然远慢于适合。我想知道这是为什么。 “在那种情况下更适合”是什么意思?在您的循环示例中?我似乎无法理解这一点。
    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 2013-05-22
    • 2020-09-07
    • 1970-01-01
    • 2014-08-08
    • 2017-06-03
    • 1970-01-01
    • 2020-01-05
    相关资源
    最近更新 更多