歡迎關(guān)注 『Python』 系列,持續(xù)更新中
歡迎關(guān)注 『Python』 系列,持續(xù)更新中
算法說明(百度百科)
從多元統(tǒng)計(jì)的觀點(diǎn)看,NMF是在非負(fù)性的限制下,在盡可能保持信息不變的情況下,將高維的隨機(jī)模式簡化為低維的隨機(jī)模式H,而這種簡化的基礎(chǔ)是估計(jì)出數(shù)據(jù)中的本質(zhì)結(jié)構(gòu)W;從代數(shù)的觀點(diǎn)看,NMF是發(fā)現(xiàn)數(shù)據(jù)的一種內(nèi)在非負(fù)(或蘊(yùn)涵更多性質(zhì)的)代數(shù)分解形式或表示方法;從維數(shù)約減的觀點(diǎn)看,因?yàn)榛仃嘩和系數(shù)矩陣H同時由NMF來確定,系數(shù)矩陣H并非為數(shù)據(jù)矩陣V在W上的投影,所以NMF實(shí)現(xiàn)的是非線性的維數(shù)約減。
NMF最成功的一類應(yīng)用是在圖像的分析和處理領(lǐng)域。圖像本身包含大量的數(shù)據(jù),計(jì)算機(jī)一般將圖像的信息按照矩陣的形式進(jìn)行存放,針對圖像的識別、分析和處理也是在矩陣的基礎(chǔ)上進(jìn)行的。這些特點(diǎn)使得NMF方法能很好地與圖像分析處理相結(jié)合。人們已經(jīng)利用NMF算法,對衛(wèi)星發(fā)回的圖像進(jìn)行處理,以自動辨別太空中的垃圾碎片;使用NMF算法對天文望遠(yuǎn)鏡拍攝到的圖像進(jìn)行分析,有助于天文學(xué)家識別星體;美國還嘗試在機(jī)場安裝由NMF算法驅(qū)動的識別系統(tǒng),根據(jù)事先輸入計(jì)算機(jī)的恐怖分子的特征圖像庫來自動識別進(jìn)出機(jī)場的可疑恐怖分子。
基本例程
import numpy as np
import torch
import random
import matplotlib.pyplot as plt
def nmf(X, r, maxiter, minError):
# X=U*V'
row, col = X.shape
U = np.around(np.array(np.random.rand(row, r)), 5)#
V = np.around(np.array(np.random.rand(col, r)), 5)
obj = []
for iter in range(maxiter):
print('-----------------------------')
print('開始第', iter, '次迭代')
# update U
XV = np.dot(X, V)# np.dot(a ,b), 其中a和b都是二維矩陣,此時dot就是進(jìn)行的矩陣乘法運(yùn)算
UVV = np.dot(U, np.dot(V.T, V))
U = (U * (XV / np.maximum(UVV, 1e-10)))
# update V
XU = np.dot(X.T, U)
VUU = np.dot(V, np.dot(V.T, V))
V = (V * (XU / np.maximum(VUU, 1e-10)))
d = np.diag(1 / np.maximum(np.sqrt(np.sum(V * V, 0)), 1e-10))
V = np.dot(V, d)
temp = X - np.dot(U, np.transpose(V))#計(jì)算損失
error = np.sum(temp * temp)#損失和
print('error:', error)
print('第', iter, '次迭代結(jié)束')
obj.append(error)
if error < minError:
break
return U, V, obj
if __name__ == "__main__":
X = np.random.randn(20, 50)# 生成20行50列矩陣,服從標(biāo)準(zhǔn)正態(tài)分布的隨機(jī)樣本值。
X = np.array(np.abs(X)) # 確保非負(fù)
print("X shape\n", X.shape)# (20, 50)
# print('X:',X)#初始待分解的矩陣
U, V, obj = nmf(X, 2, 100, 0.01)
print("U\n",U)# # X=U*V'
print("U shape\n", U.shape)#(20, 2)
print("V\n",V)# # X=U*V'
print("V shape\n", V.shape)# (50, 2)
x = range(len(obj))
plt.plot(x, obj)
plt.show()
總結(jié)
大家喜歡的話,給個??,點(diǎn)個關(guān)注!繼續(xù)跟大家分享敲代碼過程中遇到的問題!
版權(quán)聲明:
發(fā)現(xiàn)你走遠(yuǎn)了@mzh原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接
Copyright 2022 mzh
Crated:2022-1-10文章來源:http://www.zghlxwxcb.cn/news/detail-628105.html
歡迎關(guān)注 『Python』 系列,持續(xù)更新中
歡迎關(guān)注 『Python』 系列,持續(xù)更新中
【Python安裝第三方庫一行命令永久提高速度】
【使用PyInstaller打包Python文件】
【更多內(nèi)容敬請期待】文章來源地址http://www.zghlxwxcb.cn/news/detail-628105.html
到了這里,關(guān)于【Python】NMF非負(fù)矩陣分解算法(測試代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!