前言
今日实现第一个推荐算法,在”机器学习实战“一书中找到了SVD方法一章练习。这里总结下笔记经验,与大家分享 。
简介
对于一个简单的推荐系统,例如电影推荐,我们知道N个用户对M个电影的评分。这时候对于一个新的用户,我们应该如何给他推荐新的电影呢?一个最简单的方法,根据用户已看的电影,找出与他相似的用户,然后推荐其他未看的高得分的电影。SVD提供了一个更加准确的解决方案。其基本思想是,降维!
对于电影,一般的推荐算法是将每个电影的评分作为一个维度,对于Xi用户,就有一个矩阵行 Xi = [xi1,xi2,xi3....xij]。 但是电影如此之多,每个人又不可能看过所有的电影,这将造成矩阵非常巨大,然后非常稀疏。SVD的具体思想是提取电影的参数Q1, ..., Qj。这个参数可以表达为电影的动作,搞笑,恐怖等程度的描述。因此后面的推荐算法中,我们不需要对每个电影的口味进行分析,当给定新用户的时候直接推荐适合他口味,即基于电影参数Qj的一个评分相符,的电影即可。
实现
实现SVD,只需要python中的numpy,其中有一个线性代数工具箱linalg。
import numpy as np
data = [[1,2,3],[2,2,3],[3,3,3]]
U,S,V = np.linalg.svd(data)
>>> U
array([[-0.48273945, 0.76567677, 0.42509024],
[-0.54696309, 0.11548497, -0.82915294],
[-0.68395468, -0.63277351, 0.36304778]])
>>> S
array([ 7.51653849, 1.17761678, 0.33892171])
>>> V
array([[-0.48273945, -0.54696309, -0.68395468],
[-0.76567677, -0.11548497, 0.63277351],
[-0.42509024, 0.82915294, -0.36304778]])
其中S向量只存储了对角元素的成分,可以大大节省存储空间。接下来我们就需要保留部分奇异值,对于保留的数量,一个典型的方法就是保留矩阵中90%的能量信息。能量信息为奇异值的平和总和。
看到这里是否想起了PCA分析,同样的分解矩阵,同样的计算能量信息。下面讨论章节我会进行一些个人总结。
那么算法实现了,具体应用到推荐中该如何做呢?对于用户没有看过的电影,我们只需要计算与用户看过的电影中的高评分电影的相似度,然后推荐相似度高的电影即可。你或许听过协同过滤(collaborative filtering),没听过没关系,我们要做得就是协同过滤。也就是基于用户与其他用户的数据进行对比来实现精确推荐。另外还有可以基于内容的推荐,不在本文考虑范围。
计算相似度的集中方法,有:
欧式距离,数据差的的平方和
相关系数,一般为皮尔逊相关系数(Pearson correlation)
</