Skip to content

Commit 7b74371

Browse files
更新 SVD 推荐系统的注释
1 parent 14345cb commit 7b74371

6 files changed

Lines changed: 44 additions & 31 deletions

File tree

docs/14.利用SVD简化数据.md

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -142,34 +142,44 @@
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
348358
def 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
# 打印矩阵
372385
def printMat(inMat, thresh=0.8):
26.1 KB
Loading
-10.3 KB
Binary file not shown.
64.3 KB
Loading
64.5 KB
Loading

src/python/14.SVD/svdRecommend.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -303,15 +303,15 @@ def imgCompress(numSV=3, thresh=0.8):
303303
if __name__ == "__main__":
304304

305305
# # 对矩阵进行SVD分解(用python实现SVD)
306-
Data = loadExData()
307-
print 'Data:', Data
308-
U, Sigma, VT = linalg.svd(Data)
306+
# Data = loadExData()
307+
# print 'Data:', Data
308+
# U, Sigma, VT = linalg.svd(Data)
309309
# # 打印Sigma的结果,因为前3个数值比其他的值大了很多,为9.72140007e+00,5.29397912e+00,6.84226362e-01
310310
# # 后两个值比较小,每台机器输出结果可能有不同可以将这两个值去掉
311-
print 'U:', U
312-
print 'Sigma', Sigma
313-
print 'VT:', VT
314-
print 'VT:', VT.T
311+
# print 'U:', U
312+
# print 'Sigma', Sigma
313+
# print 'VT:', VT
314+
# print 'VT:', VT.T
315315

316316
# # 重构一个3x3的矩阵Sig3
317317
# Sig3 = mat([[Sigma[0], 0, 0], [0, Sigma[1], 0], [0, 0, Sigma[2]]])
@@ -335,15 +335,15 @@ def imgCompress(numSV=3, thresh=0.8):
335335
"""
336336

337337
# 计算相似度的方法
338-
# myMat = mat(loadExData2())
338+
myMat = mat(loadExData3())
339339
# print myMat
340340
# 计算相似度的第一种方式
341-
# print recommend(myMat, 1, estMethod=svdEst)
341+
print recommend(myMat, 1, estMethod=svdEst)
342342
# 计算相似度的第二种方式
343-
# print recommend(myMat, 1, estMethod=svdEst, simMeas=pearsSim)
343+
print recommend(myMat, 1, estMethod=svdEst, simMeas=pearsSim)
344344

345345
# 默认推荐(菜馆菜肴推荐示例)
346-
# print recommend(myMat, 2)
346+
print recommend(myMat, 2)
347347

348348
"""
349349
# 利用SVD提高推荐效果

0 commit comments

Comments
 (0)