生成python代码,实现k-means聚类后的基于用户的协同过滤算法
时间: 2024-05-01 15:22:22 浏览: 170
以下是生成的 Python 代码:
```python
from sklearn.cluster import KMeans
import numpy as np
# 生成用户评分矩阵,每行代表一个用户对不同商品的评分,-1表示未评分
ratings = np.array([
[5, 3, -1, 1],
[4, -1, 5, 2],
[-1, 2, 4, 5],
[1, 4, -1, 4],
[2, 5, 3, -1]
])
# 进行k-means聚类,将用户分为2类
kmeans = KMeans(n_clusters=2, random_state=0).fit(ratings)
# 获取聚类结果,得到两个聚类中心点
clusters = kmeans.labels_
centers = kmeans.cluster_centers_
# 打印聚类结果
print('聚类结果:', clusters)
print('聚类中心点:', centers)
# 定义基于用户的协同过滤算法函数
def user_based_cf(user_id, n_recommendations=3):
# 获取与当前用户同一聚类的其他用户
users_in_cluster = np.where(clusters == clusters[user_id])[0]
# 计算其他用户与当前用户的相似度
similarities = []
for other_user_id in users_in_cluster:
if other_user_id != user_id:
common_items = np.where(ratings[user_id] != -1)[0] & np.where(ratings[other_user_id] != -1)[0]
if len(common_items) > 0:
sim = np.corrcoef(ratings[user_id][common_items], ratings[other_user_id][common_items])[0, 1]
similarities.append((other_user_id, sim))
# 根据相似度排序,得到推荐列表
similarities.sort(key=lambda x: x[1], reverse=True)
recommendations = []
for item_id in range(ratings.shape[1]):
if ratings[user_id][item_id] == -1:
weighted_sum = 0
sim_sum = 0
for other_user_id, sim in similarities:
if ratings[other_user_id][item_id] != -1:
weighted_sum += sim * ratings[other_user_id][item_id]
sim_sum += sim
if sim_sum > 0:
recommendations.append((item_id, weighted_sum / sim_sum))
recommendations.sort(key=lambda x: x[1], reverse=True)
return [r[0] for r in recommendations[:n_recommendations]]
# 测试基于用户的协同过滤算法函数
user_id = 0
n_recommendations = 3
recommendations = user_based_cf(user_id, n_recommendations)
print('用户', user_id, '的', n_recommendations, '个推荐物品:', recommendations)
```
以上代码实现了 k-means 聚类后的基于用户的协同过滤算法。其中,聚类算法使用了 scikit-learn 库中的 KMeans 类,协同过滤算法依据用户评分矩阵和相似度计算公式实现。你可以根据实际需求修改评分矩阵、聚类数目、推荐物品数等参数,并对代码进行运行和调试。
阅读全文