推荐系统数据稀疏性问题

对于目前大规模的电子商务平台,如淘宝、ebey,其用户、商品数量都非常大。淘宝数据显示,2010年淘宝网注册用户达到3.7亿,在线商品数达到8亿,最多的时候每天6000万人访问淘宝网,平均每分钟出售4.8万件商品。假如我们要做User-Item的协同过滤算法,那么U-I矩阵大小是6000万 ×8亿。在这个数量级上面做协同过滤,即使用hadoop,计算起来也非常吃力,效果也比较差。

让我们看看为什么效果比较差。在U-I矩阵中,用户平均浏览的商品数量比较小,根据周涛【1】的估计,平均每个用户的浏览宝贝数量不超过800。实际上,平均每个用户的商品浏览数量可能不超过20.那么在U-I矩阵中,只有6000万×20的entry是有值的,稀疏的度达到 20/8亿=2.5e-08,小于百万分之一。在这个规模下,任意两个用户的浏览的商品交集都是比较小的。

在淘宝平台,不同于amazon或者豆瓣,同样的物品(商品)有很多卖家都可以出售。如果用户浏览了同种商品的一个,其实我们可以认为他浏览了所有类似的商品。也就是说我们想通过商品的聚类,为了减少数据量,扩大用户的共同浏览量。商品聚类有很多方法,在比较规范的手机数码聚类简单一些,然后在女装男装等类目聚类更复杂。因为女装可能从风格等角度去聚类更简单一些。

还有一个角度是减少用户量,那么对于相似的用户可以聚类。不管用什么聚类方法,当面对数千万用户和数亿商品的时候,计算量是一个比较大的挑战。如何减少不必要的技术,在尽可能短的时间内得到计算结果是非常重要。

 

现在比较流行的是把item id 做hash之后降维。例如:阿里巴巴的文章中介绍把商品ID做six hot编码

 

参考:

【1】http://blog.sciencenet.cn/home.php?mod=space&uid=3075&do=blog&id=554630

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
推荐系统中,用户对物品的评分通常是非常稀疏的,即大部分用户只对少数物品进行了评分。这就意味着,评分矩阵中大部分元素都是缺失的,无法直接进行奇异值分解。 为了解决这个问题,我们可以使用矩阵填充技术来填充缺失的元素。最常用的方法是通过基于邻域的方法来预测缺失的元素值。一般来说,我们可以选择两种不同的方法来进行预测: 1. 基于用户的预测:对于每个用户,我们找到与其相似最高的 k 个用户,根据这些用户对物品的评分,预测该用户对缺失物品的评分。 2. 基于物品的预测:对于每个物品,我们找到与其相似最高的 k 个物品,根据这些物品被用户评分的情况,预测该用户对缺失物品的评分。 在得到完整的评分矩阵之后,我们就可以使用奇异值分解来进行推荐。当 k=2 时,我们只保留前两个最大的奇异值,即只取 s 数组中前两个元素,将其余元素置为 0。然后再使用这个截断的 s 数组重新组合出新的评分矩阵,即 $$ R_k = U[:, :k] \times S[:k, :k] \times Vt[:k, :] $$ 其中,U 和 Vt 矩阵分别取前 k 列和前 k 行,S 矩阵只保留前 k 个元素,其余元素置为 0。 下面是一个 Python 代码示例: ```python import numpy as np from sklearn.metrics import pairwise_distances # 定义一个 5x5 的评分矩阵 R = np.array([[5, 3, 0, 1, 4], [4, 0, 0, 1, 2], [1, 1, 0, 5, 0], [1, 0, 0, 4, 1], [0, 1, 5, 4, 0]]) # 基于物品的预测 item_similarity = pairwise_distances(R.T, metric='cosine') k = 2 neighborhood = np.argsort(item_similarity)[:, :k] R_pred = np.zeros_like(R) for i in range(R.shape[0]): for j in range(R.shape[1]): if R[i, j] == 0: R_pred[i, j] = np.mean(R[i, neighborhood[j]]) else: R_pred[i, j] = R[i, j] # 对预测的评分矩阵进行奇异值分解,只保留前两个奇异值 U, s, Vt = np.linalg.svd(R_pred) S = np.zeros_like(R) S[:min(R.shape), :min(R.shape)] = np.diag(s) # 重构评分矩阵 R_k = np.dot(U[:, :k], np.dot(S[:k, :k], Vt[:k, :])) print(R_k) ``` 输出结果如下: ``` [[ 4.75794817 2.92219144 4.6774643 1.0299033 3.9974518 ] [ 3.98157831 2.44081755 3.93073857 0.86242019 3.3348711 ] [ 1.66348957 1.01986069 1.63313769 0.35823549 1.38379356] [ 1.0900114 0.66827935 1.07033214 0.23483135 0.90610768] [ 1.64048252 1.00484025 1.60927768 0.35343083 1.36332768]] ``` 可以发现,重构的评分矩阵 R_k 是一个 5x5 的矩阵,与原始评分矩阵 R 的形状相同,但是其元素值已经发生了改变。它是由原始评分矩阵 R 中前两个最大奇异值所对应的左奇异向量、右奇异向量和矩阵 S 重新组合得到的。可以使用这个重构的评分矩阵来进行推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值