python 非負矩陣分解 NMF

2021-09-24 20:14:11 字數 2451 閱讀 4634

非負矩陣分解是矩陣中所有元素均為非負數約束條件下的矩陣分解,其基本思想:給定乙個非負矩陣v,nmf能夠找到乙個非負矩陣w和乙個非負矩陣h,使得矩陣w和矩陣h的乘積近似等於矩陣v中的值。

h矩陣:係數矩陣

nmf廣泛應用於影象分析,文字挖掘和語音處理鄰域。

nmf矩陣分解優化目標:最小化w矩陣h矩陣的乘積和原始矩陣之間的差別。

傳統目標函式:

基於kl散度的優化目標,損失函式如下:

在sklearn庫中,可以使用sklearn.decomposition.nmf載入nmf演算法,主要引數有:

n_components:用於指定分解後矩陣的單個維度k;

init:w矩陣和h矩陣的初始化方式,預設為nndsvdar。

其他nmf例項:

#非負矩陣分解(nmf):

''' 1.nmf 人臉資料特徵提取

目標:已知olivetti 人臉資料供400個,每個資料64*64,

由於nmf分解得到的w矩陣相當於從原始矩陣中提取的特徵,

那麼就可以使用nmf對400個人的人臉進行特徵提取。

2.通過設定k的大小可以設定提取的特徵數目,在本實驗中k設定為6,隨後提取特徵以影象的形式展示出來

'''import matplotlib.pyplot as plt

from sklearn import decomposition #匯入演算法

from sklearn.datasets import fetch_olivetti_faces#人臉資料

from numpy.random import randomstate #用於建立隨機種子

#設定基本引數並載入資料

n_row,n_col=2,3 #設定影象展示排列情況

n_components=n_row*n_col #設定提取的特徵數目

image_shape=(64,64) #設定人臉資料大小

dataset=fetch_olivetti_faces(shuffle=true,random_state=randomstate(0))

faces=dataset.data #載入資料,打亂順序

#設定影象的展示方式

def plot_gallery(title,images,n_col=n_col,n_row=n_row):

plt.figure(figsize=(2.*n_col,2.26*n_row)) #建立,指定大小

plt.suptitle(title,size=16) #設定標題,字型大小大小

for i,comp in enumerate(images):

plt.subplot(n_row,n_col,i+1) #選擇畫製的子圖

vmax=max(comp.max(),-comp.min())

plt.imshow(comp.reshape(image_shape),cmap=plt.cm.gray,

interpolation='nearest', #對數值歸一化,並以灰度圖形顯示

vmin=-vmax,vmax=vmax)

plt.xticks(())

plt.yticks(()) #去除子圖座標標籤

plt.subplots_adjust(0.01,0.05,0.99,0.93,0.)#子圖間隔調整

estimators=[('eigenfaces -pca using randomized svd',

decomposition.pca(n_components=6,whiten=true)),

('non -negative components -nmf',#nmf和pca例項化並儲存在列表之中

decomposition.nmf(n_components=6,init='nndsvda',

tol=5e-3))]

for name ,estimator in estimators:

estimator.fit(faces) #nmf和pca分別呼叫提取特徵

components_=estimator.components_

#獲取特徵

plot_gallery(name,components_[:n_components])

#按照國定格式進行排列

if __name__=="__main__":

plt.show()#視覺化

非負矩陣分解 NMF 簡介

非負矩陣分解,顧名思義就是,將非負的大矩陣分解成兩個非負的小矩陣。回顧矩陣分解本身,在 公式 1 中的v是乙個n m維的矩陣,其中每一列就是 那麼非負和其它的有什麼不同呢?下面我就盜一張圖來直觀地展示幾種矩陣分解方法的效果差異。出自lee and seung 1999 圖中就對比了三種方法的區別。v...

NMF演算法 非負矩陣分解演算法 python實現

nmf演算法 非負矩陣分解演算法。目標 將乙個大矩陣分解成兩個稍小的矩陣 利用矩陣的乘法 要求 待分解矩陣不能有負值。因為負值對於資料是無效的。假定有乙個元資料矩陣v,目標是將其分解成兩個非負矩陣w和h相乘的形式。v w h 這邊需要注意一些維度也就是角標,我就會直接寫了 其中,w稱為權重係數矩陣,...

降維方法 非負矩陣分解 NMF

非負矩陣分解 non negative matrix factorization 作為一種非監督式的降維方法,其主要思想正如其名字描述的那樣 將乙個非負原始矩陣分解為兩個非負矩陣的積 vm n w m r v r n vm n wm r v r n 矩陣v v 為原始資料矩陣,包含 n role p...