csr_matrix参数解析

>>> indptr = np.array([0, 2, 3, 6])
>>> indices = np.array([0, 2, 2, 0, 1, 2])
>>> data = np.array([1, 2, 3, 4, 5, 6])
>>> csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 2],
       [0, 0, 3],
       [4, 5, 6]])

(注:论文的行下标和列下标均从0开始)

 

data 表示 元数据 显然为1, 2, 3, 4, 5, 6

shape 表示 矩阵的形状 为 3 * 3

indices 表示 各个数据在各行的下标, 从该数据我们可以知道:数据1在某行的0位置处, 数据2在某行的2位置处,6在某行的2位置处。

而各个数据在哪一行就要通过indptr参数得到的

indptr 表示每行数据的个数:[0 2 3 6]表示从第0行开始数据的个数,0表示默认起始点,0之后有几个数字就表示有几行,第一个数字2表示第一行有2 - 0 = 2个数字,因而数字1,2都第0行,第二行有3 - 2 = 1个数字,因而数字3在第1行,以此类推,我们能够知道所有数字的行号

Example: 数字6 ,indptr推出在第2行,indices推出在第2列。

import pandas as pd import numpy as np from sklearn.metrics.pairwise import cosine_similarity from sklearn.metrics import mean_squared_error # ================== 1. 数据加载与预处理 ================== def load_data(train_path, test_path=None, columns=['userId', 'movieId', 'rating']): """加载训练集和测试集,构建评分矩阵""" # 加载训练集 train_data = pd.read_csv(train_path, sep='\t', header=None, names=columns, dtype={'userId': int, 'movieId': int, 'rating': float}) # 构建训练评分矩阵 user_ids = train_data['userId'].unique() movie_ids = train_data['movieId'].unique() train_matrix = pd.DataFrame(0, index=user_ids, columns=movie_ids) for _, row in train_data.iterrows(): train_matrix.at[row['userId'], row['movieId']] = row['rating'] # 加载测试集(如果有) test_data = None if test_path: test_data = pd.read_csv(test_path, sep='\t', header=None, names=columns, dtype={'userId': int, 'movieId': int, 'rating': float}) return train_matrix, test_data # ================== 2. 相似度计算 ================== def calculate_similarity(matrix, mode='user', method='cosine'): """计算用户或物品的相似度矩阵""" if mode == 'user': if method == 'cosine': sim_matrix = pd.DataFrame( cosine_similarity(matrix), index=matrix.index, columns=matrix.index # 用户ID作为行列索引 ) elif method == 'pearson': sim_matrix = matrix.T.corr(method='pearson') elif mode == 'item': if method == 'cosine': sim_matrix = pd.DataFrame( cosine_similarity(matrix.T), index=matrix.columns, columns=matrix.columns # 电影ID作为行列索引 ) elif method == 'pearson': sim_matrix = matrix.corr(method='pearson') return sim_matrix # ================== 3. 评分预测 ================== def user_based_predict(target_user, target_movie, train_matrix, user_sim, k=50): """基于用户的评分预测""" if train_matrix.loc[target_user, target_movie] != 0: return 0 # 已评分则跳过 sim_users = user_sim[target_user].sort_values(ascending=False)[1:k + 1] weighted_sum, sim_sum = 0.0, 0.0 target_mean = train_matrix.loc[target_user].mean() for user, similarity in sim_users.items(): if train_matrix.loc[user, target_movie] == 0: continue user_mean = train_matrix.loc[user].mean() weighted_sum += similarity * (train_matrix.loc[user, target_movie] - user_mean) sim_sum += abs(similarity) return target_mean + (weighted_sum / sim_sum) if sim_sum != 0 else 0 def item_based_predict(target_user, target_movie, train_matrix, item_sim, k=50): """基于物品的评分预测""" if train_matrix.loc[target_user, target_movie] != 0: return 0 # 已评分则跳过 sim_movies = item_sim[target_movie].sort_values(ascending=False)[1:k + 1] weighted_sum, sim_sum = 0.0, 0.0 for movie, similarity in sim_movies.items(): if train_matrix.loc[target_user, movie] == 0: continue weighted_sum += similarity * train_matrix.loc[target_user, movie] sim_sum += abs(similarity) return weighted_sum / sim_sum if sim_sum != 0 else 0 # ================== 4. 推荐与评估 ================== def generate_recommendations(target_user, train_matrix, sim_matrix, predict_func, top_n=10): """生成Top-N推荐""" unrated_movies = train_matrix.columns[train_matrix.loc[target_user] == 0] predictions = [] for movie in unrated_movies: pred = predict_func(target_user, movie, train_matrix, sim_matrix) predictions.append((movie, pred)) predictions.sort(key=lambda x: x[1], reverse=True) return predictions[:top_n] def evaluate_model(test_data, train_matrix, sim_matrix, predict_func): """计算测试集的RMSE""" predictions, actuals = [], [] for _, row in test_data.iterrows(): user, movie, true_rating = row['userId'], row['movieId'], row['rating'] if user not in train_matrix.index or movie not in train_matrix.columns: continue # 忽略训练集中不存在的用户或电影 pred_rating = predict_func(user, movie, train_matrix, sim_matrix) predictions.append(pred_rating) actuals.append(true_rating) return np.sqrt(mean_squared_error(actuals, predictions)) # ================== 主程序 ================== if __name__ == "__main__": # 数据路径配置 train_path = './train_ratings.csv' # 训练集路径 test_path = './test_ratings.csv' # 测试集路径(可选) # 加载数据 train_matrix, test_data = load_data(train_path, test_path, columns=['userId', 'movieId', 'rating']) # 选择目标用户(示例) target_user = 1 # ------------------ 基于用户的协同过滤 ------------------ print("计算用户相似度...") user_sim = calculate_similarity(train_matrix, mode='user', method='cosine') user_recommendations = generate_recommendations( target_user, train_matrix, user_sim, user_based_predict, top_n=10 ) print(f"\n用户 {target_user} 的基于用户推荐:") for movie, score in user_recommendations: print(f"电影 {movie} \t预测评分:{score:.3f}") # ------------------ 基于物品的协同过滤 ------------------ print("\n计算电影相似度...") item_sim = calculate_similarity(train_matrix, mode='item', method='cosine') item_recommendations = generate_recommendations( target_user, train_matrix, item_sim, item_based_predict, top_n=10 ) print(f"\n用户 {target_user} 的基于电影推荐:") for movie, score in item_recommendations: print(f"电影 {movie} \t预测评分:{score:.3f}") # ------------------ 测试集评估(如果提供测试集) ------------------ if test_data is not None: print("\n评估基于用户的协同过滤模型...") user_rmse = evaluate_model(test_data, train_matrix, user_sim, user_based_predict) print(f"用户协同过滤的RMSE:{user_rmse:.4f}") print("\n评估基于物品的协同过滤模型...") item_rmse = evaluate_model(test_data, train_matrix, item_sim, item_based_predict) print(f"物品协同过滤的RMSE:{item_rmse:.4f}")根据上述描述修改这份代码
05-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值