调包一时爽,复现马上躺。
Co-Clustering
注意右上角的:“Edit on GitHub”,一开始疯狂吐槽没有源码,复现得非常难受,今天刚做完GM05中Algotirhm1部分,再次点开无意中发现了源码的GitHub,准备复现完成后去看看不同所在。预期到复现效果一定是极差的,并不是自我质疑,而是所用设备问题,在行列确定聚类数时,没有能力枚举行列大小运用肘部法则确定k值,故随机了几组范围,得到了这些范围内最小的SSE误差聚类数作为行列的类数。本博客分为两部分,第一部分主要阐述复现的学习过程,第二部分则是对源码的学习。大概率是看不懂了Co-Clustering(下称该算法)
Prediction Formula:
$ \widehat{A_{ij}} = A^{COC}_{gh} + (A^R_i - A^{RC}_g) + (A^C_j - A^{CC}_h) $

上面就是Co-Clustering的预测公式,下面来说说复现过程的问题和手拙的地方。
先放核心算法(Static Training):

复现描述:
首先,算法描述中的Input,提到了权重数组W($W_ij = (A_ij==0)$ ),这个可以很方便地求出,但是还涉及到了行列的类数,这显然没有提供,所以是需要聚类的。在聚类的时候,就想到直接运用KMeans,枚举K,用肘部法则来确定k值,但是其实这样非常地花费时间,所以就随机了几个区间取最好的结果来(最后的SSE也有大几万,可以说还是很差劲的)。
其次,在Method中,一开始随机的协同中心,发现其实时一系列的协同中心,并不是很理解,就先按照自己的理解把每个用户和每个电影的平均得分,作为初始类中心,然后准备开始迭代,发现jupyter的*一直没有变成数字,就大概猜到迭代不动了,至于为什么,原因也不是很清楚。
最后,第一次迭代仍然没有完成,等于没有复现成功。而看了一下算法描述的第二部分是Prediction,其实就是开头写下的公式,并且结合需要预测的用户-电影组是不是未在数据集中出现过的(00,01,10,11共四种情况),来做对应调整。还有最后一部分是增量训练,就是面对新加入的数据,并不是预测就结束了,是需要变成数据集的数据来不断学习的,这部分去看了算法和源码学习了一下。

源码学习:
很惊喜的是,竟然都看得懂。很遗憾的是,这不难的代码竟然没有复现出来,不得不说码力还是太僵了。代码很巧妙地实现了论文所说的第一部分算法(第二部分仅为公式套用),真的还需要多学习,论文摆在眼前竟然还只复现了一半不到,想不清楚怎么去迭代的。但是,对于第一部分还有个疑惑,就是源码假设了用户和电影的类别数都是3,然后去迭代,并没有我去枚举k找到最佳类数的操作,在这里不是很理解。虽然最后肯定会收敛,但是这难道不会影响预测的准确度么?
其次,还有一个疑虑,就是代码并没有第三部分增量学习的表达(Incremental Training),怎么也要有个update函数吧而论文所说该算法的亮点正是对于新数据,并且论文假设其为局部增量的时候(局部增量,个人理解是小规模的新加入数据,其规模相对于原来的数据来说较小,增量特征学习),该算法迭代速度与准确度优于SVD,NMF。于是,我大胆猜测所谓的增量学习,不过就是重新计算迭代预测,因为CoClustering的迭代速度很快本地跑得好慢,所以所谓的局部增量变化,其实就是直接被当成了新增加的用户和电影(如若两者均为新的)加入矩阵来进行预测,而论文的描述也是如同预测一般去分类讨论,紧接着更新对应的中心、均值,说明和我的猜测相去无几本来以为会有全新的操作。至于第四部分(Parallel Co-Clustering),看懂了语言描述中将行列分开计算来加快速度的思路,但在算法描述的时候,又说是拿一部分子矩阵来迭代(就是将算法第一部分描述中的更新整个矩阵,变成更新所选取的子矩阵),可能是对于并行计算并没有了解,所以带了这些疑惑,之后了解并行计算再回头看看。

PS:第一次看这种纯算法描述的英文论文有点难懂,如果没调包估计不会遇到这个算法,也不会为了能够有底气地展示去如此认真地看论文,认真学掉还是挺有趣的,可以说让聚类在我心里提了一个档次,疯狂入坑。

Co-Clustering_Reproducing的更多相关文章

  1. CentOS 7.0 部署 Django 到运行起来第一个web service

    最近在学习Python,今天发现Django如此强大的web框架,不得不来试一试. 1. 安装Python,官网建议用Python3:

随机推荐

  1. X5内核浏览器video自动全屏解决办法-canvas

    最近在做手机端上面播放视频的项目,但是在安卓上面,video的播放是脱离页面,置于最顶层的,所以带来了很多问题,为了解决这个问题,查看了多方资料,写了下面简单的demo,方便以后使用. 下面就是运用c ...

  2. 如何避免Linux操作系统客户端登陆超时-linux命令之TMOUT=

    工作中经常遇到使用ssh,telnet工具登陆Linux操作系统时,出现的超时问题,怎么处理呢? 添加下面命令: TMOUNT=

  3. 开始Swift学习之路

    Swift出来好几个月了,除了同事分享点知识外,对swift还真没有去关心过.GitHub上整理的学习Swift资料还是很不错的,目前也推出了电子书和PDF格式. Swift的语法和我们平常开发的语言 ...

  4. 【Zookeeper】本地ZK的搭建

    很久没有写了..最近看书的笔记都记在有道云上面..框架的使用觉得还是有必要写一下 1.下载 官网:https://www.apache.org/dyn/closer.cgi 清华镜像:https:// ...

  5. springboot系列(八)springboot整合mybatis

    本篇介绍一下在springboot中整合mybatis ,使用mysql数据库,集成durid 连接池技术,全部代码是手动生成,没有使用代码生成器来构建代码. 一.创建数据库和表 二.在pom中添加依 ...

  6. Python使用xlrd、pandas包从Excel读取数据

    #coding=utf-8 # pip install xlrd import xlrd def read_from_xls(filepath,index_col_list): #filepath:读 ...

  7. 程序员修仙之路--优雅快速的统计千万级别uv

    菜菜,咱们网站现在有多少PV和UV了? Y总,咱们没有统计pv和uv的系统,预估大约有一千万uv吧 写一个统计uv和pv的系统吧 网上有现成的,直接接入一个不行吗? 别人的不太放心,毕竟自己写的,自己 ...

  8. 说说客户端访问一个链接URL的全过程

    讲讲登录权限是如何控制的   我们可以把这个过程类比成一个电话对话的过程.当我们要打电话给某个人,首先要知道对方的电话号码,然后进行拨号.打通电话后我们会进行对话,当然要对话肯定需要共同的语言,如果一 ...

  9. 使用Wireshark对手机抓包设置说明

    一.原因 1.手机目前没有类似的抓包工具可以直接对手机进行抓包 2.一般数据交换的路线是:手机——>运营商——>服务器,可以在手机和运营商中间加一道网卡变成:手机——>PC网卡——& ...

  10. TortoiseSVN “*/SendRpt.exe not found”?