咨询QQ:3025393450
有问题百度搜索“”就可以了
欢迎登陆官网:/datablog
python机器学习:推荐系统实现(以矩阵分解来协同过滤)数据分析报告
用户和产品的潜在特征编写推荐系统矩阵分解工作原理使用潜在表征来找到类似的产品
1. 用户和产品的潜在特征
我们可以通过为每个用户和每部电影分配属性,然后将它们相乘并合并结果来估计用户喜欢电影的程度。
咨询QQ:3025393450
有问题百度搜索“”就可以了
欢迎登陆官网:/datablog
相同的计算可以表示为矩阵乘法问题。
首先,我们把用户属性放在一个名为U 的矩阵中,在这个例子中是5,-2,1,-5和5。
然后,我们把电影属性放在一个名为M的矩阵中,我们使用矩阵乘法来找出用户的评分。
但要做到这一点,我们必须已经知道用户属性和电影属性。
为每个用户和每部电影提供属性评级并不容易。
我们需要找到一种自动的方法。
我们来看看电影评分矩阵,
咨询QQ:3025393450
有问题百度搜索“”就可以了
欢迎登陆官网:/datablog
它显示了我们数据集中的所有用户如何评价电影。
这个矩阵非常稀疏,但它给了我们很多信息。
例如,我们知道用户ID2给电影1号五颗星。
所以,基于此,我们可以猜测,这个用户的属性可能类似于电影的属性,因为它们匹配的很好。
换句话说,我们有一些线索可以使用。
让我们看看我们如何利用这些线索来了解每部电影和每个用户。
在我们刚刚看到的等式中,U乘M等于电影等级,我们已经知道一些用户的实际电影等级。
我们已经拥有的电影评分矩阵是我们方程式的解决方案。
虽然它是解决方案的一部分,但是这个阵列仍然有很多漏洞,但对于我们来说,这已经足够了。
咨询QQ:3025393450
有问题百度搜索“”就可以了
欢迎登陆官网:/datablog
实际上,我们可以使用目前为止我们所知道的电影评级,然后逆向找到满足该等式的U矩阵和M矩阵。
当然,这才是最酷的部分。
当我们将U和M相乘时,他们实际上会给我们一个完整的矩阵,我们可以使用那个完成的矩阵来推荐电影。
让我们回顾一下我们将如何构建这个推荐系统。
咨询QQ:3025393450
有问题百度搜索“”就可以了
欢迎登陆官网:/datablog
首先,我们创建了我们在数据集中所有用户评论的矩阵。
接下来,我们从已知的评论中分解出一个U矩阵和一个M矩阵。
最后,我们将把我们找到的U和M矩阵相乘,得到每个用户和每部电影的评分。
但是还有一个问题。
以前,当我们为每个用户和每部电影手工创建属性时,我们知道每个属性的含义。
我们知道第一个属性代表动作,第二个代表剧情,等等。
但是当我们使用矩阵分解来提出U 和M时,我们不知道每个值是什么意思。
我们所知道的是,每个价值都代表了一些让用户感觉被某些电影吸引的特征。
我们不知道如何用文字来描述这些特征。
因此,U和M被称为潜在向量。
潜在的词意味着隐藏。
换句话说,这些向量是隐藏的信息,我们通过查看评论数据和反向推导。
2. 编写推荐系统
我们来编写推荐系统的主要代码。
打开Chapter 5/factor_review_matrix.py。
首先,我将使用pandas read_csv函数将检查数据集加载到名为raw_dataset_df 的数据集中。
raw_dataset_df = pd.read_csv('movie_ratings_data_set.csv')
然后我们使用pandas数据透视表函数来构建评论矩阵。
在这一点上,ratings_df 包含一个稀疏的评论阵列。
ratings_df = pd.pivot_table(raw_dataset_df, index='user_id', columns='movie_id',
aggfunc=np.max)
咨询QQ:3025393450
有问题百度搜索“”就可以了
欢迎登陆官网:/datablog
接下来,我们希望将数组分解以找到用户属性矩阵和我们可以重新乘回的电影属性矩阵来重新创建收视率数据。
为此,我们将使用低秩矩阵分解算法。
我已经在matrix_factorization_utilities.py中包含了这个实现。
我们将在下一个视频中详细讨论它是如何工作的,但让我们继续使用它。
首先,我们传递了评分数据,但是我们将调用pandas的as_matrix()函数,以确保我们作为一个numpy矩阵数据类型传入。
U, M = matrix_factorization_utilities.low_rank_matrix_factorization(ratings_df.as_matrix(), num_features=15, regularization_amount=0.1)
接下来,这个方法接受一个名为num_features的参数。
Num_features控制为每个用户和每个电影生成多少个潜在特征。
我们将以15为起点。
这个函数还有个参数regularization_amount。
现在让我们传入0.1。
在后面的文章中我们将讨论如何调整这个参数。
函数的结果是U矩阵和M矩阵,每个用户和每个电影分别具有15个属性。
现在,我们可以通过将U和M相乘来得到每部电影的评分。
但不是使用常规的乘法运算符,而是使用numpy的matmul函数,所以它知道我们要做矩阵乘法。
predicted_ratings = np.matmul(U, M)
结果存储在一个名为predicted_ratings的数组中。
最后,我们将predict_ratings 保存到一个csv文件。
predicted_ratings_df = pd.DataFrame(index=ratings_df.index, columns=ratings_df.columns, data=predicted_ratings)
predicted_ratings_df.to_csv("predicted_ratings.csv")。