协同过滤算法_机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用

今天是机器学习专题的第29篇文章,我们来聊聊SVD在上古时期的推荐场景当中的应用。

推荐的背后逻辑

有没有思考过一个问题,当我们在淘宝或者是某东这类电商网站购物的时候。我们一进首页,就会看到首页展出了很多商品。这些商品往往质量很高,很吸引人,一旦逛起来可能就没个结束。那么问题来了,电商平台拥有那么多商品,它是怎么知道我们可能会喜欢什么样的商品的呢?这背后的逻辑是什么?

简单来说在这背后,平台端的算法做了两件事情,第一件事情是召回,第二件事情是排序。本质上来说和搜索引擎做的事情是类似的,只是不同的是搜索的时候我们有搜索词作为输入,而首页的推荐是没有任何显性的输入信息的。所以召回的时候只能根据用户画像的一些特征和用户之前在平台上的行为来作为特征召回商品,召回了商品之后再用一个模型预估用户点击的概率,根据这个概率进行排序。

虽然召回-排序的框架没有变,但是召回的算法、逻辑以及排序的算法和逻辑一直在迭代。尤其是召回模型,从一开始的协同过滤再到后来的向量召回、双塔模型以及树模型等等,有了巨大的进步,模型的效果自然也有了一个质的飞跃。

今天我们来着重聊聊协同过滤,虽然这个模型非常简单,目前也几乎已经退出历史舞台了,但是这不妨碍它仍然是一个经典的算法,值得我们学习。

协同过滤的原理

协同过滤的原理非常简单,一句话概括,就是寻找相似的商品以及相似的人

因为在平台当中的商品和人可能数量都非常大,当我们要进行推荐的时候,我们不可能穷举所有的商品来进行预测点击率,这显然是机器无法抗住的。所以我们希望把用户在平台上的行为使用起来,让用户的行为给平台作为指引。根据用户的行为寻找出行为相似的用户以及相似的商品

115ff3304e0f9dc95da89533e4e97615.png

所以协同过滤有两套逻辑,也可以认为是两种做法。第一种做法是user-based也就是寻找偏好相似的用户,这个不难理解,比如说经常买文具、买书的大概率是学生。假设我们知道了A和B行为相似,也就是说他们可能有相似的喜好。那么假设A购买过商品1并且给出了好评,而B没有购买过,那么很有可能B也会喜欢这个商品,所以我们就可以推荐给B。

第二种做法自然就是item-based,比如你搜索点击了一个商品A,平台会将和这个商品类似的商品BCD推荐给你,会放在商品详情页的下方的猜你喜欢当中。比如你看的是衬衫,它可能会给你推荐别家的衬衫,也可能给你推荐西裤或者是领带。本质上逻辑是一样的,因为这些商品和这件衬衫的相关度比较高

下一个问题是用户和用户,商品和商品之间的相关度是怎么来的呢?

答案很简单,是通过这个矩阵来的:

5603d6ded118230a18d00440d95dfcb8.png

我们观察一下这个矩阵,这是一个用户和商品的相关行为矩阵,每一行表示一个用户的行为,每一列表示每一个商品的销售情况。也就是说我们可以用这个矩阵当中的行向量表示用户,列向量表示商品。既然我们把用户和商品用向量表示出来了,接下来的事情就很简单了,我们只需要计算向量之间的相似度就可以找到相似的用户以及商品了。

我们要计算向量的相似度有很多种办法,我们可以计算两个向量的余弦值,可以计算欧式距离、皮尔逊值等等。

SVD的作用

其实到这里关于协同过滤就介绍完了,但问题是这和SVD看起来好像没什么关系呀?

我们仔细琢磨一下就能发现它们之间的关系,对于规模比较小的公司或者场景来说,这当然是没问题的。比如说电影评分网站,因为电影的数量往往不会很大,充其量也在万这个量级,所以这个矩阵可能还是存的下的。如果是电商公司,商品和用户都是亿这个维度的,这个矩阵显然是非常巨大的,根本不可能在内存当中存储得下,更别提相似度计算了。并且这样的矩阵必然存在大量稀疏和空缺,我们将它使用SVD压缩也是非常合理的做法。

首先我们开发出一个辅助函数,根据我们设置的百分比计算出最少需要的奇异值的数量:

def select_K(sigma, percentage):    square = sigma**2     base = sum(square)     s = 0     k = 0    for i in sigma:        s += i**2        k += 1        if s >= base * percentage:            return k

其次我们对原矩阵进行svd分解,并且设置阈值对原矩阵进行压缩:

data = np.mat([[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],           [0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],           [0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],           [3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],           [5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],           [0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],           [4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],           [0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],           [0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],           [0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],           [1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]])u, sigma, v = np.linalg.svd(data)k = select_K(sigma, 0.95) sigmaK = np.mat(np.eye(k) * sigma[:k]) itemMat = data.T.dot(u[:,:k]).dot(sigmaK.I)

最后压缩之后得到的是item的矩阵,其中的每一个行向量对应一个item。

3664b7e71c2e163e708382bcda48390f.png

这只是一个模拟,如果是在实际上的应用,我们可以将几亿甚至是更多的维度压缩到几百甚至更少,极大的缩减了存储所需要的开销。而且svd的计算是可以分布式并发进行的,所以即使原始数据非常庞大,也是可以支撑的。

总结

到这里关于协同过滤算法以及SVD的应用就结束了,虽然算法非常简单,实现起来也容易,但是这其中还有很多问题没有解决。比如说这个用户和商品的矩阵并不是一成不变的,因为我们随时都会有新商品上架以及新用户注册,对于这些没有行为的新商品和新用户应该怎么办?

另外一个问题是,这个算法没有改进的空间,一旦实现完成了上线之后,我们做不了太多的改进。如果是其他的模型或者是算法,我们可以通过迭代算法以及模型的方法来获取更好的效果,但是协同过滤不行。这也是为什么逐渐被淘汰的原因。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

本文始发于公众号:TechFlow

### 回答1: Python音乐协同过滤算法是一种基于用户行为的推荐算法,其目的是根据用户的历史行为习惯,通过数据分析和挖掘,推荐符合用户兴趣的音乐内容。它利用大量的用户数据作为输入,通过和其他用户相似的行为模式,计算出与目标用户最相似的一组用户,并根据这些用户对音乐的评分和偏好,推荐新的音乐信息给目标用户。 Python音乐协同过滤算法的主要优点在于它使用已经产生的完全数据,而不是假设或者假定数据。它可以比其他基于用户模型或者商品模型的推荐算法更加精准的推荐符合用户兴趣的音乐内容。不过,它也有一些局限性,比如它的推荐结果依赖于已经存在的评分数据,如果数据集大小不够大,则推荐结果可能不够准确。 总的来说,Python音乐协同过滤算法是一种非常有效和广泛应用于音乐推荐领域的算法,它可以通过挖掘大量的用户数据,实现针对不同用户的个性化推荐服务。随着大数据和机器学习技术的不断发展,它将成为人们更加喜爱的音乐推荐算法。 ### 回答2: Python 音乐协同过滤算法是一种基于用户相似度和音乐相似度的推荐算法。在该算法,首先通过分析用户的历史行为和喜好,计算出不同用户之间的相似度。然后基于用户相似度,选取与当前用户相似度较高的一组“邻居用户”,并找到他们所听的音乐。最后,对于邻居用户曾经听过但当前用户未曾试听过的音乐,根据它们与当前用户已经听过的音乐之间的相似度,给出推荐值,即推荐程度大小。 具体实现上,可以使用Python推荐算法库Surprise实现音乐协同过滤算法。Surprise主要的类是SVD,它可以用于训练模型,通过随机梯度下降算法优化训练数据,使得模型的预测误差最小化。在训练过程,可以设置一些模型参数,比如学习率、正则化系数等,以达到更好的训练效果。此外,Surprise还提供了一些评估指标,如RMSE等,可以用于评估模型的性能。 除了Surprise之外,Python还有其他的音乐推荐算法库,比如LightFM、tffm等,它们也可以实现协同过滤、内容过滤等不同种类的推荐算法,并支持多种不同的数据源,如用户历史行为数据、音乐流派信息、歌词文本等。 总之,Python音乐协同过滤算法是一种高效、灵活、可扩展的推荐算法,可以根据不同的应用场景和需求来进行定制。在实际应用,需要综合考虑数据质量、算法效率、系统响应速度等因素,以构建出更加优秀的音乐推荐体验。 ### 回答3: Python音乐协同过滤算法是一种机器学习算法,用于对音乐数据进行分析并推荐相似的音乐给用户。该算法是根据用户的兴趣和喜好,以及其他用户的行为数据来推荐相似的音乐。 在Python音乐协同过滤算法,数据的处理是非常重要的一步。首先,必须对音乐数据进行收集和分类。然后,在计算相似度之前,必须通过数据清洗来处理数据集。这包括去掉重复的音乐数据、去掉没有评分的音乐数据、去掉评分数不足的音乐数据等。 接着,可以使用Python的scikit-learn 或 pandas对数据进行预处理。这包括从数据集提取有用的信息,如用户评分、歌曲信息等,并将其转换为机器学习算法可以处理的格式。在处理数据时,可以采用不同的技术,如机器学习的聚类、分类、回归等方法,以及数据挖掘、文本处理等技术,来提高算法的准确性和性能。 最后,使用Python协同过滤算法来预测音乐推荐协同过滤算法是一种基于相似度的算法,它可以通过比较用户的喜好和行为数据来推荐相似的音乐。这里,可以使用CF的两种方法:基于用户的CF 和基于物品的CF 。基于用户的CF是根据用户的历史记录和偏好来推荐相似的音乐,而基于物品的CF是根据音乐的特征和属性来推荐相似的音乐。 总之,Python音乐协同过滤算法是一种有效的方式,用于通过分析和预测用户行为来推荐相似的音乐。这种算法可以被应用于在线音乐服务和社交媒体等领域,以提高用户体验和满意度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值