我无法理解官方文档here中概述的sklearn.cluster.SpectralClustering
类的特定用例。假设我想使用自己的亲和矩阵来执行聚类。我首先实例化一个类SpectralClustering
的对象,如下所示:
from sklearn.clustering import SpectralClustering
cl = SpectralClustering(n_clusters=5,affinity='precomputed')
上面affinity
参数的文档如下:
affinity:string,array-like或callable,默认为'rbf'
如果是字符串,则可能是“nearest_neighbors”,“precomputed”,“rbf”或sklearn.metrics.pairwise_kernels支持的某个内核之一。 只应使用产生相似性得分的内核(非相似性增加的负值)。聚类算法不会检查此属性。
现在,对象cl
有一个方法fit
,其唯一参数X
的文档如下:
X:类似数组或稀疏矩阵,形状(n_samples,n_features)
OR,如果亲和力==
precomputed
,则为预先计算的形状亲和度矩阵(n_samples,n_samples)
这是令人困惑的地方。我使用自己的亲和力矩阵,其中度量为0表示两个点相同,数字越大意味着两个点更不相似。但是,参数affinity
的其他选项实际上采用数据集并生成相似性矩阵,其中更高值表示更多相似性,并且< em> lower 值表示不相似(例如径向基核)。
因此,在我的fit
实例上使用SpectralClustering
方法时,我是否真的需要将亲和度矩阵转换为相似度矩阵,然后再将其传递给fit
方法调用参数X
?相同的文档页面记录了将距离转换为行为良好的相似性,但未明确指出应该执行此步骤的位置,以及通过哪种方法调用。
答案 0 :(得分:5)
直接来自文档:
如果您有一个亲和度矩阵,例如距离矩阵,其中0表示相同的元素,而高值表示非常不相似的元素,则可以通过应用高斯的方法将其转换为非常适合算法的相似性矩阵(RBF,热)内核:
np.exp(- X ** 2 / (2. * delta ** 2))
这是您自己的代码,其结果可以传递给fit
。出于此算法的目的,亲和力意味着相似性,而不是距离。