文章目錄
- 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_components=None, *, alpha=1, n_iter='deprecated',
max_iter=None, fit_algorithm='lars', n_jobs=None, batch_size=256, shuffle=True, dict_init=None,
transform_algorithm='omp', transform_n_nonzero_coefs=None, transform_alpha=None, verbose=False,
split_sign=False, random_state=None, positive_code=False, positive_dict=False, transform_max_iter=1000,
callback=None, tol=0.001, max_no_improvement=10)
1)n_components:int, default=None,要提取的字典中每個基向量/atoms的個數,每個基向量的維度應該為輸入向量的維度,因此字典的維度應該是(n_components, n_features)
2)alpha:float, default=1,正則化項(Lasso回歸項)的權重,用于平衡稀疏性和重構誤差
3)n_iter:int, default=1000,迭代的總次數,1.1版本棄用,改用max_iter
4)max_iter:int, default=None,迭代的最大次數(早停策略之前),不為None時,n_iter將被忽略
5)fit_algorithm:{‘lars’, ‘cd’}, default=’lars’,解決優化問題的算法(首先使用fit算法訓練出字典), 默認為lars,最小角度回歸
6)n_jobs:int, default=None,并行jobs的數量,默認為None,就是1
7)batch_size:int, default=256,每個mini-batch中的樣本數量
8)shuffle:bool, default=True,在構建batch之前是否打亂樣本
9)dict_init:ndarray of shape (n_components, n_features), default=None,字典的初始化值
10)transform_algorithm:{‘lasso_lars’, ‘lasso_cd’, ‘lars’, ‘omp’, ‘threshold’}, default=’omp’,用于變換數據的算法,即該算法用于學習每個樣本的稀疏的系數向量(即稀疏編碼的結果),再對原始輸入數據進行變換。每個樣本的稀疏向量的維度應該等于字典中的基向量的個數,即n_components,因此對輸入數據變換后的維度應該是(n_samples,n_components),每個向量都具有稀疏性。
11)transform_n_nonzero_coefs:int, default=None,在解的每一列中非零系數的數目。這只適用于algorithm='lars’和algorithm=‘omp’。如果None,則transform_n_nonzero_coefs=int(n_features / 10)。
12)transform_alpha:float, default=None,如果algorithm='lasso_lars’或algorithm=‘lasso_cd’, alpha是應用于L1范數的懲罰。如果algorithm=‘threshold’, alpha是閾值的絕對值,低于該閾值,系數將被壓扁為零。如果為None,默認為alpha。
13)split_sign:bool, default=False,是否將稀疏特征向量拆分為其負部分與正部分的拼接。這可以提高下游分類器的性能。
14)random_state:int, RandomState instance or None, default=None,當dict_init未被指定時,用于初始化字典
15)positive_code:bool, default=False,是否強制編碼為正
16)positive_dict:bool, default=False,是否強制字典為正
17)transform_max_iter:int, default=1000,如果algorithm=‘lasso_cd’或’lasso_lars’,執行的最大迭代次數。
-
該類的成員變量:
-
components_是學習到的字典,[n_components, n_features],表示有n_components個基向量/atom,每個基向量的維度等于輸入向量的維度
-
該類常用的的方法為:
1、fit(X, y=None)
擬合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]的ndarray
3、示例
- 先使用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_samples=100, n_components=300, n_features=20,n_nonzero_coefs=10, random_state=42)dict_learner = MiniBatchDictionaryLearning(n_components=300, batch_size=4, transform_algorithm='lasso_lars',transform_alpha=0.1, random_state=42, shuffle=False)
X_transformed = dict_learner.fit_transform(np.transpose(X))
print(X_transformed)