问题描述
在推荐系统中,最重要的原始数据就是User和Item组成的二维矩阵,每一项的值就代表着某个User对某个Item打分项。这个矩阵会非常大,我们估算一下,假如某个网站有100万人和10万个商品,那么这个矩阵的大小就是:
10^6 * 10^5 = 10^11,1000亿个,是不是非常大,所以在真实的项目中是不存在这样一个矩阵的。但是为了机器学习,我们必须把这个矩阵组建起来,所以就有了Matrix Factorization这项技术。
Factor是什么?
这个在数学中叫做乘积因子,比如:
6 = 2 x 3
9 = 3 x 3
12 = 2 x 6 或者 12 = 3 x 4
就是把一个数,转化成另外两个因子的乘积。
Matrix Factorization技术也是类似的,我们相表示原始矩阵比较大,但是我们可以转化成两个比较小的矩阵,然后让他们进行点乘,最后相当于原始的大矩阵。
为什么一个大矩阵可以转化为两个小的矩阵乘积?
最根本的原因是推荐系统的User和Item的矩阵是Sparse矩阵,就是里边大部分都是不含有信息的,都是缺省的0,是因为一个User进行投票的Item是非常少的,和Item的总量10万相比。
数学推导
R^ = W * U(T)
这个就是矩阵分解的公司,我们希望找到这样一个W和U,让W和U的点积可以大约等于R,R^多做R hat,就是R的近似值。
我们希望W和U都尽量小。
W 的shape是(NxK), U的shape是(UxK)
N 代表的是用户数,U代表的是商品数,K代表的是特征数(大概10~50个)
分解的好处
假如 K=10, N=130K, M=26K如是W和U的大小分别为
NK + UK = 1.3million + 0.26Million = 1.56Million
而如果使用原始的矩阵,大小为
0.13million x 0.026million = 3.38billion
数据的压缩率是多少呢?
1.56million / 3.38billion = 0.0005
数小了非常多。这个就是进行数据分解的最主要的意义。
W和U能直接点乘吗?
我们获取W和U的目的是为了 进行W*U(T)的吗?
当然不是,因为这样一乘的结果又变成了原始的R(NxM),还是很大,不是吗?所以千万不要以为我们会用W点乘U,那么W和U到底是做什么的呢?
只获取矩阵中的值,但是不需要拥有这个矩阵
我们上一段中,我们知道W和U不能直接相乘,因为如果直接点乘我们就会获得原始矩阵R了。虽然我们没有必要倒推回R,但是我们可以获得其中的一个值。因为在我们的实际项目中,我们没必要推出R,但是我们可以随意的获取矩阵R中的任意值,不是也非常好了吗?
形象一点理解就是我不需要知道总体的矩阵R,但是我可以随意获取其中的值,不是很好吗?那么W和U就相当于一个庞大矩阵的一个接口,随意都是可以通过这个接口来得到里边的值,而没必要去拥有这个完整的矩阵。
如何获取矩阵中一个点的值
r^(i,j) = W(i)T * U(j)
r^(i,j) 代表大矩阵R中User i和Item j相交的值,就是User i对Item j的投票率rate。
W(i)T 就是用户i的K个特征值,shape为(1,K)
U(j) 就是Item i的K个特征值, shape为(1,K)
这里好像有错误,应该是:
r^(i,j) = W(i) * U(j)T,这样结果才是shape(1,1),就是代表其中的一个值。
矩阵分解和SVD的区别
在前面的章节中,我们学习过SVD(Singular value decomposition)
SVD是把一个矩阵分解为 三个矩阵的乘积。
X = USV(T)
X 分解为U S V,然后他们的乘积就相当于原始矩阵X。
其实SVD和这里说的矩阵分解,意思是一样的,只是一个分解为两个因子,一个分解为三个因子。
矩阵分解的现实意义是什么?
W里有N个K,其实就是每个用户对电影K个特征值的相关性。
U里有M个K,其实也是每个电影对K个特征值相关性。
把这两个都与K个特征相关的数组进行点积,那么得到的结果就是这两个数组的相关性。
为什么数组相乘就能表达相关性
这是一个非常好的问题?在机器学习中,经常会碰到。
打个比方,两个人见面聊天,一个人了喜欢聊汽车,另外一个人喜欢聊电脑,那么让他们在一块,吸引力自然就小。如果一个人喜欢聊美食,另外一个人也喜欢聊美食,那么两个人聊的就会很嗨。
在本案例中,W代表每个用户对K个特征的喜欢程度,U代表每个商品所能代表的K个特征。所以他们相乘的和就代表了U和W的相关性。
简单的数学表示就是:
+1 * +1 = +1
-1 * -1 = +1
+1 * -1 = -1
-1 * +1 = -1
推荐到底推荐的是什么?
知识点学习到这里,下面我们可以思考一个根本性的问题,就是推荐系统到底推荐的是什么?
我们在前面的系统当中我们已经知道了,推荐有两种:
一种基于用户的
找到相似的用户,那么他们就应该购买相似的商品,
一种基于商品的
找到相似的物品,如果用户购买了这个商品,那么我们就应该推荐像是的商品。
那么在matrix factorization里,到底是怎么推荐的呢?
我们具有的数据是一个用户对商品的rating矩阵,这个矩阵知道用户对某些商品的喜好,那么我们能不能根据用户对已经投票的商品,来推测用户对未知商品的投票率(喜好)。
那么这个有点类似前面的基于相似用户的推荐。但是这个和那个不同点是,这里不需要我们认为的去构建人的特征向量,然后找到相似的用户。也不用构建商品的特征向量,然后去寻找像是的商品。
也就是说matrix factorization不需要你自己去构建用户和商品的特征变量,它是自己内部运算出隐藏的K特征变量。
另外一个根本性的问题:机器学习什么?
学习到这里我们应该大致知道了Matrix Factorization是什么内容,以及用来干什么的了?那么这里需要理解一个根本性的问题,就是我们Matrix Factorization到底学习的是什么呢?
输入的数据就是用户对商品的喜好表R,当然我们不需要创建这么大的一个表,我们其实保留的是一个Diction,里边记录了每个用户对商品的rating值Dict((n,m) -> r)。
我们根据这些数据要学习出来的W和U,这样我们就可以根据W和U来推断出用户对任意商品的rating值了。
因此我们回到了这个问题,Matrix Factorization学习的是K个隐藏特征值。并由此特征值组成的两个因子矩阵W(NxK)和U(MxK)。
代码实现我们会在下一篇文章里去关注。