机器学习笔记:非负矩阵分解问题 NMF
1 NMF介紹
????????NMF(Non-negative matrix factorization),即對于任意給定的一個非負(fù)矩陣V,其能夠?qū)ふ业揭粋€非負(fù)矩陣W和一個非負(fù)矩陣H,滿足條件V=W*H,從而將一個非負(fù)的矩陣分解為左右兩個非負(fù)矩陣的乘積。
????????其中,V矩陣中每一列代表一個觀測點的信息(observation),每一行代表一個特征(feature);W矩陣稱為基矩陣,H矩陣稱為系數(shù)矩陣或權(quán)重矩陣。此時V矩陣的每一列,都相當(dāng)于基矩陣W的每一列對于H矩陣每一列的加權(quán)和。
????????這時用系數(shù)矩陣H代替原始矩陣,就可以實現(xiàn)對原始矩陣進(jìn)行降維,得到數(shù)據(jù)特征的降維矩陣,從而減少存儲空間。(H的每一個列向量可以看成矩陣V對應(yīng)的列向量,投影到基矩陣W的每一個列向量得到的坐標(biāo))
?????????NMF本質(zhì)上說是一種矩陣分解的方法,它的特點是可以將一個大的非負(fù)矩陣分解為兩個小的非負(fù)矩陣,又因為分解后的矩陣也是非負(fù)的,所以也可以繼續(xù)分解。
????????非負(fù)矩陣分解的關(guān)鍵是“非負(fù)”,即原數(shù)據(jù)和新基底都必須是非負(fù)數(shù),或者說位于“第一象限”,這樣原數(shù)據(jù)投影在新基底上的數(shù)值才自然也是非負(fù)數(shù)。
2 用數(shù)學(xué)語言定義NMF
將矩陣分解問題轉(zhuǎn)換成兩個矩陣之間誤差最小化的問題
3 W和H的迭代公式
?????????采用的是迭代法,一步步逼近最終的結(jié)果,當(dāng)計算得到的兩個矩陣W和H收斂時,就說明分解成功。
????????需要注意的是,原矩陣和分解之后兩個矩陣的乘積并不要求完全相等,可以存在一定程度上的誤差。
?4 NMF的損失函數(shù)
4.0 naive form
用 矩陣表示,則是:
4.1?squared frobenius norm
?
?4.2 KL散度
X,Y分別是原矩陣和WH的乘積結(jié)果
4.3??Itakura-Saito (IS)
?5 NMF應(yīng)用舉例
5.1:文本主題模型
假設(shè)我們輸入有m個詞,n個文本。Aij對應(yīng)的是第i個詞在第j個文本的特征值。
經(jīng)過NMF分解后,Wik對應(yīng)的是第i個詞和第k個“主題”的概率相關(guān)度;Hkj對應(yīng)的是第j個文本和第k個“主題”的概率相關(guān)度
5.2 圖像處理
?6 NMF的不足
????????NMF作為一個漂亮的矩陣分解方法,它可以很好的用于主題模型,并且使主題的結(jié)果有基于概率分布的解釋性。
????????但是NMF只能對訓(xùn)練樣本中的文本進(jìn)行主題識別,而對不在樣本中的文本識別不一定很準(zhǔn)確。
文本主題模型之非負(fù)矩陣分解(NMF) - 劉建平Pinard - 博客園 (cnblogs.com)?
7 NMF的實現(xiàn)(sklearn)
#導(dǎo)入庫 from sklearn.decomposition import NMF import numpy as npX = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])#定義NMF模型 model = NMF(n_components=2, #分解的稠密矩陣中k的大小beta_loss='frobenius', # {'frobenius', 'kullback-leibler', 'itakura-saito'}#對應(yīng)的是前面說的1~3三種損失函數(shù)# 一般來說,默認(rèn)使用naive的損失函數(shù)('frobenius',同時alpha默認(rèn)為0)tol=1e-4, # 停止迭代的極限條件init='random',# W H 的初始化方法max_iter=200, # 最大迭代次數(shù)l1_ratio=0., # L1正則化比例alpha=0., # 正則化參數(shù)random_state=0)#打印model 構(gòu)造函數(shù)各參數(shù) print(model.get_params()) ''' {'alpha': 0.0, 'beta_loss': 'frobenius', 'init': 'random', 'l1_ratio': 0.0, 'max_iter': 200, 'n_components': 2, 'random_state': 0, 'shuffle': False, 'solver': 'cd', 'tol': 0.0001, 'verbose': 0} '''W = model.fit_transform(X) #相當(dāng)于model.fit(X) 和 W=model.transform(X) 兩步 H = model.components_print(W,'\n',H,'\n',model.n_iter_,'\n',model.reconstruction_err_) ''' [[0. 0.46880684][0.55699523 0.3894146 ][1.00331638 0.41925352][1.6733999 0.22926926][2.34349311 0.03927954][2.78981512 0.06911798]][[2.09783018 0.30560234][2.13443044 2.13171694]]30 0.0011599349216014024 '''總結(jié)
以上是生活随笔為你收集整理的机器学习笔记:非负矩阵分解问题 NMF的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 报错解决方法1:‘A GDAL API
- 下一篇: 机器学习笔记:FLOPs