dict_learning#
- 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_components整型
要提取的字典原子数量。
- alpha整型或浮点型
稀疏度控制参数。
- max_iter整型, 默认值=100
要执行的最大迭代次数。
- tol浮点型, 默认值=1e-8
停止条件的容差。
- method{‘lars’, ‘cd’}, 默认值=’lars’
使用的方法
'lars'
: 使用最小角回归方法求解 lasso问题 (
linear_model.lars_path
);
'cd'
: 使用坐标下降法计算 Lasso 解 (linear_model.Lasso
)。如果估计的成分稀疏,Lars 将更快。
- n_jobs整型, 默认值=None
要运行的并行作业数。
None
表示 1,除非在joblib.parallel_backend
上下文中。-1
表示使用所有处理器。更多详细信息请参阅术语表。- dict_init形状为 (n_components, n_features) 的 ndarray, 默认值=None
用于热启动场景的字典初始值。仅当
code_init
和dict_init
不为 None 时使用。- code_init形状为 (n_samples, n_components) 的 ndarray, 默认值=None
用于热启动场景的稀疏编码初始值。仅当
code_init
和dict_init
不为 None 时使用。- callback可调用对象, 默认值=None
每五次迭代调用一次的可调用对象。
- verbose布尔型, 默认值=False
用于控制过程的详细程度。
- random_state整型, RandomState 实例或 None, 默认值=None
用于随机初始化字典。传入一个整型值可确保多次函数调用获得可重现的结果。更多详细信息请参阅术语表。
- return_n_iter布尔型, 默认值=False
是否返回迭代次数。
- positive_dict布尔型, 默认值=False
在查找字典时是否强制为正。
0.20 版本新增。
- positive_code布尔型, 默认值=False
在查找代码时是否强制为正。
0.20 版本新增。
- method_max_iter整型, 默认值=1000
要执行的最大迭代次数。
0.22 版本新增。
- 返回:
- code形状为 (n_samples, n_components) 的 ndarray
矩阵分解中的稀疏编码因子。
- dictionary形状为 (n_components, n_features) 的 ndarray,
矩阵分解中的字典因子。
- errors数组
每次迭代的错误向量。
- n_iter整型
运行的迭代次数。仅当
return_n_iter
设置为 True 时返回。
另请参见
dict_learning_online
在线解决字典学习矩阵分解问题。
DictionaryLearning
查找稀疏编码数据的字典。
MiniBatchDictionaryLearning
字典学习算法的一个更快、但精度较低的版本。
SparsePCA
稀疏主成分分析。
MiniBatchSparsePCA
Mini-batch 稀疏主成分分析。
示例
>>> 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.62)
我们可以比较稀疏编码信号的重建误差的平均欧几里得范数平方与原始信号的欧几里得范数平方的关系
>>> X_hat = U @ V >>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1)) np.float64(0.0192)