@@ -85,9 +85,17 @@ def cosSim(inA, inB):
8585
8686
8787# 基于物品相似度的推荐引擎
88- # standEst()函数,用来计算在给定相似度计算方法的条件下,用户对物品的估计评分值。
89- # standEst()函数的参数包括数据矩阵、用户编号、物品编号和相似度计算方法
9088def standEst (dataMat , user , simMeas , item ):
89+ """standEst(计算某用户未评分物品中,以对该物品和其他物品评分的用户的物品相似度,然后进行综合评分)
90+
91+ Args:
92+ dataMat 训练数据集
93+ user 用户编号
94+ simMeas 相似度计算方法
95+ item 未评分的物品编号
96+ Returns:
97+ ratSimTotal/simTotal 评分(0~5之间的值)
98+ """
9199 # 得到数据集中的物品数目
92100 n = shape (dataMat )[1 ]
93101 # 初始化两个评分值
@@ -100,7 +108,8 @@ def standEst(dataMat, user, simMeas, item):
100108 if userRating == 0 :
101109 continue
102110 # 寻找两个用户都评级的物品
103- # 变量 overLap 给出的是两个物品当中已经被评分的那个元素
111+ # 变量 overLap 给出的是两个物品当中已经被评分的那个元素的索引ID
112+ # logical_and 计算x1和x2元素的真值。
104113 overLap = nonzero (logical_and (dataMat [:, item ].A > 0 , dataMat [:, j ].A > 0 ))[0 ]
105114 # 如果相似度为0,则两着没有任何重合元素,终止本次循环
106115 if len (overLap ) == 0 :
@@ -114,35 +123,25 @@ def standEst(dataMat, user, simMeas, item):
114123 simTotal += similarity
115124 ratSimTotal += similarity * userRating
116125 if simTotal == 0 :
117- return 0
126+ return 0
118127 # 通过除以所有的评分总和,对上述相似度评分的乘积进行归一化,使得最后评分在0~5之间,这些评分用来对预测值进行排序
119128 else :
120129 return ratSimTotal / simTotal
121130
122131
123- # recommend()函数,就是推荐引擎,它默认调用standEst()函数,产生了最高的N个推荐结果。
124- # 如果不指定N的大小,则默认值为3。该函数另外的参数还包括相似度计算方法和估计方法
125- def recommend (dataMat , user , N = 3 , simMeas = cosSim , estMethod = standEst ):
126- # 寻找未评级的物品
127- # 对给定的用户建立一个未评分的物品列表
128- unratedItems = nonzero (dataMat [user , :].A == 0 )[1 ]
129- # 如果不存在未评分物品,那么就退出函数
130- if len (unratedItems ) == 0 :
131- return 'you rated everything'
132- # 物品的编号和评分值
133- itemScores = []
134- # 在未评分物品上进行循环
135- for item in unratedItems :
136- estimatedScore = estMethod (dataMat , user , simMeas , item )
137- # 寻找前N个未评级物品,调用standEst()来产生该物品的预测得分,该物品的编号和估计值会放在一个元素列表itemScores中
138- itemScores .append ((item , estimatedScore ))
139- # 按照估计得分,对该列表进行排序并返回。列表逆排序,第一个值就是最大值
140- return sorted (itemScores , key = lambda jj : jj [1 ], reverse = True )[: N ]
141-
142-
143132# 基于SVD的评分估计
144133# 在recommend() 中,这个函数用于替换对standEst()的调用,该函数对给定用户给定物品构建了一个评分估计值
145134def svdEst (dataMat , user , simMeas , item ):
135+ """svdEst( )
136+
137+ Args:
138+ dataMat 训练数据集
139+ user 用户编号
140+ simMeas 相似度计算方法
141+ item 未评分的物品编号
142+ Returns:
143+ ratSimTotal/simTotal 评分(0~5之间的值)
144+ """
146145 # 物品数目
147146 n = shape (dataMat )[1 ]
148147 # 对数据集进行SVD分解
@@ -176,6 +175,36 @@ def svdEst(dataMat, user, simMeas, item):
176175 return ratSimTotal / simTotal
177176
178177
178+ # recommend()函数,就是推荐引擎,它默认调用standEst()函数,产生了最高的N个推荐结果。
179+ # 如果不指定N的大小,则默认值为3。该函数另外的参数还包括相似度计算方法和估计方法
180+ def recommend (dataMat , user , N = 3 , simMeas = cosSim , estMethod = standEst ):
181+ """svdEst( )
182+
183+ Args:
184+ dataMat 训练数据集
185+ user 用户编号
186+ simMeas 相似度计算方法
187+ estMethod 使用的推荐算法
188+ Returns:
189+ 返回最终 N 个推荐结果
190+ """
191+ # 寻找未评级的物品
192+ # 对给定的用户建立一个未评分的物品列表
193+ unratedItems = nonzero (dataMat [user , :].A == 0 )[1 ]
194+ # 如果不存在未评分物品,那么就退出函数
195+ if len (unratedItems ) == 0 :
196+ return 'you rated everything'
197+ # 物品的编号和评分值
198+ itemScores = []
199+ # 在未评分物品上进行循环
200+ for item in unratedItems :
201+ # 获取 item 该物品的评分
202+ estimatedScore = estMethod (dataMat , user , simMeas , item )
203+ itemScores .append ((item , estimatedScore ))
204+ # 按照评分得分 进行逆排序,获取前N个未评级物品进行推荐
205+ return sorted (itemScores , key = lambda jj : jj [1 ], reverse = True )[: N ]
206+
207+
179208# 图像压缩函数
180209# 打印矩阵
181210def printMat (inMat , thresh = 0.8 ):
0 commit comments