機(jī)器學(xué)習(xí)之非負(fù)矩陣分解NMF教程_第1頁(yè)
機(jī)器學(xué)習(xí)之非負(fù)矩陣分解NMF教程_第2頁(yè)
機(jī)器學(xué)習(xí)之非負(fù)矩陣分解NMF教程_第3頁(yè)
機(jī)器學(xué)習(xí)之非負(fù)矩陣分解NMF教程_第4頁(yè)
機(jī)器學(xué)習(xí)之非負(fù)矩陣分解NMF教程_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

機(jī)器學(xué)習(xí)之非負(fù)矩陣分解NMF教程1機(jī)器學(xué)習(xí):無(wú)監(jiān)督學(xué)習(xí):非負(fù)矩陣分解NMF1.1簡(jiǎn)介1.1.1非負(fù)矩陣分解NMF的定義非負(fù)矩陣分解(Non-negativeMatrixFactorization,NMF)是一種矩陣分解技術(shù),特別適用于分析非負(fù)值的數(shù)據(jù)集。NMF的目標(biāo)是將一個(gè)非負(fù)矩陣V分解為兩個(gè)非負(fù)矩陣W和H的乘積,即V≈WH。這種分解方法在處理如圖像、文本、音頻等數(shù)據(jù)時(shí)非常有效,因?yàn)樗軌蚪沂緮?shù)據(jù)的潛在結(jié)構(gòu),同時(shí)保持?jǐn)?shù)據(jù)的非負(fù)性質(zhì)。1.1.2NMF的應(yīng)用場(chǎng)景NMF在多個(gè)領(lǐng)域有廣泛的應(yīng)用,包括但不限于:-圖像處理:用于圖像特征提取和識(shí)別。-文本挖掘:在主題建模中,NMF能夠識(shí)別文檔集合中的主題。-音頻信號(hào)處理:用于音樂(lè)信號(hào)的分離和識(shí)別。-生物信息學(xué):在基因表達(dá)數(shù)據(jù)分析中,NMF能夠揭示基因表達(dá)的模式。1.2原理與內(nèi)容1.2.1NMF的數(shù)學(xué)基礎(chǔ)假設(shè)我們有一個(gè)m×n的非負(fù)矩陣V,NMF的目標(biāo)是找到兩個(gè)非負(fù)矩陣W(m×k)和H(k×n),使得V可以被近似表示為WH。這里的k通常小于m和n,表示我們希望找到的低維表示的維度。NMF通過(guò)最小化重構(gòu)誤差來(lái)找到W和H,常見(jiàn)的誤差度量包括歐氏距離和KL散度。1.2.2NMF的算法流程N(yùn)MF的算法流程通常包括以下步驟:1.初始化:隨機(jī)初始化W和H矩陣。2.迭代更新:通過(guò)更新規(guī)則迭代優(yōu)化W和H,以最小化V和WH之間的誤差。3.收斂檢查:檢查更新后的W和H是否滿足收斂條件,如果不滿足,則繼續(xù)迭代。1.2.3示例:使用Python進(jìn)行NMF下面是一個(gè)使用Python和scikit-learn庫(kù)進(jìn)行NMF的示例。我們將使用一個(gè)簡(jiǎn)單的文本數(shù)據(jù)集來(lái)展示如何使用NMF進(jìn)行主題建模。#導(dǎo)入必要的庫(kù)

fromsklearn.decompositionimportNMF

fromsklearn.feature_extraction.textimportTfidfVectorizer

fromsklearn.pipelineimportmake_pipeline

fromsklearn.preprocessingimportNormalizer

fromsklearn.datasetsimportfetch_20newsgroups

fromsklearnimportmetrics

importnumpyasnp

#加載數(shù)據(jù)集

newsgroups=fetch_20newsgroups(subset='all',remove=('headers','footers','quotes'))

documents=newsgroups.data

#文本向量化

tfidf_vectorizer=TfidfVectorizer(max_df=0.95,min_df=2,max_features=1000,stop_words='english')

tfidf=tfidf_vectorizer.fit_transform(documents)

#創(chuàng)建NMF模型

nmf=NMF(n_components=20,random_state=1,alpha=.1,l1_ratio=.5).fit(tfidf)

#重構(gòu)數(shù)據(jù)

tfidf_feature_names=tfidf_vectorizer.get_feature_names_out()

doc_topic=nmf.transform(tfidf)

#打印主題

defdisplay_topics(model,feature_names,no_top_words):

fortopic_idx,topicinenumerate(ponents_):

print("Topic%d:"%(topic_idx))

print("".join([feature_names[i]

foriintopic.argsort()[:-no_top_words-1:-1]]))

no_top_words=10

display_topics(nmf,tfidf_feature_names,no_top_words)1.2.4代碼解釋在這個(gè)示例中,我們首先加載了20newsgroups數(shù)據(jù)集,這是一個(gè)包含新聞組文檔的常用數(shù)據(jù)集。然后,我們使用TfidfVectorizer將文本數(shù)據(jù)轉(zhuǎn)換為TF-IDF特征向量,這是一種衡量詞在文檔中重要性的方法。接下來(lái),我們創(chuàng)建了一個(gè)NMF模型,其中n_components參數(shù)指定了我們希望找到的主題數(shù)量。模型訓(xùn)練完成后,我們使用transform方法將文檔轉(zhuǎn)換為主題空間中的表示,并通過(guò)display_topics函數(shù)打印出每個(gè)主題的前10個(gè)關(guān)鍵詞。1.3結(jié)論NMF是一種強(qiáng)大的無(wú)監(jiān)督學(xué)習(xí)技術(shù),特別適用于處理非負(fù)數(shù)據(jù)。通過(guò)將數(shù)據(jù)分解為兩個(gè)低維矩陣,NMF能夠揭示數(shù)據(jù)的潛在結(jié)構(gòu),這對(duì)于特征提取、主題建模和數(shù)據(jù)壓縮等任務(wù)非常有用。上述示例展示了如何在文本數(shù)據(jù)上應(yīng)用NMF進(jìn)行主題建模,但NMF的應(yīng)用遠(yuǎn)不止于此,它在圖像處理、音頻信號(hào)處理和生物信息學(xué)等領(lǐng)域也有廣泛的應(yīng)用。2數(shù)學(xué)基礎(chǔ)2.1矩陣的基本概念矩陣是數(shù)學(xué)中一種重要的數(shù)據(jù)結(jié)構(gòu),由數(shù)個(gè)行和列組成的矩形數(shù)組。在機(jī)器學(xué)習(xí)中,矩陣常用于表示數(shù)據(jù)集,其中每一行可以代表一個(gè)樣本,每一列代表一個(gè)特征。矩陣的元素通常用小寫字母表示,如aij表示矩陣A的第i行第j2.1.1矩陣的表示矩陣可以用大寫字母表示,例如,矩陣A可以寫作:A其中,m是行數(shù),n是列數(shù)。2.2矩陣乘法與轉(zhuǎn)置矩陣乘法是矩陣運(yùn)算中的一個(gè)關(guān)鍵操作,它允許兩個(gè)矩陣相乘,產(chǎn)生一個(gè)新的矩陣。矩陣A與矩陣B的乘法AB只有在A的列數(shù)等于B2.2.1矩陣乘法示例假設(shè)我們有兩個(gè)矩陣A和B:A則矩陣A與B的乘積C=Aimportnumpyasnp

#定義矩陣A和B

A=np.array([[1,2],[3,4]])

B=np.array([[5,6],[7,8]])

#計(jì)算矩陣乘法

C=np.dot(A,B)

print(C)輸出結(jié)果為:C2.2.2矩陣轉(zhuǎn)置矩陣的轉(zhuǎn)置是將矩陣的行和列互換的操作。如果A是一個(gè)m×n的矩陣,那么A的轉(zhuǎn)置AT將是一個(gè)#計(jì)算矩陣A的轉(zhuǎn)置

A_T=A.T

print(A_T)輸出結(jié)果為:A2.3矩陣的秩與奇異值分解SVD矩陣的秩表示矩陣中線性獨(dú)立的行或列的最大數(shù)量。秩是理解矩陣結(jié)構(gòu)的關(guān)鍵,特別是在機(jī)器學(xué)習(xí)中,它可以幫助我們識(shí)別數(shù)據(jù)的冗余和潛在的結(jié)構(gòu)。2.3.1矩陣的秩示例計(jì)算矩陣A的秩:#計(jì)算矩陣A的秩

rank_A=np.linalg.matrix_rank(A)

print(rank_A)2.3.2奇異值分解SVD奇異值分解(SVD)是一種將矩陣分解為三個(gè)矩陣的乘積的方法:一個(gè)正交矩陣U,一個(gè)對(duì)角矩陣Σ(包含奇異值),和另一個(gè)正交矩陣VT。SVD對(duì)于任何矩陣A,其SVD可以表示為:A其中,U和V是正交矩陣,Σ是對(duì)角矩陣。2.3.3SVD示例假設(shè)我們有一個(gè)矩陣A:A我們可以使用SVD來(lái)分解這個(gè)矩陣:#定義矩陣A

A=np.array([[1,2,3],[4,5,6],[7,8,9]])

#計(jì)算SVD

U,S,VT=np.linalg.svd(A)

#輸出分解結(jié)果

print("U:\n",U)

print("Singularvalues:\n",S)

print("V^T:\n",VT)輸出結(jié)果將給出U、Σ(通過(guò)S表示)和VT以上內(nèi)容涵蓋了矩陣的基本概念、矩陣乘法與轉(zhuǎn)置,以及矩陣的秩與奇異值分解SVD,這些都是非負(fù)矩陣分解NMF等機(jī)器學(xué)習(xí)算法的數(shù)學(xué)基礎(chǔ)。3NMF原理3.1NMF的目標(biāo)函數(shù)非負(fù)矩陣分解(NMF)是一種用于分析非負(fù)數(shù)據(jù)的矩陣分解技術(shù)。其目標(biāo)是將一個(gè)非負(fù)矩陣分解為兩個(gè)非負(fù)矩陣的乘積,以揭示原始數(shù)據(jù)的潛在結(jié)構(gòu)。NMF的目標(biāo)函數(shù)通常定義為最小化重構(gòu)誤差,即原始矩陣與分解后矩陣乘積之間的差異。最常見(jiàn)的誤差度量是Frobenius范數(shù),定義如下:min其中,V是原始非負(fù)矩陣,W和H是非負(fù)矩陣分解后的兩個(gè)矩陣,W通常稱為基矩陣,H稱為系數(shù)矩陣。?F3.1.1示例代碼假設(shè)我們有一個(gè)非負(fù)矩陣V,我們使用Python的scikit-learn庫(kù)來(lái)實(shí)現(xiàn)NMF:importnumpyasnp

fromsklearn.decompositionimportNMF

#創(chuàng)建一個(gè)非負(fù)矩陣V

V=np.array([[1,2],[3,4],[5,6]])

#初始化NMF模型

nmf=NMF(n_components=2,init='random',random_state=0)

#擬合模型

W=nmf.fit_transform(V)

H=ponents_

#重構(gòu)矩陣V'

V_reconstructed=np.dot(W,H)

#計(jì)算Frobenius誤差

error=np.linalg.norm(V-V_reconstructed,'fro')

print("FrobeniusError:",error)3.2NMF的約束條件NMF的一個(gè)關(guān)鍵特性是它對(duì)分解后的矩陣W和H施加非負(fù)約束。這意味著所有元素都必須大于或等于零。這種約束有助于NMF找到具有解釋性的解,因?yàn)樗鼈兛梢员唤忉尀樵紨?shù)據(jù)的加權(quán)組合。此外,NMF通常還要求W和H的乘積盡可能接近原始矩陣V,同時(shí)保持W和H的非負(fù)性。3.2.1示例代碼在scikit-learn中,NMF模型自動(dòng)滿足非負(fù)約束。但是,我們可以通過(guò)設(shè)置參數(shù)來(lái)控制分解的其他方面,例如初始化方法或隨機(jī)狀態(tài),以確保結(jié)果的可重復(fù)性:#使用固定隨機(jī)狀態(tài)初始化NMF模型

nmf=NMF(n_components=2,init='nndsvd',random_state=1)

#擬合模型

W=nmf.fit_transform(V)

H=ponents_

#輸出分解后的矩陣

print("W:\n",W)

print("H:\n",H)3.3NMF的求解算法NMF的求解通常涉及迭代優(yōu)化過(guò)程,以最小化目標(biāo)函數(shù)。scikit-learn庫(kù)提供了多種算法來(lái)求解NMF,包括乘法更新規(guī)則('mu')和梯度下降('cd')。乘法更新規(guī)則是NMF中最常用的算法之一,因?yàn)樗WC了目標(biāo)函數(shù)的非增性,從而有助于收斂到局部最小值。3.3.1示例代碼在scikit-learn中,我們可以選擇不同的算法來(lái)求解NMF:#使用乘法更新規(guī)則求解NMF

nmf=NMF(n_components=2,solver='mu',beta_loss='frobenius')

#擬合模型

W=nmf.fit_transform(V)

H=ponents_

#輸出分解后的矩陣

print("W:\n",W)

print("H:\n",H)通過(guò)以上示例,我們可以看到如何使用scikit-learn庫(kù)來(lái)實(shí)現(xiàn)NMF,包括設(shè)置目標(biāo)函數(shù)、滿足非負(fù)約束條件以及選擇求解算法。這些示例提供了具體的操作代碼和數(shù)據(jù)樣例,有助于理解和應(yīng)用NMF技術(shù)。4NMF在機(jī)器學(xué)習(xí)中的應(yīng)用4.1文本挖掘與主題建模非負(fù)矩陣分解(NMF)在文本挖掘中被廣泛應(yīng)用于主題建模。通過(guò)將文檔-詞矩陣分解為兩個(gè)非負(fù)矩陣,NMF能夠揭示出文檔中潛在的主題結(jié)構(gòu)。下面是一個(gè)使用Python和scikit-learn庫(kù)進(jìn)行文本主題建模的示例。4.1.1示例代碼fromsklearn.datasetsimportfetch_20newsgroups

fromsklearn.feature_extraction.textimportTfidfVectorizer

fromsklearn.decompositionimportNMF

importnumpyasnp

#加載數(shù)據(jù)集

newsgroups=fetch_20newsgroups(subset='all')

documents=newsgroups.data

#文本向量化

vectorizer=TfidfVectorizer(max_df=0.95,min_df=2,stop_words='english')

X=vectorizer.fit_transform(documents)

#應(yīng)用NMF

nmf=NMF(n_components=20,random_state=1)

W=nmf.fit_transform(X)

H=ponents_

#打印主題

feature_names=vectorizer.get_feature_names_out()

fortopic_idx,topicinenumerate(H):

print(f"主題{topic_idx+1}:")

print("".join([feature_names[i]foriintopic.argsort()[:-11:-1]]))4.1.2代碼解釋數(shù)據(jù)加載:使用fetch_20newsgroups函數(shù)從scikit-learn庫(kù)中加載20個(gè)新聞組數(shù)據(jù)集。文本向量化:通過(guò)TfidfVectorizer將文本轉(zhuǎn)換為TF-IDF特征向量,這是一種衡量詞在文檔中重要性的方法。NMF應(yīng)用:創(chuàng)建一個(gè)NMF模型,指定主題數(shù)量為20,然后對(duì)文檔矩陣X進(jìn)行分解。主題展示:通過(guò)查看H矩陣中每個(gè)主題的前10個(gè)詞,來(lái)展示分解出的主題。4.2圖像處理與識(shí)別NMF在圖像處理中可以用于圖像識(shí)別和特征提取。通過(guò)將圖像矩陣分解,NMF能夠找到圖像的基元特征,這些特征可以用于圖像的分類和識(shí)別。4.2.1示例代碼importnumpyasnp

fromsklearn.decompositionimportNMF

fromsklearn.datasetsimportfetch_olivetti_faces

importmatplotlib.pyplotasplt

#加載數(shù)據(jù)集

faces=fetch_olivetti_faces()

X=faces.data

#應(yīng)用NMF

nmf=NMF(n_components=15,random_state=1)

W=nmf.fit_transform(X)

H=ponents_

#顯示基元特征

fig,axes=plt.subplots(3,5,figsize=(8,8),subplot_kw={'xticks':[],'yticks':[]})

forax,compinzip(axes.ravel(),H):

ax.imshow(comp.reshape(64,64),cmap='gray')

plt.show()4.2.2代碼解釋數(shù)據(jù)加載:使用fetch_olivetti_faces函數(shù)加載Olivetti人臉數(shù)據(jù)集。NMF應(yīng)用:創(chuàng)建一個(gè)NMF模型,指定基元特征數(shù)量為15,然后對(duì)人臉圖像矩陣X進(jìn)行分解。特征展示:通過(guò)將H矩陣中的每個(gè)基元特征重塑為64x64的圖像,并使用matplotlib庫(kù)進(jìn)行展示,來(lái)查看分解出的基元特征。4.3推薦系統(tǒng)中的NMFNMF在推薦系統(tǒng)中用于用戶-項(xiàng)目評(píng)分矩陣的分解,以發(fā)現(xiàn)用戶的偏好和項(xiàng)目的屬性。這有助于構(gòu)建更準(zhǔn)確的推薦模型。4.3.1示例代碼importpandasaspd

fromsklearn.decompositionimportNMF

fromsklearn.metrics.pairwiseimportcosine_similarity

#創(chuàng)建評(píng)分?jǐn)?shù)據(jù)

ratings=pd.DataFrame({

'user_id':[1,1,1,2,2,2,3,3,3],

'item_id':[1,2,3,1,2,3,1,2,3],

'rating':[5,3,4,4,5,2,3,4,5]

})

ratings_matrix=ratings.pivot(index='user_id',columns='item_id',values='rating').fillna(0)

#應(yīng)用NMF

nmf=NMF(n_components=2,random_state=1)

W=nmf.fit_transform(ratings_matrix)

H=ponents_

#計(jì)算用戶對(duì)未評(píng)分項(xiàng)目的預(yù)測(cè)評(píng)分

user_preferences=W[0]

item_features=H.T

predicted_ratings=cosine_similarity([user_preferences],item_features)4.3.2代碼解釋數(shù)據(jù)創(chuàng)建:構(gòu)建一個(gè)簡(jiǎn)單的評(píng)分?jǐn)?shù)據(jù)集,包含用戶ID、項(xiàng)目ID和評(píng)分。NMF應(yīng)用:創(chuàng)建一個(gè)NMF模型,指定潛在特征數(shù)量為2,然后對(duì)用戶-項(xiàng)目評(píng)分矩陣進(jìn)行分解。預(yù)測(cè)評(píng)分:使用余弦相似性計(jì)算用戶偏好與項(xiàng)目特征之間的相似度,從而預(yù)測(cè)用戶對(duì)未評(píng)分項(xiàng)目的評(píng)分。通過(guò)以上示例,我們可以看到NMF在不同領(lǐng)域的具體應(yīng)用,包括文本主題建模、圖像特征提取和推薦系統(tǒng)中的評(píng)分預(yù)測(cè)。這些應(yīng)用展示了NMF在無(wú)監(jiān)督學(xué)習(xí)中的強(qiáng)大能力,能夠從數(shù)據(jù)中自動(dòng)發(fā)現(xiàn)潛在的結(jié)構(gòu)和模式。5實(shí)踐案例5.1NMF在文檔主題分析中的應(yīng)用案例非負(fù)矩陣分解(NMF)在文檔主題分析中是一種強(qiáng)大的工具,它能夠?qū)⑽臋n集合表示為幾個(gè)主題的非負(fù)線性組合。下面,我們將通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)展示如何使用NMF進(jìn)行文檔主題分析。5.1.1數(shù)據(jù)準(zhǔn)備假設(shè)我們有以下文檔集合:文檔1:機(jī)器學(xué)習(xí)是人工智能的一個(gè)分支,它讓計(jì)算機(jī)能夠從數(shù)據(jù)中學(xué)習(xí)。

文檔2:數(shù)據(jù)科學(xué)涉及數(shù)據(jù)清洗、數(shù)據(jù)可視化和數(shù)據(jù)建模。

文檔3:人工智能正在改變我們的生活方式,包括自動(dòng)駕駛和語(yǔ)音識(shí)別。我們將這些文檔轉(zhuǎn)換為詞頻矩陣,其中每一行代表一個(gè)文檔,每一列代表一個(gè)詞。5.1.2NMF應(yīng)用使用Python的sklearn庫(kù),我們可以將NMF應(yīng)用于詞頻矩陣上,以發(fā)現(xiàn)潛在的主題。fromsklearn.feature_extraction.textimportCountVectorizer

fromsklearn.decompositionimportNMF

#文檔集合

documents=[

"機(jī)器學(xué)習(xí)是人工智能的一個(gè)分支,它讓計(jì)算機(jī)能夠從數(shù)據(jù)中學(xué)習(xí)。",

"數(shù)據(jù)科學(xué)涉及數(shù)據(jù)清洗、數(shù)據(jù)可視化和數(shù)據(jù)建模。",

"人工智能正在改變我們的生活方式,包括自動(dòng)駕駛和語(yǔ)音識(shí)別。"

]

#創(chuàng)建詞頻矩陣

vectorizer=CountVectorizer()

tf_matrix=vectorizer.fit_transform(documents)

#應(yīng)用NMF

nmf=NMF(n_components=2,random_state=1)

nmf.fit(tf_matrix)

#顯示主題

features=vectorizer.get_feature_names_out()

forindex,topicinenumerate(ponents_):

print(f"主題{index+1}:")

print([features[i]foriintopic.argsort()[:-5:-1]])5.1.3結(jié)果解釋運(yùn)行上述代碼后,我們得到的主題將顯示每個(gè)主題中最重要的詞。這有助于我們理解文檔集合中的潛在主題。5.2NMF在圖像壓縮中的應(yīng)用案例NMF也可以用于圖像壓縮,通過(guò)將圖像表示為幾個(gè)基礎(chǔ)圖像的組合,從而減少存儲(chǔ)空間。5.2.1數(shù)據(jù)準(zhǔn)備我們使用一張圖像作為示例,將其轉(zhuǎn)換為矩陣形式。5.2.2NMF應(yīng)用使用NMF對(duì)圖像矩陣進(jìn)行分解,然后重構(gòu)圖像以實(shí)現(xiàn)壓縮。importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.decompositionimportNMF

fromPILimportImage

#加載圖像

img=Image.open('example.jpg')

img_data=np.array(img)

#將圖像轉(zhuǎn)換為矩陣

img_matrix=img_data.reshape(img_data.shape[0]*img_data.shape[1],img_data.shape[2])

#應(yīng)用NMF

nmf=NMF(n_components=100,random_state=1)

W=nmf.fit_transform(img_matrix)

H=ponents_

#重構(gòu)圖像

compressed_img=np.dot(W,H).reshape(img_data.shape)

#顯示原始圖像和壓縮后的圖像

plt.figure(figsize=(10,5))

plt.subplot(1,2,1)

plt.imshow(img)

plt.title('原始圖像')

plt.axis('off')

plt.subplot(1,2,2)

plt.imshow(compressed_img.astype(np.uint8))

plt.title('壓縮后的圖像')

plt.axis('off')

plt.show()5.2.3結(jié)果解釋通過(guò)比較原始圖像和壓縮后的圖像,我們可以看到NMF在保持圖像基本特征的同時(shí),顯著減少了圖像的大小。5.3NMF在電影推薦系統(tǒng)中的應(yīng)用案例NMF可以用于電影推薦系統(tǒng),通過(guò)分析用戶對(duì)電影的評(píng)分矩陣,發(fā)現(xiàn)用戶的偏好和電影的特征,從而推薦用戶可能喜歡的電影。5.3.1數(shù)據(jù)準(zhǔn)備我們使用一個(gè)用戶對(duì)電影的評(píng)分矩陣作為示例。5.3.2NMF應(yīng)用使用NMF對(duì)評(píng)分矩陣進(jìn)行分解,然后根據(jù)用戶偏好和電影特征進(jìn)行推薦。importnumpyasnp

fromsklearn.decompositionimportNMF

#用戶對(duì)電影的評(píng)分矩陣

ratings=np.array([

[5,3,0,1],

[4,0,0,1],

[1,1,0,5],

[1,0,0,4],

[0,1,5,4],

])

#應(yīng)用NMF

nmf=NMF(n_components=2,random_state=1)

W=nmf.fit_transform(ratings)

H=ponents_

#預(yù)測(cè)用戶對(duì)未評(píng)分電影的評(píng)分

predicted_ratings=np.dot(W,H)

#找出用戶可能喜歡的電影

user_id=0#假設(shè)我們正在為用戶0推薦電影

unrated_movies=(ratings[user_id]==0)

recommended_movies=predicted_ratings[user_id][unrated_movies].argsort()[-3:][::-1]

#顯示推薦的電影

print("推薦給用戶0的電影:")

print(recommended_movies)5.3.3結(jié)果解釋通過(guò)NMF分解,我們能夠預(yù)測(cè)用戶對(duì)未評(píng)分電影的潛在評(píng)分,從而推薦用戶可能感興趣的電影。這種方法在大規(guī)模數(shù)據(jù)集上尤其有效,能夠處理稀疏的評(píng)分矩陣。以上案例展示了NMF在不同領(lǐng)域的應(yīng)用,包括文檔主題分析、圖像壓縮和電影推薦系統(tǒng)。通過(guò)這些例子,我們可以看到NMF在提取數(shù)據(jù)的潛在結(jié)構(gòu)和特征方面的能力。6使用Python和Scikit-Learn實(shí)現(xiàn)NMF非負(fù)矩陣分解(NMF)是一種用于分析非負(fù)數(shù)據(jù)的矩陣分解技術(shù),常用于圖像處理、文本挖掘和推薦系統(tǒng)等領(lǐng)域。在本節(jié)中,我們將使用Python的Scikit-Learn庫(kù)來(lái)實(shí)現(xiàn)NMF。6.1示例:使用NMF進(jìn)行文本主題建模假設(shè)我們有一組文檔,想要通過(guò)NMF找出其中的主題。首先,我們需要將文本數(shù)據(jù)轉(zhuǎn)換為矩陣形式,通常使用詞頻-逆文檔頻率(TF-IDF)矩陣。fromsklearn.datasetsimportfetch_20newsgroups

fromsklearn.feature_extraction.textimportTfidfVectorizer

fromsklearn.decompositionimportNMF

importnumpyasnp

#加載數(shù)據(jù)集

dataset=fetch_20newsgroups(shuffle=True,random_state=1,remove=('headers','footers','quotes'))

documents=dataset.data

#創(chuàng)建TF-IDF向量化器

vectorizer=TfidfVectorizer(max_df=0.95,min_df=2,max_features=1000,stop_words='english')

tfidf=vectorizer.fit_transform(documents)

#使用NMF進(jìn)行主題建模

nmf=NMF(n_components=20,random_state=1)

W=nmf.fit_transform(tfidf)

H=ponents_在上述代碼中,W矩陣表示文檔-主題矩陣,H矩陣表示主題-詞矩陣。接下來(lái),我們可以查看每個(gè)主題的前幾個(gè)關(guān)鍵詞。feature_names=vectorizer.get_feature_names_out()

defdisplay_topics(model,feature_names,no_top_words):

fortopic_idx,topicinenumerate(ponents_):

print("Topic%d:"%(topic_idx))

print("".join([feature_names[i]

foriintopic.argsort()[:-no_top_words-1:-1]]))

no_top_words=10

display_topics(nmf,feature_names,no_top_words)6.2NMF參數(shù)調(diào)優(yōu)NMF的參數(shù)調(diào)優(yōu)主要集中在n_components(主題數(shù)量)和alpha(正則化強(qiáng)度)上。選擇合適的主題數(shù)量和正則化強(qiáng)度對(duì)于模型的性能至關(guān)重要。6.2.1使用交叉驗(yàn)證選擇主題數(shù)量我們可以使用交叉驗(yàn)證來(lái)評(píng)估不同主題數(shù)量下的模型性能,例如使用重構(gòu)誤差作為評(píng)估指標(biāo)。fromsklearn.model_selectionimportGridSearchCV

#定義參數(shù)網(wǎng)格

param_grid={'n_components':[10,20,30,40,50]}

#創(chuàng)建NMF模型

nmf=NMF(random_state=1)

#使用GridSearchCV進(jìn)行參數(shù)調(diào)優(yōu)

grid_search=GridSearchCV(nmf,param_grid,cv=5,scoring='neg_mean_squared_error')

grid_search.fit(tfidf)

#輸出最佳參數(shù)

print("Bestnumberofcomponents:",grid_search.best_params_['n_components'])6.2.2調(diào)整正則化強(qiáng)度正則化強(qiáng)度alpha可以幫助控制模型的復(fù)雜度,避免過(guò)擬合。我們可以通過(guò)調(diào)整alpha值來(lái)優(yōu)化模型。#定義參數(shù)網(wǎng)格

param_grid={'alpha':[0.0,0.1,0.5,1.0,1.5]}

#使用GridSearchCV進(jìn)行參數(shù)調(diào)優(yōu)

grid_search=GridSearchCV(nmf,param_grid,cv=5,scoring='neg_mean_squared_error')

grid_search.fit(tfidf)

#輸出最佳參數(shù)

print("Bestalpha:",grid_search.best_params_['alpha'])6.3NMF結(jié)果可視化可視化NMF的結(jié)果可以幫助我們更好地理解主題和文檔的分布。我們可以使用降維技術(shù),如t-SNE,將高維的W矩陣轉(zhuǎn)換為二維空間,然后繪制散點(diǎn)圖。fromsklearn.manifoldimportTSNE

importmatplotlib.pyplotasplt

#使用t-SNE降維

tsne_model=TSNE(n_components=2,verbose=1,random_state=1)

tsne_lda=tsne_model.fit_transform(W)

#繪制散點(diǎn)圖

x=tsne_lda[:,0]

y=tsne_lda[:,1]

plt.scatter(x,y)

plt.show()此外,我們還可以通過(guò)繪制主題-詞矩陣H的熱力圖來(lái)查看每個(gè)主題的關(guān)鍵詞分布。importseabornassns

#繪制熱力圖

sns.heatmap(H,cmap='viridis')

plt.show()通過(guò)上述步驟,我們不僅實(shí)現(xiàn)了NMF,還進(jìn)行了參數(shù)調(diào)優(yōu)和結(jié)果可視化,這有助于我們深入理解非負(fù)矩陣分解在文本主題建模中的應(yīng)用。7進(jìn)階話題7.1NMF與PCA的比較7.1.1原理與內(nèi)容非負(fù)矩陣分解(NMF)和主成分分析(PCA)都是矩陣分解技術(shù),用于數(shù)據(jù)降維和特征提取。然而,它們?cè)谀繕?biāo)和適用場(chǎng)景上存在顯著差異。PCAPCA尋求找到數(shù)據(jù)的線性組合,以最大化方差。它不考慮數(shù)據(jù)的非負(fù)性,因此可以產(chǎn)生正負(fù)值的成分。PCA適用于任何類型的數(shù)據(jù),但當(dāng)數(shù)據(jù)具有非負(fù)性且需要解釋性較強(qiáng)的特征時(shí),PCA可能不是最佳選擇。NMFNMF專注于將非負(fù)矩陣分解為兩個(gè)非負(fù)矩陣的乘積,這在處理如圖像、文本和音頻等自然數(shù)據(jù)時(shí)特別有用,因?yàn)檫@些數(shù)據(jù)通常由非負(fù)元素組成。NMF的分解結(jié)果具有直觀的解釋性,可以被視為原始數(shù)據(jù)的“部分”或“基”。7.1.2示例假設(shè)我們有一組非負(fù)圖像數(shù)據(jù),我們使用NMF和PCA進(jìn)行降維,然后比較結(jié)果。importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.decompositionimportPCA,NMF

fromsklearn.datasetsimportfetch_olivetti_faces

#加載圖像數(shù)據(jù)

faces=fetch_olivetti_faces()

X=faces.data

#使用PCA降維

pca=PCA(n_components=15)

X_pca=pca.fit_transform(X)

#使用NMF降維

nmf=NMF(n_components=15)

X_nmf=nmf.fit_transform(X)

#可視化PCA和NMF的結(jié)果

defplot_components(X_transformed,title):

fig,axes=plt.subplots(3,5,figsize=(8,4),subplot_kw={'xticks':[],'yticks':[]})

fori,axinenumerate(axes.flat):

ax.imshow(X_transformed[i].reshape(64,64),cmap='gray')

fig.suptitle(title)

plot_components(ponents_,'PCAComponents')

plot_components(ponents_,'NMFComponents')

plt.show()解釋在上述代碼中,我們使用了sklearn庫(kù)中的PCA和NMF類來(lái)降維。PCA的成分可能包含正負(fù)值,而NMF的成分則完全非負(fù)。從可視化結(jié)果中,我們可以看到NMF的成分更接近于原始圖像的“部分”,而PCA的成分則更抽象,可能包含正負(fù)像素值的組合。7.2NMF的局限性與改進(jìn)方法7.2.1原理與內(nèi)容NMF的主要局限性在于其分解結(jié)果的唯一性問(wèn)題和計(jì)算效率。NMF的分解結(jié)果可能不是唯一的,即不同的初始化可能導(dǎo)致不同的解。此外,對(duì)于大規(guī)模數(shù)據(jù)集,NMF的計(jì)算可能非常耗時(shí)。改進(jìn)方法正則化:通過(guò)添加正則化項(xiàng),可以引導(dǎo)NMF找到更穩(wěn)定的解。初始化策略:使用特定的初始化策略,如nndsvd,可以提高解的穩(wěn)定性和質(zhì)量。并行計(jì)算:利用并行計(jì)算技術(shù),如sklearn中的n_jobs參數(shù),可以加速NMF的計(jì)算。7.2.2示例使用正則化和特定初始化策略來(lái)改進(jìn)NMF的穩(wěn)定性。fromsklearn.decompositionimportNMF

fromsklearn.datasetsimportfetch_olivetti_faces

#加載圖像數(shù)據(jù)

faces=fetch_olivetti_faces()

X=faces.data

#使用NMF降維,添加正則化和特定初始化策略

nmf=NMF(n_components=15,init='nndsvd',beta_loss='kullback-leibler',solver='mu',alpha=0.1)

X_nmf=nmf.fit_transform(X)

#可視化NMF的結(jié)果

defplot_components(X_transformed,title):

fig,axes=plt.subplots(3,5,figsize=(8,4),subplot_kw={'xticks':[],'yticks':[]})

fori,axinenumerate(axes.flat):

ax.imshow(X_transformed[i].reshape(64,64),cmap='gray')

fig.suptitle(title)

plot_components(ponents_,'NMFComponentswithRegularizationandSpecificInitialization')

plt.show()解釋在這個(gè)例子中,我們使用了nndsvd初始化策略,kullback-leibler損失函數(shù),以及mu求解器,這些都是為了提高NMF的穩(wěn)定性和計(jì)算效率。此外,我們添加了正則化項(xiàng)(alpha=0.1),以避免過(guò)擬合并引導(dǎo)NMF找到更穩(wěn)定的解。7.3NMF在深度學(xué)習(xí)中的應(yīng)用7.3.1原理與內(nèi)容NMF在深度學(xué)習(xí)中的應(yīng)用主要集中在預(yù)訓(xùn)練和特征學(xué)習(xí)上。在深度學(xué)習(xí)模型中,NMF可以作為預(yù)訓(xùn)練步驟,幫助模型學(xué)習(xí)到更有意義的特征表示。此外,NMF可以用于生成深度學(xué)習(xí)模型的輸入特征,特別是在處理圖像和文本數(shù)據(jù)時(shí)。7.3.2示例使用NMF預(yù)訓(xùn)練深度學(xué)習(xí)模型。importnumpyasnp

importtensorflowastf

fromsklearn.decompositionimportNMF

fromsklearn.datasetsimportfetch_olivetti_faces

#加載圖像數(shù)據(jù)

faces=fetch_olivetti_faces()

X=faces.data

#使用NMF降維

nmf=NMF(n_components=15)

X_nmf=nmf.fit_transform(X)

#構(gòu)建深度學(xué)習(xí)模型

model=tf.keras.models.Sequential([

tf.keras.layers.Dense(128,activation='relu',input_shape=(15,)),

tf.keras.layers.Dense(64,activation='relu'),

tf.keras.layers.Dense(10,activation='softmax')

])

#編譯模型

pile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

#使用NMF特征訓(xùn)練模型

#假設(shè)我們有10類標(biāo)簽,這里僅做示例,實(shí)際標(biāo)簽應(yīng)從數(shù)據(jù)集中獲取

y=np.random.randint(0,10,size=(X.shape[0],))

model.fit(X_nmf,y,epochs=10,batch_size=32)解釋在這個(gè)例子中,我們首先使用NMF將圖像數(shù)據(jù)降維到15個(gè)特征。然后,我們構(gòu)建了一個(gè)深度學(xué)習(xí)模型,使用NMF提取的特征作為輸入進(jìn)行訓(xùn)練。通過(guò)這種方式,NMF可以幫助深度學(xué)習(xí)模型學(xué)習(xí)到更緊湊、更有意義的特征表示,從而可能提高模型的性能和效率。以上示例和解釋展示了NMF與PCA的比較、NMF的局限性與改進(jìn)方法,以及NMF在深度學(xué)習(xí)中的應(yīng)用。通過(guò)這些進(jìn)階話題的探討,我們不僅理解了NMF的基本原理,還深入到了其在實(shí)際場(chǎng)景中的應(yīng)用和優(yōu)化策略。8NMF在無(wú)監(jiān)督學(xué)習(xí)中的地位非負(fù)矩陣分解(Non-negativeMatrixFactorization,NMF)是一種在無(wú)監(jiān)督學(xué)習(xí)中廣泛應(yīng)用的矩陣分解技術(shù),尤其在處理非負(fù)數(shù)據(jù)集時(shí)表現(xiàn)出色。NMF的目標(biāo)是將一個(gè)非負(fù)矩陣分解為兩個(gè)非負(fù)矩陣的乘積,這一過(guò)程有助于揭示數(shù)據(jù)的潛在結(jié)構(gòu)和特征。在無(wú)監(jiān)督學(xué)習(xí)的背景下,NMF可以用于聚類、降維、特征學(xué)習(xí)等任務(wù),無(wú)需事先標(biāo)記數(shù)據(jù),從而在大規(guī)模數(shù)據(jù)集的分析中提供了一種高效且直觀的方法。8.1NMF的聚類應(yīng)用NMF可以作為一種聚類方法,通過(guò)分解數(shù)據(jù)矩陣,自動(dòng)識(shí)別數(shù)據(jù)中的主題或模式。例如,在文本分析中,NMF可以將文檔-詞矩陣分解為文檔-主題矩陣和主題-詞矩陣,從而識(shí)別出文檔的主題分布。8.1.1示例代碼假設(shè)我們有一組文檔,表示為一個(gè)文檔-詞矩陣V,我們使用NMF來(lái)識(shí)別其中的主題。importnumpyasnp

fromsklearn.decompositionimportNMF

fromsklearn.f

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論