SVD 提高推荐效率
# 基于SVD的评分估计
# 与standEst()非常相似,不同之处就在于它在第3行对数据集进行了SVD分解。在SVD分解后,只利用包含90%能量值的奇异值,这些奇异值以Numpy数组的形式得以保存。
def svdEst(dataMat, user, simMeas, item) :
n = shape(dataMat)[1]
simTotal = 0.0; ratSimTotal = 0.0
U,Sigma,VT = la.svd(dataMat)
# 使用奇异值构建一个对角矩阵
Sig4 = mat(eye(4)*Sigma[:4])
# 利用U矩阵将物品转换到低维空间中
xformedItems = dataMat.T * U[:, :4] * Sig4.I
# 对于给定的用户,for循环在用户对应行的所有元素上进行遍历,与standEst()函数中的for循环目的一样
# 不同的是,这里的相似度是在低维空间下进行的。相似度的计算方法也会作为一个参数传递给该函数
for j in range(n) :
userRating = dataMat[user,j]
if userRating == 0 or j == item : continue
similarity = simMeas(xformedItems[item, :].T, xformedItems[j, :].T)
# print便于了解相似度计算的进展情况
print 'the %d and %d similarity is : %f' % (item, j, similarity)
# 对相似度求和
simTotal += similarity
# 对相似度及评分值的乘积求和
ratSimTotal += similarity * userRating
if simTotal == 0 : return 0
else : return ratSimTotal/simTotal
用户评论