推荐系统顾名思义就是为用户进行推荐的系统. 无论是商品、音乐、书籍 或 电影, 都能够通过这样的一个系统对使用者进行推荐.
像淘宝中给你推荐你可能感兴趣的商品, 抖音软件中你下一条即将播放的视频, 这些都算是推荐系统的实际运用场景.
关于推荐系统一词, 很多人的第一印象是亚马逊当年号称有 20% 的成交来源于推荐, 就像很多人讲大数据, 总是会提啤酒和尿布的故事(世界杯的时候, 丈夫会在购买啤酒的同时购买尿布).
在 PC 时代, 推荐系统更像是一个补充. PC 屏幕很大, 推荐的场景能出现在各种地方, 比如很多电商公司的看了又看、买了又买, 都是很大的推荐场景. 这个时候的技术, 和机器学习的关系并不大, 以数据挖掘为主.
推荐系统井喷式的发展是在移动互联网时代, 每个人只要拥有一个移动设备就能成为推荐系统的数据来源, 而且更具有说服力.
在推荐系统中需要不断提升的应该是用户对推荐的事物的满意程度. 这应该算是推荐系统的终极目标, 但是满意程度只是一个感觉. 在推荐系统中也就只能通过对事物的评分来描述满意程度.
人是善变的生物, 对事物打分也不一定是绝对理智的行为. 这是不能被忽视的因素. 这也导致整个系统的复杂度将提升.
推荐系统最大的优点是千人千面, 最大的缺点是号称千人千面; 千人千面听着非常美好, 如果能做到, 那就可以用一个 super app 满足所有人的需求.
可惜现实是残酷的, 技术的发展远不如预期, 无论做再好的推荐系统, 目前的主流技术都是基于 behavior 的. 第一个问题就是用户的冷启动, 当用户不留下 behavior 时, 各大推荐系统都很难有好的表现. 此时应用也就只能推荐一些热门产品给用户.
再者, 我们放弃主动选择信息转而交给推荐系统这一行为, 很有可能导致我们走向信息茧房.
所谓信息茧房是指一个人会不断地看到自己所看过的、或者是感兴趣的东西, 长此以往, 他就会变得越来越不能包容其他事物, 越来越偏执, 犹如陷入蚕茧一般.
用一个不恰当的比喻来说明3种数据集之间的关系 :
训练集 : 学生的课本, 学生根据课本里的内容来掌握知识.
测试集 : 考试, 考的题是平常都没有见过, 考察学生举一反三的能力.
验证集 : 作业, 通过作业可以知道不同学生学习情况、进步的速度快慢.
传统上, 一般三者切分的比例是 6 : 2 : 2, 验证集并不是必须的. 当然也有 8 : 1 : 1 比例的划分
训练集直接参与了模型调参的过程, 显然不能用来反映模型真实的能力 ( 防止课本死记硬背的学生拥有最好的成绩, 即防止过拟合 )
验证集参与了人工调参 ( 超参数 ) 的过程, 也不能用来最终评判一个模型( 刷题库的学生不能算是学习好的学生 )
所以要通过最终的考试 ( 测试集 ) 来考察一个学 ( 模 ) 生 ( 型 ) 真正的能力 ( 期末考试 )
先写出奇异值分解公式
A = U Σ V T A = U \Sigma V^{\mathrm{T}} A=UΣVT
其中
Σ
=
[
σ
1
⋯
σ
r
]
\Sigma =
常规求解方式是利用
A
T
A
=
V
Σ
T
U
T
U
Σ
V
T
=
V
Σ
T
Σ
V
T
=
V
[
σ
1
2
σ
2
2
⋱
σ
r
2
]
V
T
这个式子是正定矩阵 A T A A^{\mathrm{T}}A ATA 的正交分解.
该用例来自 MIT 线性代数课程
例 1 : 已知矩阵
A
=
[
4
4
−
3
3
]
A=
先计算 A T A A^{\mathrm{T}}A ATA, 得到 (这里是求 V)
A
T
A
=
[
25
7
7
25
]
A^{\mathrm{T}}A =
求出特征值和特征向量, 并对特征向量使用施密特正交化
λ
1
=
32
,
x
1
=
[
1
2
1
2
]
\lambda_1 = 32, x_1 =
λ
2
=
18
,
x
2
=
[
1
2
−
1
2
]
\lambda_2 = 18, x_2 =
又根据 A A T AA^{\mathrm{T}} AAT 重复上述步骤 (这里是求 U)
A
A
T
=
[
32
0
0
18
]
AA^{\mathrm{T}} =
对应的特征值和特征向量是
λ
1
=
32
,
x
1
=
[
0
1
]
\lambda_1 = 32, x_1 =
λ
2
=
18
,
x
2
=
[
0
1
]
\lambda_2 = 18, x_2 =
直接代入就可以得到
[
4
4
3
−
3
]
=
[
1
0
0
1
]
[
32
0
0
18
]
[
1
2
1
2
1
2
−
1
2
]
但是这样分解之后, 第 4 步计算出来的矩阵是
[
4
4
−
3
3
]
所以要使用原始公式 σ i u i = A v i \sigma_iu_i = Av_i σiui=Avi 确定了 v v v 和 σ \sigma σ, 直接代入就能得到 u u u. 通过下面的例子进行展开描述.
例 2 : 已知矩阵
A
=
[
4
3
8
6
]
A=
可知 A A A 的秩为 1, 行空间是一条直线, 零空间是与之垂直的一条直线
同时 A A A 的列空间是一条直线, 左零空间是与之垂直的一条直线
那么行空间方向上的基为
[
0.8
0.6
]
列空间方向 :
u
1
=
1
/
5
[
1
2
]
u_1 = 1/\sqrt{5}
然后 S V D SVD SVD 就是将行空间与零空间上的基转换为列空间与左零空间上的基
所以就可以得到矩阵 U U U :
U
=
1
5
[
1
2
2
−
1
]
U = \frac{1}{\sqrt{5}}
类似的, 我们可以得到:
V
T
=
[
0.8
0.6
0.6
−
0.8
]
V^{\mathrm{T}} =
和之前利用 A T A A^{\mathrm{T}}A ATA 的特征值来求得对角矩阵 Σ \Sigma Σ, 最后得到
A
=
1
5
[
1
2
2
−
1
]
[
125
0
0
0
]
[
0.8
0.6
0.6
−
0.8
]
A = \frac{1}{\sqrt{5}}