使用 scikit-learn 进行光谱聚类的预计算距离

Precomputed distances for spectral clustering with scikit-learn

我正在努力理解谱聚类文档 here

具体来说。

If you have an affinity matrix, such as a distance matrix, for which 0 means identical elements, and high values means very dissimilar elements, it can be transformed in a similarity matrix that is well suited for the algorithm by applying the Gaussian (RBF, heat) kernel: np.exp(- X ** 2 / (2. * delta ** 2))

对于我的数据,我有一个大小为 (n_samples, n_samples) 的完整距离矩阵,其中较大的条目表示不同的对,较小的值表示相似的对,零表示相同的条目。 (即唯一的零沿着对角线)。

所以我需要做的就是用 affinity = "precomputed" 构建 SpectralClustering 对象,然后将转换后的距离矩阵传递给 fit_predict.

我卡在了建议的变换方程上。 np.exp(- X ** 2 / (2. * delta ** 2))

这里的X是什么? (n_samples, n_samples) 距离矩阵?

如果是,那么delta是什么。只是 X.max()-X.min() 吗?

调用 np.exp(- X ** 2 / (2. * (X.max()-X.min()) ** 2)) 似乎是正确的做法。 IE。大项变得相对较小,小项相对较大,所有项都在 0 和 1 之间。对角线全为 1,这是有道理的,因为每个点都与自身最仿射。

但是我很担心。我想如果作者希望我使用 np.exp(- X ** 2 / (2. * (X.max()-X.min()) ** 2)) 他会告诉我只使用那个,而不是把 delta 扔进去。

所以我想我的问题就是这个。 delta 是什么?

是的,X 在这种情况下是距离矩阵。 delta是一个比例参数,你可以随意调整。它控制 "tightness",可以说,distance/similarity 关系,从某种意义上说,小三角洲增加了远点的相对不相似性。

注意 delta 与 RBF 内核的 gamma 参数的倒数成正比,前面在文档 link 中提到过:两者都是自由参数,可以是用于调整聚类结果。