import os
import numpy as np
from openpyxl import load_workbook
from collections import defaultdict
from sklearn.decomposition import NMF
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties #字体管理器
#设置中文字体
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=15)
ExData=load_workbook('C:\\Users\\86135\\Desktop\\dataming\\NMF filmremarks.xlsx')
Mscore=ExData['score']
Mname=ExData['name']
#读入电影名称并载入到字典
DictMname={}
keys=[]
values=[]
for data in Mname.iter_cols(1,1,2,11):
for cell in data:
keys.append(cell.value)
for data in Mname.iter_cols(2,2,2,11):
for cell in data:
values.append(cell.value)
DictMname=dict(zip(keys,values))
print(DictMname)
#读入电影评分并载入到矩阵
ScoreMat=np.matrix(np.zeros((10,10)),dtype=float)
for data in Mscore.iter_cols(2,11,2,11):
for cell in data:
col_index=cell.col_idx #获取所在列号
row_index=cell.row #获取所在行号
ScoreMat[row_index-2,col_index-2]=cell.value
print("电影评分矩阵:")
print(ScoreMat)
#对数据进行非负矩阵转换
MaxWD=2 #设定降维后的维度数
nmf=None
nmf=NMF(n_components=MaxWD,random_state=1)
ADash=nmf.fit_transform(ScoreMat)
#查看降维后的矩阵内容,本例为用户按降维后的成分的综合评分情况
for i in range(ADash.shape[0]):
print("用户ID:%d,成分1得分:%0.2f,成分2得分:%0.2f"%(i+1,ADash[i][0],ADash[i][1]))
plt.figure(1)
plt.title("用户喜好评分概况",fontproperties=font)
x=ADash[:,0]
y=ADash[:,1]
plt.scatter(x,y)
plt.xlabel("成分1得分",fontproperties=font)
plt.ylabel("成分2得分",fontproperties=font)
#检查成分矩阵H,本例为每部电影在降维后的成分中的综合得分情况
H=nmf.components_
plt.figure(2)
plt.title("电影评分概况",fontproperties=font)
x=H[0,:]
y=H[1,:]
plt.scatter(x,y)
for i in range(H[0,:].shape[0]):
plt.annotate(DictMname[i+1],(H[0,:][i],H[1,:][i]),fontproperties=font)
plt.show()
CG=np.dot(ADash,H)
np.set_printoptions(precision=1)
print(CG)
导师让我们跑一遍流程就行 但是复制过来用不了 额 非编程专业! 请理解 求帮助 我的数据文件excel见下方 导入的时候我是看不懂这几句 我怎么改才能实现程序要做的事情?
Mscore=ExData['score']
Mname=ExData['name']
#读入电影名称并载入到字典
DictMname={}
keys=[]
values=[]
与使用 PCA
不同,我们需要保证数据是正的,NMF 能够对数据进行操作。这说明数据相对于原点 (0, 0) 的位置实际上对 NMF 很重要。因此,你可以将提取出来的非负分量看作是从 (0, 0) 到数据的方向。
下面的例子(图 3-13)给出了 NMF 在二维玩具数据上的结果:
mglearn.plots.plot_nmf_illustration()
对于两个分量的 NMF
(如左图所示),显然所有数据点都可以写成这两个分量的正数组合。如果有足够多的分量能够完美地重建数据(分量个数与特征个数相同),那么算法会选择指向数据极值的方向。
如果我们仅使用一个分量,那么 NMF
会创建一个指向平均值的分量,因为指向这里可以对数据做出最好的解释。你可以看到,与 PCA
不同,减少分量个数不仅会删除一些方向,而且会创建一组完全不同的分量! NMF
的分量也没有按任何特定方法排序,所以不存在 “第一非负分量”:所有分量的地位平等。
NMF
使用了随机初始化,根据随机种子的不同可能会产生不同的结果。在相对简单的情况下(比如两个分量的模拟数据),所有数据都可以被完美地解释,那么随机性的影响很小(虽然可能会影响分量的顺序或尺度)。在更加复杂的情况下,影响可能会很大。