最近工作中需要分别对视觉特征(68w+)和文本特征(9000+)进行聚类,由于两者数量差距大,所以尝试了许多种聚类的方式,这里简单总结下:
视觉特征
(1)lloyd聚类
代码为lloyd_motion_cluster.py和lloyd_2d_cluster.py
(2)single-pass聚类
代码为single_pass_motion_cluster.py和single_pass_2d_cluster.py
(3)层次聚类
代码为birch_motion_层次聚类_cluster.py和birch_2d_层次聚类_cluster.py
(4)dbscan聚类
代码为dbscan_2d_cluster.py和dbscan_motion_cluster.py
(5)meanshift聚类
代码为meanshift_2d_cluster.py和meanshift_motin_cluster.py
(6)gpu-kmeans聚类
代码为gpu-KMeans-2d.py和gpu-KMean-motions.py
其中1-5无法聚类出65万数据,一是计算内存爆炸,二是single-pass计算时间过长,最后采用gpu-kmeans获取聚类结果
根据聚类结果,随机选取10万个点画出可视化图
代码为:2d-pic-visualize.py和motion-pic-visualize.py
画图结果存放在100000个点画图结果中,聚类结果存放在result文件夹中
需要说明的是,kmeans其实可以直接调用sklearn.cluster.KMeans
,传入参数即可。但因为这个提供的版本没办法在gpu上跑(其变量本质还是基于numpy定义的类型),所以又按照kmeans(lloyd)的流程又自己实现了一遍,这一版的变量基于torch.Tensor,可以放在gpu上
文本特征
(1)lloyd聚类
代码为verb-lloyd_cluster.py和noun-lloyd_cluster.py
(2)single-pass聚类
代码为single_pass_verb_cluster.py和single_pass_noun_cluster.py
文本聚类结果存放在文本特征result文件夹中
需要说明的是,lloyd聚类其实是kmeans聚类中最常见最基本的一种,除此之外还有一些改进的版本,具体可以参考3 versions of k-Means。使用sklearn.cluster.KMeans
实现lloyd算法时,将参数 algorithm='lloyd'
传入即可(其实默认值就是lloyd)
single-pass方法其实很简单,就是只过一遍的意思,设定一个阈值,每次计算距离,在阈值之上就归入已有类,否则就建立新类(从逻辑上说,感觉这种方式聚出来的效果不如kmeans)。算法的详细实例可参见Example of Single Pass Clustering Technique
代码暂未公布,有点不太想公布…实在想要代码的给我发评论留邮箱好了,我看心情发一下