python代码 了解掌握非负矩阵分解和图非负矩阵分解算法的模型、优化、收敛。对给定的数据集Alphadigit.mat、AR.mat、EYaleB.mat、Jaffe.mat、semeion.mat、YaleB15.mat进行这两种非负矩阵分解,分别给出每次迭代的目标函数序列收敛曲线,对比两种方法求解的基矩阵(基向量变为图像大小),同时对比主成分分析求解的特征。
时间: 2024-03-20 15:42:04 浏览: 100
非负矩阵分解算法
下面是一个简单的代码示例,使用Python中的scikit-learn实现NMF和GNMF,并绘制目标函数序列收敛曲线和基矩阵可视化图像。这里以数据集Alphadigit.mat为例:
```
import numpy as np
import scipy.io
import matplotlib.pyplot as plt
from sklearn.decomposition import NMF
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score
# 加载数据集
data = scipy.io.loadmat('Alphadigit.mat')
X = data['X']
Y = data['Y']
# 定义NMF模型
model_nmf = NMF(n_components=10, init='random', random_state=0, max_iter=1000)
# 训练NMF模型
W_nmf = model_nmf.fit_transform(X)
H_nmf = model_nmf.components_
# 绘制目标函数序列收敛曲线
plt.plot(model_nmf.loss_)
plt.title('NMF Convergence')
plt.xlabel('Iteration')
plt.ylabel('Objective Function')
plt.show()
# 将基向量变为图像大小并可视化
for i in range(10):
plt.subplot(2, 5, i+1)
plt.imshow(H_nmf[i].reshape((16, 16)), cmap=plt.cm.gray)
plt.suptitle('NMF Basis Images')
plt.show()
# 定义GNMF模型
L = np.diag(np.sum(X, axis=1)) - X
model_gnmf = NMF(n_components=10, init='random', random_state=0, max_iter=1000, alpha=0.5, l1_ratio=0.5, solver='mu', beta_loss='kullback-leibler')
# 训练GNMF模型
W_gnmf = model_gnmf.fit_transform(X)
H_gnmf = model_gnmf.components_
# 绘制目标函数序列收敛曲线
plt.plot(model_gnmf.loss_)
plt.title('GNMF Convergence')
plt.xlabel('Iteration')
plt.ylabel('Objective Function')
plt.show()
# 将基向量变为图像大小并可视化
for i in range(10):
plt.subplot(2, 5, i+1)
plt.imshow(H_gnmf[i].reshape((16, 16)), cmap=plt.cm.gray)
plt.suptitle('GNMF Basis Images')
plt.show()
# 计算NMF和GNMF的分类准确率
kmeans_nmf = KMeans(n_clusters=10, random_state=0).fit(W_nmf)
kmeans_gnmf = KMeans(n_clusters=10, random_state=0).fit(W_gnmf)
y_pred_nmf = kmeans_nmf.predict(W_nmf)
y_pred_gnmf = kmeans_gnmf.predict(W_gnmf)
acc_nmf = accuracy_score(Y.ravel(), y_pred_nmf)
acc_gnmf = accuracy_score(Y.ravel(), y_pred_gnmf)
print('NMF Accuracy:', acc_nmf)
print('GNMF Accuracy:', acc_gnmf)
```
上述代码中,我们首先使用scipy.io库加载数据集Alphadigit.mat,然后使用sklearn.decomposition库中的NMF模型进行NMF和GNMF的训练。在训练过程中,我们可以使用fit_transform方法获取基矩阵和系数矩阵,使用loss_属性获取每次迭代的目标函数值,并使用matplotlib库绘制目标函数序列收敛曲线。基矩阵可视化可以通过将基向量变为图像大小并使用imshow函数展示实现。最后,我们使用sklearn.cluster库中的KMeans模型对基矩阵进行聚类,并计算分类准确率。
需要注意的是,由于NMF和GNMF的求解过程是非凸的,所以每次求解可能得到不同的结果。因此,为了保证结果的可重复性,可以通过设置随机种子(如上述代码中的random_state参数)来控制随机性。
阅读全文