求解:NMF处理时我连数据导入都不会?

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=[]

img

img

  • 这篇博客: 机器学习学习笔记之——无监督学习之降维、特征提取与流形学习中的 2.1、将 NMF 应用于模拟数据 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 与使用 PCA 不同,我们需要保证数据是正的,NMF 能够对数据进行操作。这说明数据相对于原点 (0, 0) 的位置实际上对 NMF 很重要。因此,你可以将提取出来的非负分量看作是从 (0, 0) 到数据的方向。

    下面的例子(图 3-13)给出了 NMF 在二维玩具数据上的结果:

    mglearn.plots.plot_nmf_illustration()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xukq16au-1607430645253)(../素材/两个分量的非负矩阵分解(左)和一个分量的非负矩阵分解(右)找到的分量.png)]

    对于两个分量的 NMF(如左图所示),显然所有数据点都可以写成这两个分量的正数组合。如果有足够多的分量能够完美地重建数据(分量个数与特征个数相同),那么算法会选择指向数据极值的方向

    如果我们仅使用一个分量,那么 NMF 会创建一个指向平均值的分量,因为指向这里可以对数据做出最好的解释。你可以看到,PCA 不同,减少分量个数不仅会删除一些方向,而且会创建一组完全不同的分量NMF 的分量也没有按任何特定方法排序,所以不存在 “第一非负分量”:所有分量的地位平等

    NMF 使用了随机初始化,根据随机种子的不同可能会产生不同的结果。在相对简单的情况下(比如两个分量的模拟数据),所有数据都可以被完美地解释,那么随机性的影响很小(虽然可能会影响分量的顺序或尺度)。在更加复杂的情况下,影响可能会很大。