用户和产品的潜在特征编写推荐系统矩阵分解工做原理使用潜在表征来找到相似的产品。算法
咱们能够经过为每一个用户和每部电影分配属性,而后将它们相乘并合并结果来估计用户喜欢电影的程度。数据库
相同的计算能够表示为矩阵乘法问题。首先,咱们把用户属性放在一个名为U的矩阵中,在这个例子中是5,-2,1,-5和5。而后,咱们把电影属性放在一个名为M的矩阵中,咱们使用矩阵乘法来找出用户的评分。数组
但要作到这一点,咱们必须已经知道用户属性和电影属性。为每一个用户和每部电影提供属性评级并不容易。咱们须要找到一种自动的方法。咱们来看看电影评分矩阵,机器学习
它显示了咱们数据集中的全部用户如何评价电影。这个矩阵很是稀疏,但它给了咱们不少信息。例如,咱们知道用户ID2给电影1号五颗星。因此,基于此,咱们能够猜想,这个用户的属性可能相似于电影的属性,由于它们匹配的很好。换句话说,咱们有一些线索可使用。函数
让咱们看看咱们如何利用这些线索来了解每部电影和每一个用户。在咱们刚刚看到的等式中,U乘M等于电影等级,咱们已经知道一些用户的实际电影等级。咱们已经拥有的电影评分矩阵是咱们方程式的解决方案。虽然它是解决方案的一部分,可是这个阵列仍然有不少漏洞,但对于咱们来讲,这已经足够了。学习
实际上,咱们可使用目前为止咱们所知道的电影评级,而后逆向找到知足该等式的U矩阵和M矩阵。固然,这才是最酷的部分。当咱们将U和M相乘时,他们实际上会给咱们一个完整的矩阵,咱们可使用那个完成的矩阵来推荐电影。让咱们回顾一下咱们将如何构建这个推荐系统。优化
首先,咱们建立了咱们在数据集中全部用户评论的矩阵。接下来,咱们从已知的评论中分解出一个U矩阵和一个M矩阵。最后,咱们将把咱们找到的U和M矩阵相乘,获得每一个用户和每部电影的评分。可是还有一个问题。之前,当咱们为每一个用户和每部电影手工建立属性时,咱们知道每一个属性的含义。咱们知道第一个属性表明动做,第二个表明剧情,等等。可是当咱们使用矩阵分解来提出U和M时,咱们不知道每一个值是什么意思。咱们所知道的是,每一个价值都表明了一些让用户感受被某些电影吸引的特征。咱们不知道如何用文字来描述这些特征。所以,U和M被称为潜在向量。潜在的词意味着隐藏。换句话说,这些向量是隐藏的信息,咱们经过查看评论数据和反向推导。网站
咱们来编写推荐系统的主要代码。打开Chapter 5/factor_review_matrix.py。首先,我将使用pandas read_csv函数将检查数据集加载到名为raw_dataset_df的数据集中。搜索引擎
而后咱们使用pandas数据透视表函数来构建评论矩阵。在这一点上,ratings_df包含一个稀疏的评论阵列。spa
接下来,咱们但愿将数组分解以找到用户属性矩阵和咱们能够从新乘回的电影属性矩阵来从新建立收视率数据。为此,咱们将使用低秩矩阵分解算法。我已经在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矩阵提供准确的值。
由于评分矩阵等于将用户属性矩阵乘以电影属性矩阵的结果,因此咱们可使用矩阵分解反向工做以找到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并再次运行该程序,以查看与其余电影相似的内容。