恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Surprise 协同聚类 CoClustering 算法完全指南:预测公式、参数配置与源码实现剖析
首页
资讯中心
/
Surprise 协同聚类 CoClustering 算法完全指南:预测公式、参数配置与源码实现剖析
Surprise 协同聚类 CoClustering 算法完全指南:预测公式、参数配置与源码实现剖析
发布时间:2026/10/7 2:09:03
机器学习人工智能【免费下载链接】SurpriseA Python scikit for building and analyzing recommender systems项目地址https://gitcode.com/gh_mirrors/su/Surprise点击查看免费下载导读本文以 Surprise 推荐系统库的 CoClustering 文档 为主线系统讲解其内置的协同聚类Co-clustering算法先给出预测公式与数学直觉再深入 源码实现 拆解类似 k-means 的训练流程随后逐一说明n_cltr_u、n_cltr_i、n_epochs、random_state、verbose五个核心参数的作用与默认值最后给出从安装、训练、预测到交叉验证评估的完整可运行示例。读完本文你将能够独立使用并调优 CoClustering 算法理解其与 SVD、k-NN 等算法的定位差异。一、算法定位同时聚类用户与物品CoClustering 是 Surprise 中一种基于协同聚类的协同过滤算法。与 SVD 这类矩阵分解方法不同它不尝试把用户-物品矩阵分解为低维隐因子而是把用户和物品分别划分到若干簇cluster中再利用簇内平均评分来完成预测。从 Surprise 的包结构看该算法位于 surprise/prediction_algorithms/co_clustering.pyx并在 surprise/prediction_algorithms/init.py 中以CoClustering名称对外导出因此在日常使用中直接from surprise import CoClustering即可。其类文档字符串明确说明这是一份对 George 与 Merugu 于 2005 年发表的 co-clustering 论文George:2005见 doc/source/refs.bib的 straightforward直白、不加额外工程优化实现。核心思想可概括为为每个用户分配一个用户簇C_u为每个物品分配一个物品簇C_i由此自动形成一个用户簇 × 物品簇的共簇co-clusterC_ui。预测某个评分时不再直接参考该用户对该物品的历史评分而是参考它们所属共簇的整体行为。二、预测公式详解CoClustering 对评分r_ui的预测r̂_ui由三部分叠加而成r̂_ui C̄_ui (μ_u - C̄_u) (μ_i - C̄_i)其中各符号含义如下符号含义C̄_ui用户u所在簇与物品i所在簇构成的共簇的平均评分C̄_u用户u所在用户簇的平均评分C̄_i物品i所在物品簇的平均评分μ_u用户u的平均评分μ_i物品i的平均评分公式的直觉是把共簇平均值C̄_ui作为基线再用用户个体均值与用户簇均值的偏差μ_u - C̄_u修正用户的个性化程度用物品个体均值与物品簇均值的偏差μ_i - C̄_i修正物品的个性化程度。这样既利用了聚类的群体统计信息又保留了每个用户、每件物品的个体偏差。冷启动与未知实体的处理类文档字符串co_clustering.pyx 第 29-35 行声明的约定为用户未知时r̂_ui μ_i退化为物品均值物品未知时r̂_ui μ_u退化为用户均值用户与物品都未知时r̂_ui μ全局均值。不过从estimate方法co_clustering.pyx 第 239-262 行的实际实现看第一个判断条件if not (knows_user(u) and knows_item(i)): return global_mean已经覆盖了任意一方未知的所有情况因此文档中描述的仅用户未知退化为μ_i、仅物品未知退化为μ_u两个分支在代码里实际不可达任何一方未知时最终都返回全局均值μ。这是文档描述与实现之间存在的一处差异使用时以实际行为为准遇到训练集中未出现的用户或物品预测值就是全局均值。三、训练流程类似 k-means 的优化循环CoClustering 的聚类分配采用与 k-means 类似的直接优化方法不断交替更新簇均值、重分配簇归属直到迭代次数用尽。完整流程位于fit方法co_clustering.pyx 第 68-155 行分为三个阶段1. 初始化随机分配簇训练开始时通过get_rng(random_state)见 surprise/utils.py获取随机数生成器用rng.randint为每个用户和每个物品随机分配一个初始簇编号。随机种子由random_state控制这正是参数中random_state的意义所在——它决定初始化的 RNG。2. 计算均值compute_averages每个 epoch 先调用compute_averages(cltr_u, cltr_i)co_clustering.pyx 第 157-237 行一次性统计出每个用户簇的评分总和与数量 → 用户簇均值avg_cltr_u每个物品簇的评分总和与数量 → 物品簇均值avg_cltr_i每个共簇的评分总和与数量 → 共簇均值avg_cocltr二维数组形状为n_cltr_u × n_cltr_i。注意一个实现细节空簇不会产生除零错误。若某个簇或共簇在统计后计数为 0其均值会被回退为self.trainset.global_mean全局均值作为兜底。3. 重分配最小化平方误差随后按用户、按物品各做一轮重分配对每个用户u依次假设u属于每个候选用户簇uc用当前簇均值按预测公式估算u的全部评分累加平方误差(r - est)²最后把u划入误差最小的簇np.argmin(errors)对每个物品i同理固定用户簇不变尝试i属于每个候选物品簇ic按平方误差最小化原则重分配。上述更新均值 → 重分配用户 → 重分配物品构成一个 epoch共迭代n_epochs次。源码注释也提到理论上可以在簇不再变化时提前终止但当前实现没有做这种早停优化属于直白实现的一部分。4. 收尾迭代结束后由于簇归属可能刚刚发生过变化代码会再调用一次compute_averages得到最终均值并把用户簇cltr_u、物品簇cltr_i、用户均值user_mean、物品均值item_mean以及三组簇均值保存为对象属性供预测阶段直接查表使用。四、参数详解CoClustering的构造签名如下co_clustering.pyx 第 57-66 行CoClustering(n_cltr_u3, n_cltr_i3, n_epochs20, random_stateNone, verboseFalse)各参数含义与取值建议参数类型默认值作用n_cltr_uint3用户簇数量。决定把全部用户划分为多少组越大则每个簇越精细但簇内统计样本越少且共簇矩阵变为n_cltr_u × n_cltr_i内存与计算量同步上升n_cltr_iint3物品簇数量。同理决定物品的划分粒度n_epochsint20优化循环的迭代轮数。每个 epoch 包含更新均值 重分配用户 重分配物品三步越多通常收敛越充分但耗时线性增长random_stateint / numpy RandomState /NoneNone控制初始化阶段随机分配簇的 RNG。传整数时以它为种子创建新的 RNG可保证多次fit()得到完全一致的初始化与结果可复现实验的关键传RandomState实例则直接复用传None则使用 numpy 的全局 RNG每次运行结果不同verboseboolFalse为True时每个 epoch 会向标准输出打印Processing epoch {n}便于观察迭代进度random_state的三种取值行为由get_rng统一处理surprise/utils.py 第 9-26 行None返回 numpy 全局随机数生成器整数种子创建新的np.random.RandomStateRandomState实例直接透传传入其他类型会抛出ValueError。一个实用建议调参对比时务必固定random_state否则两次实验的初始化簇不同误差差异可能被随机性淹没。五、实战从安装到交叉验证评估1. 安装当前仓库为scikit-surprise包标准安装方式pip install scikit-surprise或使用 condaconda-forge 渠道conda install -c conda-forge scikit-surprise2. 最小训练与预测示例使用内置 MovieLens 100k 数据集完成训练、测试与单条预测from surprise import CoClustering, Dataset from surprise.model_selection import train_test_split from surprise import accuracy # 加载内置的 MovieLens 100k 数据集 data Dataset.load_builtin(ml-100k) # 划分训练集与测试集25% 测试固定随机种子保证可复现 trainset, testset train_test_split(data, test_size0.25, random_state0) # 创建协同聚类算法5 个用户簇、3 个物品簇、迭代 30 轮 algo CoClustering(n_cltr_u5, n_cltr_i3, n_epochs30, random_state0, verboseTrue) # 训练并测试 algo.fit(trainset) predictions algo.test(testset) accuracy.rmse(predictions) accuracy.mae(predictions)训练过程中会打印Processing epoch 0…Processing epoch 29predictions是Prediction对象的列表surprise/prediction_algorithms/predictions.py每个对象包含原始用户 id、原始物品 id、真实评分r_ui、预测值est和细节字典details。对单个评分做预测# 对用户 196、物品 302 预测评分真实评分 4.0 可选传入 algo.predict(196, 302, r_ui4.0, verboseTrue)注意predict方法定义于 surprise/prediction_algorithms/algo_base.py 第 54-126 行默认会把预测值裁剪clip到数据集的评分区间内例如估算出 5.5 会被压回 5小于 1 会被抬到 1。3. 交叉验证评估与 Surprise 的其他算法一样CoClustering 可以直接接入交叉验证from surprise import CoClustering, Dataset from surprise.model_selection import cross_validate data Dataset.load_builtin(ml-100k) algo CoClustering(n_cltr_u3, n_cltr_i3, n_epochs20, random_state0) cross_validate(algo, data, measures[RMSE, MAE], cv5, verboseTrue)输出会给出 5 折中每一折的 RMSE、MAE 及拟合/测试耗时并汇总均值与标准差。六、基准表现它在 Surprise 算法族中处于什么水平README.md 的 Benchmarks 章节给出了各算法在 5 折交叉验证相同折划分、默认参数下的表现对比。CoClustering 的相关数据摘录如下MovieLens 100kRMSE0.963MAE0.753总耗时约0:00:06MovieLens 1MRMSE0.915MAE0.717总耗时约0:00:31。作为参照同表内 SVD 在 100k 上 RMSE 为0.934k-NN Basic 为0.980BaselineOnly 为0.944。可以看出 CoClustering 在默认参数下处于中等偏上水平与 NMF100k 上 RMSE0.963相当且训练速度较快。需要强调的是这些数据来自 README 中特定硬件intel i5 11th Gen 2.60GHz 笔记本与固定折划分下的记录仅供横向定位参考换硬件、换参数后绝对数值会变化。基准脚本见 examples/benchmark.py其中 CoClustering 使用random_state0以固定初始化。七、源码级细节均值计算与预测分支compute_averages三组均值的统计逻辑compute_averages 方法 遍历trainset.all_ratings()中每一条(u, i, r)评分同时累加三类计数与求和用户簇计数count_cltr_u与求和sum_cltr_u物品簇计数count_cltr_i与求和sum_cltr_i共簇计数count_cocltr[uc, ic]与求和sum_cocltr[uc, ic]。全部统计完成后用总和 ÷ 计数得到各类均值任何计数为 0 的空簇/空共簇都回退为全局均值global_mean避免除零并保持预测稳定。共簇均值存储在形状为(n_cltr_u, n_cltr_i)的二维数组中这正是预测阶段查表的基础。estimate预测阶段的三条分支estimate(u, i)co_clustering.pyx 第 239-262 行接收的是内部 id由predict先把原始 id 转换而来转换失败时给出UKN__xxx形式的占位 id见 algo_base.py 第 90-98 行。其分支逻辑为用户或物品任一未知 → 返回trainset.global_mean如前文所述这实际上吞掉了文档中描述的后两条分支两者都已知 → 取出u的用户簇uc与i的物品簇ic按公式avg_cocltr[uc, ic] user_mean[u] - avg_cltr_u[uc] item_mean[i] - avg_cltr_i[ic]计算并返回。整个预测过程是纯粹的查表与加减运算不涉及任何矩阵分解或邻居搜索这也是该算法训练和预测都很快的原因之一。八、测试验证与可复现性仓库为 CoClustering 提供了针对性测试可作为算法行为正确性的依据tests/test_co_clustering.py 中的test_CoClustering_parameters在 ml-100k 数据集、PredefinedKFold 折划分下通过交叉验证分别验证了n_cltr_u、n_cltr_i、n_epochs三个参数确实影响最终 RMSE例如把n_cltr_u改为 1 后 RMSE 与默认参数显著不同证明所有参数都被实际纳入计算。tests/test_algorithms.py 的 sanity check 参数化测试记录了CoClustering(random_state0)在固定折上的 RMSE 精确值1.0841941385276614用于回归校验——这也再次说明固定random_state时结果完全可复现。如果你在实验中想复现同一结果请保持数据集折划分与random_state一致。结语何时选择 CoClusteringCoClustering 是 Surprise 算法族中性价比很高的成员实现简单、无需相似度矩阵、无矩阵分解迭代训练速度与 NMF、SVD 相当默认参数下精度优于 k-NN 基础版。它特别适合需要快速建立基线、对可解释性有一定要求每个预测都能归因于用户簇/物品簇/共簇三个统计量的场景与 SVD、k-NN、BaselineOnly 等算法做多算法对比时充当聚类系代表可参考 examples/benchmark.py 的对比框架调参重点放在n_cltr_u、n_cltr_i聚类粒度与n_epochs收敛程度三个维度并始终固定random_state保证实验公平。相关源码与文档路径汇总算法实现 surprise/prediction_algorithms/co_clustering.pyx、API 文档 doc/source/co_clustering.rst、随机数工具 surprise/utils.py、基类行为 surprise/prediction_algorithms/algo_base.py、参数与回归测试 tests/test_co_clustering.py 与 tests/test_algorithms.py。赞分享机器学习人工智能【免费下载链接】SurpriseA Python scikit for building and analyzing recommender systems项目地址https://gitcode.com/gh_mirrors/su/Surprise点击查看免费下载相关推荐Caffe Power 层PowerLayer完全指南公式、参数配置与源码级实现解析Caffe Power 层PowerLayer完全指南公式、参数配置与源码级实现解析 Power 层是 Caffe 中一个轻量而通用的逐元素elemen深度学习计算机视觉Surprise 预测算法配置指南Baseline 估计与相似度度量调参实战Surprise 预测算法配置指南Baseline 估计与相似度度量调参实战 Surprise 是一个用于构建和分析推荐系统的 Python scikit。本机器学习人工智能Surprise 算法基类 AlgoBase 完全指南从 fit 到 predict 的预测算法生命周期Surprise 算法基类 AlgoBase 完全指南从 fit 到 predict 的预测算法生命周期 导读 AlgoBase 是 Surprise 推荐系机器学习人工智能上一篇MSEdgeRedirect完全指南从安装到配置的一站式操作手册下一篇CPython 非正式入门把 Python 解释器当作计算器、文本与列表工作台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考