字典學習 # (DictionaryLearning)

class sklearn.decomposition.DictionaryLearning(n_components=None, *, alpha=1, max_iter=1000, tol=1e-08, fit_algorithm='lars', transform_algorithm='omp', transform_n_nonzero_coefs=None, transform_alpha=None, n_jobs=None, code_init=None, dict_init=None, callback=None, verbose=False, split_sign=False, random_state=None, positive_code=False, positive_dict=False, transform_max_iter=1000)[source]#

字典學習。

尋找一個字典(一組原子),使其能夠有效地稀疏編碼擬合的資料。

解決以下最佳化問題

(U^*,V^*) = argmin 0.5 || X - U V ||_Fro^2 + alpha * || U ||_1,1
            (U,V)
            with || V_k ||_2 <= 1 for all  0 <= k < n_components

||.||_Fro 代表 Frobenius 範數,而 ||.||_1,1 代表逐元素的矩陣範數,它是矩陣中所有元素的絕對值之總和。

請參閱使用者指南以了解更多資訊。

參數:
n_componentsint,預設值=None

要提取的字典元素數量。如果為 None,則 n_components 會設定為 n_features

alphafloat,預設值=1.0

控制稀疏性的參數。

max_iterint,預設值=1000

要執行的最大迭代次數。

tolfloat,預設值=1e-8

數值誤差的容忍度。

fit_algorithm{‘lars’, ‘cd’},預設值=’lars’
  • 'lars':使用最小角度迴歸法來解決 lasso 問題 (lars_path);

  • 'cd':使用座標下降法來計算 Lasso 解 (Lasso)。如果估計的組件是稀疏的,Lars 會更快。

在 0.17 版本中新增: cd 座標下降法以提高速度。

transform_algorithm{‘lasso_lars’, ‘lasso_cd’, ‘lars’, ‘omp’, ‘threshold’},預設值=’omp’

用於轉換資料的演算法

  • 'lars':使用最小角度迴歸法 (lars_path);

  • 'lasso_lars':使用 Lars 來計算 Lasso 解。

  • 'lasso_cd':使用座標下降法來計算 Lasso 解 (Lasso)。如果估計的組件是稀疏的,'lasso_lars' 會更快。

  • 'omp':使用正交匹配追蹤法來估計稀疏解。

  • 'threshold':將投影 dictionary * X' 中所有小於 alpha 的係數壓縮為零。

在 0.17 版本中新增: lasso_cd 座標下降法以提高速度。

transform_n_nonzero_coefsint,預設值=None

在解的每一列中要鎖定的非零係數數量。這僅用於 algorithm='lars'algorithm='omp'。如果為 None,則 transform_n_nonzero_coefs=int(n_features / 10)

transform_alphafloat,預設值=None

如果 algorithm='lasso_lars'algorithm='lasso_cd',則 alpha 是應用於 L1 範數的懲罰。如果 algorithm='threshold',則 alpha 是係數將被壓縮為零的絕對值閾值。如果為 None,則預設為 alpha

在 1.2 版本中變更: 當為 None 時,預設值從 1.0 變更為 alpha

n_jobsint 或 None,預設值=None

要執行的平行任務數量。 None 表示 1,除非在 joblib.parallel_backend 環境中。 -1 表示使用所有處理器。 詳情請參閱詞彙表

code_init形狀為 (n_samples, n_components) 的 ndarray,預設為 None

用於熱啟動的代碼初始值。僅當 code_initdict_init 均不為 None 時才會使用。

dict_init形狀為 (n_components, n_features) 的 ndarray,預設為 None

用於熱啟動的字典初始值。僅當 code_initdict_init 均不為 None 時才會使用。

callback可呼叫物件,預設為 None

每五次迭代會調用的可呼叫物件。

在 1.3 版本中新增。

verbose布林值,預設為 False

控制程序的詳細程度。

split_sign布林值,預設為 False

是否將稀疏特徵向量分割為其負部分和正部分的串聯。這可以提高下游分類器的效能。

random_state整數、RandomState 實例或 None,預設為 None

當未指定 dict_init 時,用於初始化字典;當 shuffle 設定為 True 時,用於隨機打亂資料;以及用於更新字典。傳遞一個整數以在多個函式呼叫中獲得可重複的結果。請參閱詞彙表

positive_code布林值,預設為 False

在尋找代碼時是否強制執行正值。

在 0.20 版本中新增。

positive_dict布林值,預設為 False

在尋找字典時是否強制執行正值。

在 0.20 版本中新增。

transform_max_iter整數,預設為 1000

如果 algorithm='lasso_cd''lasso_lars',則執行的最大迭代次數。

在 0.22 版本中新增。

屬性:
components_形狀為 (n_components, n_features) 的 ndarray

從資料中提取的字典原子

error_陣列

每次迭代的誤差向量

n_features_in_整數

擬合期間看到的特徵數量。

在 0.24 版本中新增。

feature_names_in_形狀為 (n_features_in_,) 的 ndarray

擬合期間看到的特徵名稱。僅當 X 具有全為字串的特徵名稱時才定義。

在 1.0 版本中新增。

n_iter_整數

執行的迭代次數。

另請參閱

MiniBatchDictionaryLearning

一種更快、但精確度較低的字典學習演算法版本。

MiniBatchSparsePCA

小批量稀疏主成分分析。

SparseCoder

從固定的預先計算的字典中尋找資料的稀疏表示。

SparsePCA

稀疏主成分分析。

參考文獻

J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009: 線上稀疏編碼字典學習 (https://www.di.ens.fr/~fbach/mairal_icml09.pdf)

範例

>>> import numpy as np
>>> from sklearn.datasets import make_sparse_coded_signal
>>> from sklearn.decomposition import DictionaryLearning
>>> X, dictionary, code = make_sparse_coded_signal(
...     n_samples=30, n_components=15, n_features=20, n_nonzero_coefs=10,
...     random_state=42,
... )
>>> dict_learner = DictionaryLearning(
...     n_components=15, transform_algorithm='lasso_lars', transform_alpha=0.1,
...     random_state=42,
... )
>>> X_transformed = dict_learner.fit(X).transform(X)

我們可以檢查 X_transformed 的稀疏程度

>>> np.mean(X_transformed == 0)
np.float64(0.52...)

我們可以比較稀疏編碼訊號的重建誤差的平均平方歐幾里得範數與原始訊號的平方歐幾里得範數的關係

>>> X_hat = X_transformed @ dict_learner.components_
>>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1))
np.float64(0.05...)
fit(X, y=None)[原始碼]#

從 X 中的資料擬合模型。

參數:
X類陣列,形狀為 (n_samples, n_features)

訓練向量,其中 n_samples 是樣本數,而 n_features 是特徵數。

y已忽略

未使用,為符合 API 一致性而依慣例存在。

回傳值:
self物件

回傳實例本身。

fit_transform(X, y=None)[原始碼]#

從 X 中的資料擬合模型並回傳轉換後的資料。

參數:
X類陣列,形狀為 (n_samples, n_features)

訓練向量,其中 n_samples 是樣本數,而 n_features 是特徵數。

y已忽略

未使用,為符合 API 一致性而依慣例存在。

回傳值:
V形狀為 (n_samples, n_components) 的 ndarray

已轉換的資料。

get_feature_names_out(input_features=None)[原始碼]#

取得轉換的輸出特徵名稱。

輸出特徵名稱將以小寫的類別名稱作為前綴。例如,如果轉換器輸出 3 個特徵,則輸出特徵名稱為:["class_name0", "class_name1", "class_name2"]

參數:
input_features字串或 None 的類陣列,預設為 None

僅用於驗證特徵名稱是否與 fit 中看到的名稱一致。

回傳值:
feature_names_out字串物件的 ndarray

已轉換的特徵名稱。

get_metadata_routing()[原始碼]#

取得此物件的中繼資料路由。

請查看 使用者指南,了解路由機制如何運作。

回傳值:
routingMetadataRequest

一個封裝路由資訊的 MetadataRequest

get_params(deep=True)[原始碼]#

取得此估算器的參數。

參數:
deepbool,預設值為 True

如果為 True,將會回傳此估算器及其包含的子物件(也是估算器)的參數。

回傳值:
paramsdict

參數名稱對應到其值的字典。

set_output(*, transform=None)[原始碼]#

設定輸出容器。

請參考 介紹 set_output API 以取得如何使用此 API 的範例。

參數:
transform{“default”, “pandas”, “polars”}, 預設值為 None

設定 transformfit_transform 的輸出。

  • "default":轉換器的預設輸出格式

  • "pandas":DataFrame 輸出

  • "polars":Polars 輸出

  • None:轉換設定不變

1.4 版本新增:新增了 "polars" 選項。

回傳值:
self估算器實例

估算器實例。

set_params(**params)[原始碼]#

設定此估算器的參數。

此方法適用於簡單的估算器以及巢狀物件(例如 Pipeline)。後者的參數形式為 <component>__<parameter>,因此可以更新巢狀物件的每個元件。

參數:
**paramsdict

估算器參數。

回傳值:
self估算器實例

估算器實例。

transform(X)[原始碼]#

將資料編碼為字典原子(dictionary atoms)的稀疏組合。

編碼方法由物件參數 transform_algorithm 決定。

參數:
X形狀為 (n_samples, n_features) 的 ndarray

要轉換的測試資料,其特徵數量必須與用於訓練模型的資料相同。

回傳值:
X_new形狀為 (n_samples, n_components) 的 ndarray

已轉換的資料。