建娱乐网站,能源与动力工程,html教程视频教程,网站基础建设和维护文章目录 1、字典学习与稀疏编码2、sklearn的实现3、示例 1、字典学习与稀疏编码
简单来说#xff0c;稀疏编码就是把输入向量#xff08;信号#xff09;/ 矩阵#xff08;图像#xff09;表示为稀疏的系数向量和一组超完备基向量#xff08;字典#xff09;的线性组合… 文章目录 1、字典学习与稀疏编码2、sklearn的实现3、示例 1、字典学习与稀疏编码
简单来说稀疏编码就是把输入向量信号/ 矩阵图像表示为稀疏的系数向量和一组超完备基向量字典的线性组合。因此稀疏编码通过上述方式以后就可以将输入数据重构为稀疏的向量即向量内部元素满足只有很少的几个非零元素或只有很少的几个远大于零的元素。一般情况下要求超完备基向量的个数k非常大远大于输入数据的维度n因为这样的基向量组合才能更容易的学到输入数据内在的结构和特征。为什么要转换为稀疏向量 1特征选择(Feature Selection) 直接对原始图像提取的特征很多情况下其实是有冗余成分的就是说我们只需要关键特征识别就可以没有必要用那么多特征更多情况下那些冗余信息会干扰我们最后的识别结果而稀疏编码可以实现特征的自动选择它会学习地去掉这些没有信息的特征也就是把这些特征对应的权重置为0。 2可解释性(Interpretability)另一个青睐于稀疏的理由是模型更容易解释即只有那几个关键特征会影响最终的结果更容易解释。 例如患某种病的概率是y然后我们收集到的数据x是1000维的也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。通过学习如果最后学习到的w*就只有很少的非零元素例如只有5个非零的wi那么我们就有理由相信这些对应的特征在患病分析上面提供的信息是巨大的决策性的。也就是说患不患这种病只和这5个因素有关那医生就好分析多了。 更多的稀疏编码的解释见该博客https://blog.csdn.net/Julialove102123/article/details/78349811
2、sklearn的实现
通过MiniBatchDictionaryLearning来实现字典学习与稀疏编码
class sklearn.decomposition.MiniBatchDictionaryLearning(n_componentsNone, *, alpha1, n_iterdeprecated,
max_iterNone, fit_algorithmlars, n_jobsNone, batch_size256, shuffleTrue, dict_initNone,
transform_algorithmomp, transform_n_nonzero_coefsNone, transform_alphaNone, verboseFalse,
split_signFalse, random_stateNone, positive_codeFalse, positive_dictFalse, transform_max_iter1000,
callbackNone, tol0.001, max_no_improvement10)1n_componentsint, defaultNone要提取的字典中每个基向量/atoms的个数每个基向量的维度应该为输入向量的维度因此字典的维度应该是(n_components, n_features) 2alphafloat, default1正则化项Lasso回归项的权重用于平衡稀疏性和重构误差 3n_iterint, default1000迭代的总次数1.1版本弃用改用max_iter 4max_iterint, defaultNone迭代的最大次数早停策略之前不为None时n_iter将被忽略 5fit_algorithm{‘lars’, ‘cd’}, default’lars’解决优化问题的算法首先使用fit算法训练出字典 默认为lars最小角度回归 6n_jobsint, defaultNone并行jobs的数量默认为None就是1 7batch_sizeint, default256每个mini-batch中的样本数量 8shufflebool, defaultTrue在构建batch之前是否打乱样本 9dict_initndarray of shape (n_components, n_features), defaultNone字典的初始化值 10transform_algorithm{‘lasso_lars’, ‘lasso_cd’, ‘lars’, ‘omp’, ‘threshold’}, default’omp’用于变换数据的算法即该算法用于学习每个样本的稀疏的系数向量即稀疏编码的结果再对原始输入数据进行变换。每个样本的稀疏向量的维度应该等于字典中的基向量的个数即n_components因此对输入数据变换后的维度应该是n_samplesn_components每个向量都具有稀疏性。 11transform_n_nonzero_coefsint, defaultNone在解的每一列中非零系数的数目。这只适用于algorithmlars’和algorithm‘omp’。如果None则transform_n_nonzero_coefsint(n_features / 10)。 12transform_alphafloat, defaultNone如果algorithmlasso_lars’或algorithm‘lasso_cd’ alpha是应用于L1范数的惩罚。如果algorithm‘threshold’ alpha是阈值的绝对值低于该阈值系数将被压扁为零。如果为None默认为alpha。 13split_signbool, defaultFalse是否将稀疏特征向量拆分为其负部分与正部分的拼接。这可以提高下游分类器的性能。 14random_stateint, RandomState instance or None, defaultNone当dict_init未被指定时用于初始化字典 15positive_codebool, defaultFalse是否强制编码为正 16positive_dictbool, defaultFalse是否强制字典为正 17transform_max_iterint, default1000如果algorithm‘lasso_cd’或’lasso_lars’执行的最大迭代次数。 该类的成员变量 components_是学习到的字典[n_components, n_features]表示有n_components个基向量/atom每个基向量的维度等于输入向量的维度 该类常用的的方法为
1、fit(X, yNone)
拟合X中的数据即学习到shape为[n_components, n_features]的字典
X待学习/待训练的样本[n_samples, n_featues]的ndarray
返回MiniBatchDictionaryLearning类实例本身2、transform(X)
将数据X编码为字典atom/基向量的稀疏组合返回的就是稀疏编码的结果
X待编码的样本[n_samples, n_featues]的ndarray
返回编码后的结果[n_samples, n_components]的ndarray需要先进行fit后学习到字典再进行稀疏编码3、fit_transform(X)
字典学习稀疏编码就是上述两个函数的结合
X待学习/待训练的样本[n_samples, n_featues]的ndarray
返回编码后的结果[n_samples, n_features_new]的ndarray3、示例 先使用make_sparse_coded_signal构建训练样本X是由dictionary和code相乘得到的 构建字典学习/稀疏编码 dict_learner学习到的字典为 最后对输入数据进行变换 import numpy as np
from sklearn.datasets import make_sparse_coded_signal
from sklearn.decomposition import MiniBatchDictionaryLearningX, dictionary, code make_sparse_coded_signal(n_samples100, n_components300, n_features20,n_nonzero_coefs10, random_state42)dict_learner MiniBatchDictionaryLearning(n_components300, batch_size4, transform_algorithmlasso_lars,transform_alpha0.1, random_state42, shuffleFalse)
X_transformed dict_learner.fit_transform(np.transpose(X))
print(X_transformed)