2014-10-17 113 views
1

我正在玩scikit-learn庫的詞典學習,我想根據一系列圖像構建詞典。我試圖使用MiniBatchDictionaryLearningpartial_fit方法,並且發現它比fit花費更長的時間。我的代碼看起來(與莉娜爲例):爲什麼「partial_fit」方法比「fit」方法花費的時間要長很多

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_fitfit ...它需要幾秒鐘。

(我有scikit-learn 15.2)

這是爲什麼?

回答

0

這很可能是由於partial_fit打算在小批量數據上調用。

方法fit實際上與partial_fit的做法相同 - 它稱爲在線字典學習功能。區別在於fit使用在構建對象時指定的批處理大小,默認情況下爲3,而partial_fit適用於您提供的全部數據(並且如果提供的樣本太多,則這可能需要很長時間,partial_fit不適用於那)。

Here是函數,所以你可以看看會發生什麼。

+0

然後我改變了這個批量大小,但這沒有幫助。 – Ojtwist 2014-10-17 12:08:48

+0

它不會 - 'partial_fit'總是使用整個數據,因爲它認爲它是一個批處理。 – eickenberg 2014-10-17 12:20:48

+0

你可以做的是循環你的數據中的小批量,例如(0,len(data),3):dico.partial_fit(data [i:i + 3])' – eickenberg 2014-10-17 12:22:23

相關問題