通过相似性测量进行图像聚类(CW-SSIM)

数据挖掘 机器学习 r Python scikit-学习 k-均值
2021-09-19 14:24:27

我正在尝试使用scikit-learnpyssim来聚类一组图像 - 少于 100 个。

最终目标是根据计算的相似性度量 - CW-SSIM 将图像放入几个桶(集群)中。

这项任务似乎微不足道,但我想不出在 scikit-learn 中处理“基于相似性”聚类的最佳方法。K-Means 聚类看起来是个不错的选择,但它不接受任何“比较函数”或自定义距离函数。

那么如何在 scikit-learn 中处理基于比较(基于相似性)的聚类呢?

根据计算的 CW-SSIM 相似度值,我正在考虑每个单元格 1(相似)或 0(不相似)的“比较矩阵”。该矩阵将用于拟合 K-Means 聚类。但随后我们将面临可扩展性问题,因为这样的矩阵的维度将等于图像的数量……未来可能会增长到 1+ 百万。

如果 R 中有比 Python 更简单的选项,那么我也准备好复习了。

提前致谢。

2016 年 1 月 18 日更新

我在 GitHub 上创建了一些关于这个主题的代码:https ://github.com/llvll/imgcluster

该项目还包括 IP[y] Notebook 分步说明和额外注释:https ://github.com/llvll/imgcluster/blob/master/ip%5By%5D/imgcluster.ipynb

2个回答

我会使用常规的聚类算法,并用您选择的可微损失函数替换通常是 MSE 的目标函数。另一种方法是学习一个嵌入,使用神经网络优化相似度指标,然后将其聚类。

如果您更愿意进行基于相似性的聚类,这里有一些论文:

  • 一种基于相似度的鲁棒聚类方法
  • 通过相似函数进行聚类的判别框架
  • 左随机矩阵分解的基于相似性的聚类

sklearn 实现了两种相似性聚类方法:亲和传播谱聚类

似乎您没有固定数量的质心(集群),因此基于质心的聚类(例如 k-means)不能在您的情况下使用。但是,您可以使用基于密度的聚类,例如 DBSCAN。