一步步教你轻松学奇异值分解SVD降维算法 (5)

测试代码

# 计算相似度的方法 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 前后的数据差异对比,对于存储大家可以试着写写

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyfzw.html