编程要求:
根据下表,实现基于矩阵分解的协同分解算法,为用户推荐分值最高的两物品
代码如下:
import numpy as np # 定义原始评分矩阵(用户-物品矩阵) R = np.array([[0, 1, 0, 3, 0, 5, 0, 3, 0, 0], [0, 0, 2, 0, 1, 0, 0, 3, 0, 4], [1, 0, 0, 0, 2, 0, 3, 0, 3, 0], [0, 0, 3, 0, 0, 0, 1, 1, 1, 0], [0, 5, 0, 0, 0, 2, 4, 0, 0, 2], [1, 2, 3, 0, 0, 0, 0, 0, 0, 1], [1, 0, 2, 0, 4, 0, 0, 0, 0, 0], [0, 0, 3, 0, 0, 0, 0, 0, 3, 3], [4, 0, 1, 0, 0, 0, 2, 1, 0, 0], [0, 0, 0, 0, 2, 0, 1, 1, 0, 1]]) # 设置潜在因子数 K = 2 # 随机初始化用户矩阵P和物品矩阵Q num_users, num_items = R.shape P = np.random.rand(num_users, K) Q = np.random.rand(num_items, K) # 定义学习率和正则化参数 learning_rate = 0.001 lmbda = 0.02 epochs = 1000 # 使用梯度下降法更新P和Q for epoch in range(epochs): for i in range(num_users): for j in range(num_items): if R[i][j] > 0: eij = R[i][j] - np.dot(P[i, :], Q[j, :].T) P[i, :] += learning_rate * (eij * Q[j, :] - lmbda * P[i, :]) Q[j, :] += learning_rate * (eij * P[i, :] - lmbda * Q[j, :]) # 计算预测矩阵 R_pred = np.dot(P, Q.T) # 根据用户输入进行推荐 def recommend(user_id): top_items = np.argsort(R_pred[user_id - 1])[::-1][:2] + 1 return top_items # 测试推荐函数 user_input = int(input("请输入用户ID:")) recommended_items = recommend(user_input) print(f"为用户{user_input},推荐的物品为:物品{recommended_items[0]},物品{recommended_items[1]}")
运行结果:
分析总结:
这段代码实现了基于矩阵分解的协同过滤算法,用于给用户推荐物品。
1. **数据初始化:**
- 初始化了用户-物品评分矩阵 `R`,其中0表示用户没有对物品评分。
- 设置了潜在因子数 `K`,用于定义用户和物品的隐含特征空间的维度。
- 随机初始化了用户矩阵 `P` 和物品矩阵 `Q`。2. **梯度下降更新:**
- 使用梯度下降法更新用户矩阵 `P` 和物品矩阵 `Q`,以最小化预测评分与实际评分之间的差异。
- 迭代了指定次数 `epochs`,在每次迭代中遍历用户和物品,根据实际评分和预测评分的误差更新参数。3. **预测矩阵计算:**
- 计算了预测评分矩阵 `R_pred`,通过用户矩阵 `P` 和物品矩阵 `Q` 的乘积得到。4. **推荐函数实现:**
- 实现了 `recommend` 函数,根据用户输入的用户ID,返回给该用户推荐的两个物品。
- 使用预测评分矩阵 `R_pred`,对用户的物品进行排序,选取分值最高的两个物品作为推荐结果。5. **用户交互:**
- 用户输入一个用户ID,程序调用 `recommend` 函数给该用户推荐物品,并打印推荐结果。这段代码的核心是通过梯度下降法学习用户和物品的隐含特征表示,从而实现个性化的推荐。
11-30
868
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
11-18
4696
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-13
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交