在 Scikit 的谱聚类中使用预先计算的亲和矩阵时的 KNN?
Posted
技术标签:
【中文标题】在 Scikit 的谱聚类中使用预先计算的亲和矩阵时的 KNN?【英文标题】:KNN when using a precomputed affinity matrix in Scikit's spectral clustering? 【发布时间】:2017-03-02 12:03:54 【问题描述】:我有一个在大量对象之间计算的相似度矩阵,每个对象都可以与任何其他对象具有非零相似度。我为另一个任务生成了这个矩阵,现在想对它进行聚类以进行新的分析。
似乎scikit's spectral clustering 方法可能很合适,因为我可以传入预先计算的亲和矩阵。我也知道,谱聚类在构建亲和矩阵时通常使用一定数量的最近邻,而我的相似矩阵没有相同的约束。
如果我传入一个矩阵,允许亲和矩阵中的节点之间有任意数量的边,scikit 会限制每个节点只有一定数量的最近邻居吗?如果没有,我想我将不得不对我预先计算的亲和度矩阵进行更改。
【问题讨论】:
【参考方案1】:您不必自己计算亲和力来进行光谱聚类,sklearn 会为您完成。
当您调用sc = SpectralClustering()
时,affinity
参数允许您选择用于计算亲和矩阵的内核。 rbf
默认情况下似乎是内核,并且不使用特定数量的最近邻居。但是,如果您决定选择另一个内核,则可能需要使用 n_neighbours
参数指定该编号。
然后您可以使用sc.fit_predict(your_matrix)
来计算集群。
【讨论】:
但是我已经有一个符合 scikit 标准的相似度矩阵(相似度为正、对称、方形),并且一直在使用 affinity='precomputed' 选项。您是否建议我根据预先计算的亲和度矩阵计算新的亲和度矩阵? 我想如果你愿意的话,你可以计算自己的亲和度矩阵,但是使用你的相似度矩阵就足够了(相似度矩阵也是 suqare,正向和对称的)。如果您的输入数据是相似度矩阵,让 sklearn 为您完成工作,它会自行计算相似度矩阵 :) 啊,我明白了。我使用的是预先计算的亲和力矩阵,因为它是另一个资源密集型进程的输出。我只是想看看我是否可以从之前的流程已经投入的工作中构建出新的东西。交给我处理的亲和矩阵比用于创建它的输入要小得多。跨度> 好吧,你说你有一个相似矩阵,这就是为什么!请注意,使用 numpy/scipy 从头开始实现谱聚类不到 10 行代码,而且效率很高! 也看看那里:***.com/questions/20530804/…【参考方案2】:光谱聚类不需要稀疏矩阵。
但如果我没记错的话,找到稀疏矩阵而不是密集矩阵的最小非零特征向量会更快。最坏的情况可能仍然是 O(n^3) - 谱聚类是您能找到的最慢的方法之一。
【讨论】:
以上是关于在 Scikit 的谱聚类中使用预先计算的亲和矩阵时的 KNN?的主要内容,如果未能解决你的问题,请参考以下文章