字典学习#

sklearn.decomposition.dict_learning(X, n_components, *, alpha, max_iter=100, tol=1e-08, method='lars', n_jobs=None, dict_init=None, code_init=None, callback=None, verbose=False, random_state=None, return_n_iter=False, positive_dict=False, positive_code=False, method_max_iter=1000)[source]#

求解字典学习矩阵分解问题。

通过求解以下问题,找到用于逼近数据矩阵 X 的最佳字典及其对应的稀疏代码:

(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

其中 V 是字典,U 是稀疏编码。||.||_Fro 表示 Frobenius 范数,||.||_1,1 表示逐元素矩阵范数,即矩阵中所有元素绝对值之和。

更多详情请参见 用户指南

参数:
X形状为 (n_samples, n_features) 的类数组

数据矩阵。

n_componentsint

要提取的字典原子数量。

alphaint 或 float

稀疏性控制参数。

max_iterint,默认为 100

要执行的最大迭代次数。

tolfloat,默认为 1e-8

停止条件的容差。

method{'lars', 'cd'},默认为 'lars'

使用的方法

  • 'lars':使用最小角回归法求解 lasso

    问题 (linear_model.lars_path);

  • 'cd':使用坐标下降法计算 Lasso 解 (linear_model.Lasso)。如果估计的成分是稀疏的,则 Lars 会更快。

n_jobsint,默认为 None

要运行的并行作业数。None 表示除非在 joblib.parallel_backend 上下文中,否则为 1。-1 表示使用所有处理器。更多详情请参见 词汇表

dict_init形状为 (n_components, n_features) 的 ndarray,默认为 None

用于热启动场景的字典初始值。仅当 code_initdict_init 不为 None 时使用。

code_init形状为 (n_samples, n_components) 的 ndarray,默认为 None

用于热启动场景的稀疏编码初始值。仅当 code_initdict_init 不为 None 时使用。

callbackcallable,默认为 None

每五次迭代调用一次的可调用对象。

verbosebool,默认为 False

用于控制过程的详细程度。

random_stateint,RandomState 实例或 None,默认为 None

用于随机初始化字典。传递一个 int 以在多次函数调用中获得可重复的结果。参见 词汇表

return_n_iterbool,默认为 False

是否返回迭代次数。

positive_dictbool,默认为 False

查找字典时是否强制为正。

0.20 版本新增。

positive_codebool,默认为 False

查找编码时是否强制为正。

0.20 版本新增。

method_max_iterint,默认为 1000

要执行的最大迭代次数。

0.22 版本新增。

返回:
code形状为 (n_samples, n_components) 的 ndarray

矩阵分解中的稀疏编码因子。

dictionary形状为 (n_components, n_features) 的 ndarray

矩阵分解中的字典因子。

errors数组

每次迭代的误差向量。

n_iterint

运行的迭代次数。仅当 return_n_iter 设置为 True 时返回。

另请参见

dict_learning_online

在线求解字典学习矩阵分解问题。

DictionaryLearning

查找稀疏编码数据的字典。

MiniBatchDictionaryLearning

字典学习算法的一种更快但精度较低的版本。

SparsePCA

稀疏主成分分析。

MiniBatchSparsePCA

小批量稀疏主成分分析。

示例

>>> import numpy as np
>>> from sklearn.datasets import make_sparse_coded_signal
>>> from sklearn.decomposition import dict_learning
>>> X, _, _ = make_sparse_coded_signal(
...     n_samples=30, n_components=15, n_features=20, n_nonzero_coefs=10,
...     random_state=42,
... )
>>> U, V, errors = dict_learning(X, n_components=15, alpha=0.1, random_state=42)

我们可以检查 U 的稀疏程度

>>> np.mean(U == 0)
np.float64(0.6...)

我们可以比较稀疏编码信号的重建误差的平均平方欧几里得范数与原始信号的平方欧几里得范数

>>> X_hat = U @ V
>>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1))
np.float64(0.01...)