调包一时爽,复现马上躺。
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. win10 下的 CUDA10.0 +CUDNN + tensorflow + opencv 环境部署

    1 CUDA 10.0 安装  win10 下的cuda 安装是非常简单的,和其他程序安装没什么区别,现在 tensorflow 1.13 版本以上 支持 CUDA 10.0 ,这里选取了CUDA 1 ...

  2. web安全在线工具梳理

    目录: (一)搜索引擎语法一.百度.国内二.bing(必应).微软的三.google.国外 (二)网络空间搜索引擎用于查找网络空间的目标设备一.撒旦.国外二.钟馗之眼.国内三.佛法.国内 (三)在线w ...

  3. sql sever2008 R2 检测到索引可能已损坏。请运行 DBCC CHECKDB。

    1.设置成单用户状态 USE MASTER ALTER DATABASE DBNAME SET SINGLE_USER; GO --DBNAME为修复的数据库名 2.执行修复语句,检查和修复数据库及索 ...

  4. javascript_04-类型转换

    类型转换 掌握三种类型的转换 转换成字符串类型 转换成数值类型 转换成布尔类型 转换成字符串 1.几乎每一个值都有 toString() 方法,除了 null 和 undefined. var age ...

  5. SHA256WithRSA

    在上文中了解到SHA和RSA,工作中恰好用到扩展应用:SHA256WithRSA,本文总结下学习过程,备忘の 再提供另外一种方法,实现Java版pem密钥和.Net版xml密钥相互转换的方法 密钥转换 ...

  6. Android笔记(四) Activity之间的数据传递

    我们之前使用Intent进行Activity之间的跳转,其实Intent还可以在启动活动的时候传递数据. Intent提供了一系列的putExtra方法以便我们把想要传递的数据暂存在Intent中,待 ...

  7. JAVA 查找某个目录是否存在,如果存在,打印出来

    题目:现有如下目录结构,查找结构中是否存在Directory11,如果存在,打印出来 |---test |---|---Directory1 |---|---|---Directory11 |---| ...

  8. rhel7下安装EPEL源

    1.rhel7安装aliyun下的epel源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

  9. 【OF框架】定义框架标准WebApi,按照规范返回状态信息及数据信息

    准备 了解框架基本应用,已经完成Controller创建. 一.定义框架标准WebApi 一个标准的WebApi,包含预定义的入参和回参类型 入参为CallParams,需要增加FromBody声明, ...

  10. 《AlwaysRun!团队》第四次作业:项目需求调研与分析

     项目  内容  这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/  这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daiz ...