基于余弦相似性的单链连通度聚类
silicon-clustering的Python项目详细描述
一种快速计算元素连通度分量(簇)的算法 论它们的特征余弦相似性。如果 它们的余弦相似性高于给定的阈值。接受任何一个核 二维数组或scipy列稀疏(csr)矩阵。
从PyPI安装 使用pip install silicon-clustering
Tomáš Gavenčiak ^{tt2}$
用法示例
import silicon, numpy # 1000 rows, 10 features data = numpy.random.rand(1000, 10) # The ensemble normalizes rows of the data by default # Choose high verbosity (via logging), cosine similarity >=0.97 ens = silicon.CosineClustering(data, sim_threshold=0.97, verbosity=2) ens.run() # (... progress reports) ens.clusters[0] # <Cluster no 0, size 13> ens.clusters_by_size()[0] # <Cluster no 36, size 22> # With pyplot you can see the projected points import matplotlib.pyplot as plt ens.plot(); plt.show() # or the individual clusters ens.clusters_by_size()[0].plot(ens); plt.show()
详细信息
与传统算法相比,该算法使用了几种技巧来加快计算速度 通过矩阵乘法的所有成对标量积:
- 数据按特征投影到cell_dims主成分(pca)中。这个 投影将数据划分为大小为self.distance的单元格,因此只有 相邻的细胞有机会足够相似。那么 相邻的单元格相乘。
- 这仍然意味着有些细胞太大,不能进行矩阵乘法,所以一秒钟 在细胞增殖前使用技巧:蚕食 数据集。对于随机中心行,计算与所有其他行的相似性,并 所有类似的点聚集在一起(可能合并现有的集群)。这个有 预聚类数据集中最密集点的效果(特别是重复值) -密集的星团有很好的机会被一个中心击中,消除了大部分 簇的质量(以及相应的细胞)。啃咬次数 迭代应该根据数据进行调整(以合理地减小单元大小)。
- 为了结合这两个技巧,一部分聚集点(例如10%)与 所有未聚类的点都被考虑用于相邻细胞的增殖。百分之十 返回的点应确保被分块的簇与 被蚕食击中,但接近并实际上属于星团。
由于不是所有的分块行都用在相邻的单元格标量积中,所以算法 可能会错过一些在啃食球边界上的单个簇连接,但我们发现了 实际上不太可能。
该算法在不到一秒钟的时间内将10000个高斯点在30个维度上进行聚类。