在这里,我们将谈论的问题是评级预测问题。我们的数据是评级历史数据,即用户对项目的评级,值区间是[1,5]。我们可以把数据放在一个稀疏矩阵R
中:
矩阵的每一行对应一个给定用户,每一列对应一个给定项目。譬如,在上面的矩阵中,Alice对第一个项目的评级是1,Charlie对第三个项目的评级是4。在我们的问题中,我们将认为项目是电影,(电商领域是商品),在后面会交替使用“项目”和“电影”这两个术语。
如果 R R 是密集的,我们可以很容易计算 M和U M 和 U :
但是, R R 是稀疏的,矩阵 RRT R R T 和 RTR R T R 并不存在,所以它们的特征向量也不存在,而且我们不能把 R R 分解为 MΣUT M Σ U T 的乘积。但是,有一些办法。曾被用过一段时间的第一个选择是,对 R R 的缺失内容进行填充,如,行(或列)的平均值。一旦得到密集矩阵,我们就可以用传统算法来计算其SVD。这种方法可行,但结果往往有很高的偏见。我们宁愿用另外一种方法,基于最小化问题。
计算 RRT R R T 和 RTR R T R 的特征向量并不是计算密集矩阵 R R 的SVD的唯一方法。实际上,我们可以找到矩阵 M M 和 U U ,如果我们能找到所有满足如下条件的向量 pu p u 和 qi q i ( pu组成M的行,qi组成UT的列 p u 组 成 M 的 行 , q i 组 成 U T 的 列 ):
对所有users和items,找出这种向量 pu和qi p u 和 q i ,可通过解决下面的优化问题(同时遵循正交约束)来完成:
它可被理解为,找到向量 pu p u 和 qi q i 使得与 rui r u i 差总和最小。也就是说,我们试图尽可能将 rui r u i 的值与 pu⋅qi p u ⋅ q i 相等。
那么当R稀疏时,即当矩阵中某些评级缺失时,我们该怎么办? Simon Funk的答案是我们应该不要废弃。我们仍然解决同样的优化问题:
唯一的区别是,这次,某些评级是缺失的,即 R R 不完整。请注意,我们并没有将缺少的项目视为零:我们纯粹是忽略它们。此外,我们将会忘记正交性约束,因为即使它们对于解释有用,通常,限制向量也不能帮助我们获得更准确的预测。
当带参数 θ θ 的函数 f f 被表示如下时:
SGD过程通过下列步骤来最小化 f f (即,找到 θ θ 使得 f(θ) f ( θ ) 尽可能小):
其中 fui f u i 被定义为: fui(pu,qi)=(rui−pu⋅qi)2 f u i ( p u , q i ) = ( r u i − p u ⋅ q i ) 2
向量 pu p u 关于函数 fui f u i 的偏导为:
向量 qi q i 关于函数 fui f u i 的偏导为:
求解步骤如下:
核心代码:
def SGD(data):
'''Learn the vectors p_u and q_i with SGD.
data is a dataset containing all ratings + some useful info (e.g. number
of items/users).
u i r_ui
0 0 4.0 #更新p的第0行和q的第0行
0 306 4.0 #更新p的第0行和q的第306行
0 413 1.0
0 581 3.0
0 255 5.0
'''
n_factors = 10 # number of factors
alpha = .01 # learning rate
n_epochs = 10 # number of iteration of the SGD procedure
# Randomly initialize the user and item factors.
p = np.random.normal(0, .1, (data.n_users, n_factors))
q = np.random.normal(0, .1, (data.n_items, n_factors))
# Optimization procedure
for _ in range(n_epochs):
for u, i, r_ui in data.all_ratings():
err = r_ui - np.dot(p[u], q[i])
# Update vectors p_u and q_i
p[u] += alpha * err * q[i]
q[i] += alpha * err * p[u]
一旦我们运行SGD过程,就可以估计所有的向量 pu p u 和 qi q i 的点积来预测所有的评级:
def estimate(u, i):
'''Estimate rating of user u for item i.'''
return np.dot(p[u], q[i])
中文参考: http://www.infoq.com/cn/articles/matrix-decomposition-of-recommend-system
英文原文: http://nicolas-hug.com/blog/