python
import numpy as np
import pandas as pd
```python
R = np.array([ [4, 0, 2, 0, 1], [0, 2, 3, 0, 0], [1, 0, 2, 4, 0], [5, 0, 0, 3, 1], [0, 0, 1, 5, 1], [0, 3, 2, 4, 1] ])
num_items = len(R[0]) ```
```python """ 输入参数: - R: M*N 的评分矩阵 - K: 隐特征向量维度 - max_iter: 最大迭代次数 - alpha: 步长 - lamda: 正则化系数
输入: - 分解后的 P 和 Q - P: 初始化用户特征矩阵 MK - Q: 初始化物品特征矩阵 NK """
K = 5 max_iter = 5000 alpha = 0.0002 lamda = 0.004
def lfmgradientdescent(R, K=2, maxiter=1000, alpha=0.0001, lamda=0.002): # 定义基本维度参数 numusers = len(R) num_items = len(R[0])
# 初始化用户特征矩阵 P 和物品特征矩阵 Q
P = np.random.rand(num_users, K)
Q = np.random.rand(num_items, K).T
# 迭代过程
for step in range(max_iter):
# 遍历所有用户和物品
for user in range(num_users):
for item in range(num_items):
# 对于每个大于0的评分,计算预测评分误差
if R[user][item] > 0:
error = np.dot(P[user, :], Q[:, item]) - R[user][item]
# 根据梯度下降算法更新特征向量
for k in range(K):
P[user][k] -= alpha * (2 * error * Q[k][item] + 2 * lamda * P[user][k])
Q[k][item] -= alpha * (2 * error * P[user][k] + 2 * lamda * Q[k][item])
# 计算预测评分矩阵
pred_R = np.dot(P, Q)
# 计算当前损失函数
cost = 0
for user in range(num_users):
for item in range(num_items):
if R[user][item] > 0:
cost += (np.dot(P[user, :], Q[:, item]) - R[user][item]) ** 2
# 添加正则化项
for k in range(K):
cost += lamda * (P[user][k] ** 2 + Q[k][item] ** 2)
# 如果损失足够小,则停止迭代
if cost < 0.0001:
break
return P, Q.T, cost
```
以上是对LFM梯度下降算法的详细描述和实现。该算法的核心在于通过迭代更新用户和物品的隐特征向量,从而逐步优化预测评分矩阵。