142142
143143` 假如一个人在家决定外出吃饭,但是他并不知道该到哪儿去吃饭,该点什么菜。推荐系统可以帮他做到这两点。 `
144144
145-
146145#### 开发流程
147146
148147> 收集 并 准备数据
149148
149+ ![ SVD 矩阵] ( /images/14.SVD/项目数据导入.jpg )
150+
150151``` python
151- def loadExData2 ():
152- # 书上代码给的示例矩阵
153- return [[0 , 0 , 0 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 5 ],
154- [0 , 0 , 0 , 3 , 0 , 4 , 0 , 0 , 0 , 0 , 3 ],
155- [0 , 0 , 0 , 0 , 4 , 0 , 0 , 1 , 0 , 4 , 0 ],
156- [3 , 3 , 4 , 0 , 0 , 0 , 0 , 2 , 2 , 0 , 0 ],
157- [5 , 4 , 5 , 0 , 0 , 0 , 0 , 5 , 5 , 0 , 0 ],
158- [0 , 0 , 0 , 0 , 5 , 0 , 1 , 0 , 0 , 5 , 0 ],
159- [4 , 3 , 4 , 0 , 0 , 0 , 0 , 5 , 5 , 0 , 1 ],
160- [0 , 0 , 0 , 4 , 0 , 4 , 0 , 0 , 0 , 0 , 4 ],
161- [0 , 0 , 0 , 2 , 0 , 2 , 5 , 0 , 0 , 1 , 2 ],
162- [0 , 0 , 0 , 0 , 5 , 0 , 0 , 0 , 0 , 4 , 0 ],
163- [1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 2 , 0 , 0 ]]
152+ def loadExData3 ():
153+ # 利用SVD提高推荐效果,菜肴矩阵
154+ """
155+ 行:代表人
156+ 列:代表菜肴名词
157+ 值:代表人对菜肴的评分,0表示未评分
158+ """
159+ return [[2 , 0 , 0 , 4 , 4 , 0 , 0 , 0 , 0 , 0 , 0 ],
160+ [0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 ],
161+ [0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 4 , 0 ],
162+ [3 , 3 , 4 , 0 , 3 , 0 , 0 , 2 , 2 , 0 , 0 ],
163+ [5 , 5 , 5 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],
164+ [0 , 0 , 0 , 0 , 0 , 0 , 5 , 0 , 0 , 5 , 0 ],
165+ [4 , 0 , 4 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 ],
166+ [0 , 0 , 0 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 4 ],
167+ [0 , 0 , 0 , 0 , 0 , 0 , 5 , 0 , 0 , 5 , 0 ],
168+ [0 , 0 , 0 , 3 , 0 , 0 , 0 , 0 , 4 , 5 , 0 ],
169+ [1 , 1 , 2 , 1 , 1 , 2 , 1 , 0 , 4 , 5 , 0 ]]
164170```
165171
166- > 分析数据: 暂时不需要 (当然此处可以对比不同距离之间的差别)
172+ > 分析数据: 这里不做过多的讨论 (当然此处可以对比不同距离之间的差别)
167173
168174> 训练算法: 通过调用 recommend() 函数进行推荐
169175
170- * 基于物品相似度(参考地址:http://www.codeweblog.com/svd-%E7%AC%94%E8%AE%B0/ )
176+ recommend() 会调用 基于物品相似度 或者是 基于SVD,得到推荐的物品评分。
177+
178+ * 1.基于物品相似度
171179
172- ![ 基于物品相似度] ( /images/14.SVD/基于物品相似度.png )
180+ ![ 基于物品相似度] ( /images/14.SVD/基于物品相似度.jpg )
181+
182+ ![ 欧式距离的计算方式] ( /images/14.SVD/欧式距离的计算方式.jpg )
173183
174184``` python
175185# 基于物品相似度的推荐引擎
@@ -217,7 +227,7 @@ def standEst(dataMat, user, simMeas, item):
217227 return ratSimTotal/ simTotal
218228```
219229
220- * 基于SVD(参考地址:http://www.codeweblog.com/svd-%E7%AC%94%E8%AE%B0/ )
230+ * 2. 基于SVD(参考地址:http://www.codeweblog.com/svd-%E7%AC%94%E8%AE%B0/ )
221231
222232![ 基于SVD.png] ( /images/14.SVD/基于SVD.png )
223233
@@ -295,7 +305,7 @@ def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst):
295305 return sorted (itemScores, key = lambda jj : jj[1 ], reverse = True )[: N]
296306```
297307
298- > 测试 和 使用 该算法,可以自行编写
308+ > 测试 和 项目调用,可直接参考我们的代码
299309
300310[ 完整代码地址] ( https://github.com/apachecn/MachineLearning/blob/master/src/python/14.SVD/svdRecommend.py ) : < https://github.com/apachecn/MachineLearning/blob/master/src/python/14.SVD/svdRecommend.py >
301311
@@ -342,7 +352,7 @@ def imgLoadData(filename):
342352
343353> 分析数据: 分析 Sigma 的长度个数
344354
345- 通常保留矩阵 80% ~ 90% 的能量,就可以得到重要的特征并取出噪声 。
355+ 通常保留矩阵 80% ~ 90% 的能量,就可以得到重要的特征并去除噪声 。
346356
347357``` python
348358def analyse_data (Sigma , loopNum = 20 ):
@@ -367,6 +377,9 @@ def analyse_data(Sigma, loopNum=20):
367377
368378> 使用算法: 对比使用 SVD 前后的数据差异对比,对于存储大家可以试着写写
369379
380+
381+ 例如:` 32*32=1024 => 32*2+2*1+32*2=130 ` (2* 1表示去掉了除对角线的0), 几乎获得了10倍的压缩比。
382+
370383``` python
371384# 打印矩阵
372385def printMat (inMat , thresh = 0.8 ):
0 commit comments