测试代码
# 计算相似度的方法 myMat = mat(loadExData3()) # 计算相似度的第一种方式 # print(recommend(myMat, 1, estMethod=svdEst)) # 计算相似度的第二种方式 # print(recommend(myMat, 1, estMethod=svdEst, simMeas=pearsSim)) # 默认推荐(菜馆菜肴推荐示例) print(recommend(myMat, 2))运行结果
菜馆菜肴推荐结果: [(3, 4.0), (5, 4.0), (6, 4.0)] ***Repl Closed***分析结果,我们不难发现,分别对3烤牛肉,5鲁宾三明治、6印度烤鸡给我4星好评,推荐给我们的用户。
要点补充基于内容(content-based)的推荐
通过各种标签来标记菜肴
将这些属性作为相似度计算所需要的数据
这就是:基于内容的推荐。
构建推荐引擎面临的挑战
问题
1)在大规模的数据集上,SVD分解会降低程序的速度
2)存在其他很多规模扩展性的挑战性问题,比如矩阵的表示方法和计算相似度得分消耗资源。
3)如何在缺乏数据时给出好的推荐-称为冷启动【简单说:用户不会喜欢一个无效的物品,而用户不喜欢的物品又无效】
建议
1)在大型系统中,SVD分解(可以在程序调入时运行一次)每天运行一次或者其频率更低,并且还要离线运行。
2)在实际中,另一个普遍的做法就是离线计算并保存相似度得分。(物品相似度可能被用户重复的调用)
3)冷启动问题,解决方案就是将推荐看成是搜索问题,通过各种标签/属性特征进行基于内容的推荐。
项目案例: 基于SVD的图像压缩 收集并准备数据将文本数据转化为矩阵
'''图像压缩函数''' def imgLoadData(filename): myl = [] for line in open(filename).readlines(): newRow = [] for i in range(32): newRow.append(int(line[i])) myl.append(newRow) # 矩阵调入后,就可以在屏幕上输出该矩阵 myMat = mat(myl) return myMat 分析数据: 分析Sigma的长度个数通常保留矩阵 80% ~ 90% 的能量,就可以得到重要的特征并去除噪声。
'''分析 Sigma 的长度取值 根据自己的业务情况,就行处理,设置对应的 Singma 次数 通常保留矩阵 80% ~ 90% 的能量,就可以得到重要的特征并取出噪声。 ''' def analyse_data(Sigma, loopNum=20): # 总方差的集合(总能量值) Sig2 = Sigma**2 SigmaSum = sum(Sig2) for i in range(loopNum): SigmaI = sum(Sig2[:i+1]) print('主成分:%s, 方差占比:%s%%' % (format(i+1, '2.0f'), format(SigmaI/SigmaSum*100, '.2f'))) 使用算法: 对比使用 SVD 前后的数据差异对比,对于存储大家可以试着写写