乐趣区

关于python:python机器学习推荐系统实现以矩阵分解来协同过滤

原文链接:http://tecdat.cn/?p=10911

用户和产品的潜在特色编写举荐零碎矩阵合成工作原理应用潜在表征来找到相似的产品。

1. 用户和产品的潜在特色

咱们能够通过为每个用户和每部电影调配属性,而后将它们相乘并合并后果来预计用户喜爱电影的水平。

雷同的计算能够示意为矩阵乘法问题。首先,咱们把用户属性放在一个名为 U 的矩阵中,在这个例子中是 5,-2,1,- 5 和 5。而后,咱们把电影属性放在一个名为 M 的矩阵中,咱们应用矩阵乘法来找出用户的评分。

但要做到这一点,咱们必须曾经晓得用户属性和电影属性。为每个用户和每部电影提供属性评级并不容易。咱们须要找到一种主动的办法。咱们来看看电影评分矩阵,

它显示了咱们数据集中的所有用户如何评估电影。这个矩阵十分稠密,但它给了咱们很多信息。例如,咱们晓得用户 ID2 给电影 1 号五颗星。所以,基于此,咱们能够猜想,这个用户的属性可能相似于电影的属性,因为它们匹配的很好。换句话说,咱们有一些线索能够应用。

让咱们看看咱们如何利用这些线索来理解每部电影和每个用户。在咱们刚刚看到的等式中,U 乘 M 等于电影等级,咱们曾经晓得一些用户的理论电影等级。咱们曾经领有的电影评分矩阵是咱们方程式的解决方案。尽管它是解决方案的一部分,然而这个阵列依然有很多破绽,但对于咱们来说,这曾经足够了。

实际上,咱们能够应用目前为止咱们所晓得的电影评级,而后逆向找到满足该等式的 U 矩阵和 M 矩阵。当然,这才是最酷的局部。当咱们将 U 和 M 相乘时,他们实际上会给咱们一个残缺的矩阵,咱们能够应用那个实现的矩阵来举荐电影。让咱们回顾一下咱们将如何构建这个举荐零碎。

首先,咱们创立了咱们在数据集中所有用户评论的矩阵。接下来,咱们从已知的评论中合成出一个 U 矩阵和一个 M 矩阵。最初,咱们将把咱们找到的 U 和 M 矩阵相乘,失去每个用户和每部电影的评分。然而还有一个问题。以前,当咱们为每个用户和每部电影手工创立属性时,咱们晓得每个属性的含意。咱们晓得第一个属性代表动作,第二个代表剧情,等等。然而当咱们应用矩阵合成来提出 U 和 M 时,咱们不晓得每个值是什么意思。咱们所晓得的是,每个价值都代表了一些让用户感觉被某些电影吸引的特色。咱们不晓得如何用文字来形容这些特色。因而,U 和 M 被称为潜在向量。潜在的词意味着暗藏。换句话说,这些向量是暗藏的信息,咱们通过查看评论数据和反向推导。

2. 编写举荐零碎

咱们来编写举荐零碎的次要代码。关上 Chapter 5/factor_review_matrix.py。首先,我将应用 pandas read_csv 函数将检查数据集加载到名为 raw_dataset_df 的数据集中。

而后咱们应用 pandas 数据透视表函数来构建评论矩阵。在这一点上,ratings_df 蕴含一个稠密的评论阵列。

接下来,咱们心愿将数组合成以找到用户属性矩阵和咱们能够从新乘回的电影属性矩阵来从新创立收视率数据。为此,咱们将应用低秩矩阵合成算法。我曾经在 matrix_factorization_utilities.py 中蕴含了这个实现。咱们将在下一个视频中具体探讨它是如何工作的,但让咱们持续应用它。首先,咱们传递了评分数据,然而咱们将调用 pandas 的 as_matrix()函数,以确保咱们作为一个 numpy 矩阵数据类型传入。

接下来,这个办法承受一个名为 num_features 的参数。Num_features 管制为每个用户和每个电影生成多少个潜在特色。咱们将以 15 为终点。这个函数还有个参数 regularization_amount。当初让咱们传入 0.1。在前面的文章中咱们将探讨如何调整这个参数。

函数的后果是 U 矩阵和 M 矩阵,每个用户和每个电影别离具备 15 个属性。当初,咱们能够通过将 U 和 M 相乘来失去每部电影的评分。但不是应用惯例的乘法运算符,而是应用 numpy 的 matmul 函数,所以它晓得咱们要做矩阵乘法。

后果存储在一个名为 predicted_ratings 的数组中。最初,咱们将 predict_ratings 保留到一个 csv 文件。

首先,咱们将创立一个新的 pandas 数据框来保留数据。对于这个数据框,咱们会通知 pandas 应用与 ratings_df 数据框中雷同的行和列名称。而后,咱们将应用 pandas csv 函数将数据保留到文件。运行这个程序后能够看到,它创立了一个名为 predicted_ratings.csv 的新文件。咱们能够应用任何电子表格应用程序关上该文件。

这个数据看起来就像咱们原来的评论数据,当初每个单元格都填满了。当初咱们评估下每个单个用户会为每个独自的电影评分。例如,咱们能够看到用户 3 评级电影 4,他们会给它一个四星级的评级。当初咱们晓得所有这些评分,咱们能够依照评分程序向用户举荐电影。让咱们看看用户 1 号,看看咱们举荐给他们的电影。在所有这些电影中,如果咱们排除了用户以前评估过的电影,左边 34 号电影是最高分的电影,所以这是咱们应该举荐给这个用户的第一部电影。当用户观看这部电影时,咱们会要求他们评分。如果他们的评估与咱们预测的不统一,咱们将增加新评级并从新计算此矩阵。这将有助于咱们进步整体评分。咱们从中取得的评分越多,咱们的评分阵列中就会呈现的孔越少,咱们就有更好的机会为 U 和 M 矩阵提供精确的值。

3. 矩阵合成工作原理

因为评分矩阵等于将用户属性矩阵乘以电影属性矩阵的后果,所以咱们能够应用矩阵合成反向工作以找到 U 和 M 的值。在代码中,咱们应用称为低秩矩阵合成的算法,去做这个。咱们来看看这个算法是如何工作的。矩阵合成是一个大矩阵能够分解成更小的矩阵的思维。所以,假如咱们有一个大的数字矩阵,并且假如咱们想要找到两个更小的矩阵相乘来产生那个大的矩阵,咱们的指标是找到两个更小的矩阵来满足这个要求。如果您碰巧是线性代数的专家,您可能晓得有一些规范的办法来对矩阵进行因式分解,比方应用一个称为奇怪值合成的过程。然而,这是有这么一个非凡的状况下,将无奈失常工作。问题是咱们只晓得大矩阵中的一些值。大矩阵中的许多条目是空白的,或者用户还没有查看特定的电影。所以,咱们不是间接将评级数组分成两个较小的矩阵,而是应用迭代算法预计较小的矩阵的值。咱们会猜想和查看,直到咱们靠近正确的答案。哎哎等等,咋回事呢?首先,咱们将创立 U 和 M 矩阵,但将所有值设置为随机数。因为 U 和 M 都是随机数,所以如果咱们当初乘以 U 和 M,后果是随机的。下一步是查看咱们的计算评级矩阵与实在评级矩阵与 U 和 M 的以后值有多不同。然而咱们将疏忽评级矩阵中所有没有数据的点,只看在咱们有理论用户评论的中央。咱们将这种差别称为老本。老本就是错误率。接下来,咱们将应用数字优化算法来搜寻最小老本。数值优化算法将一次调整 U 和 M 中的数字。指标是让每一步的老本函数更接近于零。咱们将应用的函数称为 fmin_cg。它搜寻使函数返回最小可能输入的输出。它由 SciPy 库提供。最初,fmin_cg 函数将循环数百次,直到咱们失去尽可能小的代价。当老本函数的价值如咱们所能失去的那样低,那么 U 和 M 的最终值就是咱们将要应用的。然而因为它们只是近似值,所以它们不会齐全完满。当咱们将这些 U 矩阵和 M 矩阵相乘来计算电影评级时,将其与原始电影评级进行比拟,咱们会看到还是有一些差别。然而只有咱们靠近,大量的差别就无关紧要了。

4. 应用潜在特色来找到相似的产品

搜索引擎是用户发现新网站的罕用形式。当第一次用户从搜索引擎拜访您的网站时,您对用户尚不足以提供个性化举荐,直到用户输出一些产品评论时,咱们的举荐零碎还不能举荐他们。在这种状况下,咱们能够向用户展现与他们曾经在查看的产品相似的产品。指标是让他们在网站上,让他们看更多的产品。你可能在网上购物网站上看到过这个性能,如果你喜爱这个产品,你可能也会喜爱这些其余的产品。通过应用矩阵合成计算产品属性,咱们能够计算产品类似度。让咱们来看看 find_similar_products.py。首先,咱们将应用 pandas 的读取 CSV 性能加载电影评级数据集。

咱们还会应用 read_csv 将 movies.csv 加载到名为 movies_df 的数据框中。

而后,咱们将应用 pandas 的数据透视表函数 (pivot_table) 来创立评分矩阵,咱们将应用矩阵合成来计算 U 和 M 矩阵。当初,每个电影都由矩阵中的一列示意。首先,咱们应用 numpy 的转置函数来触发矩阵,使每一列变成一行。

这只是使数据更容易解决,它不会扭转数据自身。在矩阵中,每个电影有 15 个惟一的值代表该电影的特色。这意味着其余电影简直雷同的电影应该是十分类似的。要找到相似这个电影的其余电影,咱们只须要找到其余电影的编号是最靠近这部电影的数字。这只是一个减法问题。让咱们抉择用户正在看的次要电影,让咱们抉择电影 ID5。

如果你喜爱,你能够抉择其余的电影。当初,咱们来看看电影 ID5 的题目和流派。咱们能够通过查看 movies_df 数据框并应用 pandas 的 loc 函数通过其索引查找行来做到这一点。让咱们打印出该电影的题目和流派。

接下来,让咱们从矩阵中获取电影 ID 为 5 的电影属性。咱们必须在这里减去一个,因为 M 是 0 索引,但电影 ID 从 1 开始。当初,让咱们打印出这些电影属性,以便咱们看到它们,这些属性咱们筹备好找到相似的电影。

第一步是从其余电影中减去这部电影的属性。这一行代码从矩阵的每一行中别离减去以后的电影特色。这给了咱们以后电影和数据库中其余电影之间的分数差别。您也能够应用四个循环来一次减去一个电影,但应用 numpy,咱们能够在一行代码中实现。第二步是取咱们在第一步计算出的差值的绝对值,numpy 的 ABS 函数给咱们绝对值,这只是确保任何正数进去都是正值。接下来,咱们将每个电影的 15 个独自的属性差别合并为一个电影的总差别分数。numpy 的总和性能将做到这一点。咱们还会传入拜访权限等于一个来通知 numpy 总结每行中的所有数字,并为每行产生一个独自的总和。在这一点上,咱们实现了计算。咱们只是将计算得分保留回电影列表中,以便咱们可能打印每部电影的名称。在第五步中,咱们依照咱们计算的差别分数对电影列表进行排序,以便在列表中首先显示起码的不同电影。这里 pandas 提供了一个不便的排序值函数。最初,在第六步中,咱们打印排序列表中的前五个电影。这些是与以后电影最类似的电影。

好的,咱们来运行这个程序。咱们能够看到咱们为这部电影计算的 15 个属性。这是咱们发现的五个最类似的电影。第一部电影是用户曾经看过的电影。接下来的四部电影是咱们向用户展现的相似我的项目。依据他们的头衔,这些电影看起来可能十分类似。他们仿佛都是对于立功和考察的电影。续集,大城市法官三,都在名单上。这是用户可能也会感兴趣的电影。您能够更改电影 ID 并再次运行该程序,以查看与其余电影相似的内容。

退出移动版