使用参数 affinity='precomputed' 的类 sklearn.cluster.SpectralClustering

Posted

技术标签:

【中文标题】使用参数 affinity=\'precomputed\' 的类 sklearn.cluster.SpectralClustering【英文标题】:Using the class sklearn.cluster.SpectralClustering with parameter affinity='precomputed'使用参数 affinity='precomputed' 的类 sklearn.cluster.SpectralClustering 【发布时间】:2013-12-30 02:45:08 【问题描述】:

我无法理解官方文档here 中概述的sklearn.cluster.SpectralClustering 类的特定用例。假设我想使用自己的亲和矩阵来执行聚类。我首先实例化一个SpectralClustering 类的对象,如下所示:

from sklearn.clustering import SpectralClustering

cl = SpectralClustering(n_clusters=5,affinity='precomputed')

上面affinity参数的文档如下:

affinity : 字符串,类数组或可调用,默认为'rbf'

如果是字符串,这可能是“nearest_neighbors”、“precomputed”、“rbf”之一或 sklearn.metrics.pairwise_kernels 支持的内核之一。 仅应使用产生相似性分数(随相似性增加的非负值)的内核。聚类算法不检查此属性。

现在对象cl 有一个方法fit,关于其唯一参数X 的文档如下:

X : 类数组或稀疏矩阵,形状 (n_samples, n_features)

或者,如果 affinity==precomputed,则预先计算的形状为 (n_samples, n_samples) 的相似性矩阵

这是令人困惑的地方。我正在使用我自己的亲和度矩阵,其中 0 表示两个点相同,数字越大表示两个点越不相似。然而,参数affinity 的其他选择实际上采用一个数据集并生成一个相似度矩阵,其中较高值表示更多相似度,而较低的 值表示不相似(例如径向基核)。

因此,当在我的SpectralClustering 实例上使用fit 方法时,我是否真的需要将我的亲和矩阵转换为相似矩阵,然后再将其作为参数fit 方法调用X?同一文档页面记录了将距离转换为行为良好的相似性,但没有明确指出应该在哪里执行此步骤,以及通过哪个方法调用。

【问题讨论】:

【参考方案1】:

直接来自文档:

如果您有一个相似度矩阵,例如距离矩阵,其中 0 表示相同的元素,而高值表示非常不同的元素,则可以通过应用高斯将其转换为非常适合算法的相似度矩阵(RBF,热)内核:

np.exp(- X ** 2 / (2. * delta ** 2))

这在你自己的代码中,结果可以传递给fit。就本算法而言,相似度意味着相似性,而不是距离。

【讨论】:

谢谢 - 我注意到了 sn-p,但被这个措辞所吸引,即相似性意味着相似性,而不是距离。

以上是关于使用参数 affinity='precomputed' 的类 sklearn.cluster.SpectralClustering的主要内容,如果未能解决你的问题,请参考以下文章

凝聚聚类层次可视化

nginx worker_cpu_affinity使用方法

nginx优化CPU配置worker_cpu_affinity

Affinity Propagation+聚类

Affinity Propagation+聚类

Nginx配置需要优化的几个参数