实现基于矩阵分解的协同分解算法,为用户推荐分值最高的两物品

编程要求:

根据下表,实现基于矩阵分解的协同分解算法,为用户推荐分值最高的两物品

 

代码如下:

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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值