如何为聚类指定距离函数



我想对给定自定义距离的点进行聚类,奇怪的是,似乎scipy和sklearn聚类方法都不允许指定距离函数。

例如,在sklearn.cluster.AgglomerativeClustering中,我唯一可以做的就是输入一个亲和矩阵(这将非常占用内存)。为了构建这个矩阵,建议使用sklearn.neighbors.kneighbors_graph,但我不明白如何指定两点之间的距离函数。有人能启发我吗?

所有scipy层次聚类例程都将接受一个自定义距离函数,该函数接受指定一对点的两个1D向量并返回标量。例如,使用fclusterdata:

import numpy as np
from scipy.cluster.hierarchy import fclusterdata
# a custom function that just computes Euclidean distance
def mydist(p1, p2):
    diff = p1 - p2
    return np.vdot(diff, diff) ** 0.5
X = np.random.randn(100, 2)
fclust1 = fclusterdata(X, 1.0, metric=mydist)
fclust2 = fclusterdata(X, 1.0, metric='euclidean')
print(np.allclose(fclust1, fclust2))
# True

metric= kwarg的有效输入与scipy.spatial.distance.pdist的有效输入相同。

sklearn具有DBSCAN,它允许预先计算距离矩阵(使用三角矩阵,其中M_ij是i和j之间的距离)。但这可能不是您想要的集群类型。

此外,正如其他人提到的,scipy.cluster.hhierarchy.fclusterdata还允许预先计算距离度量。这个回复中给出了一段代码,它提供了一点代码,可以将距离的NxN矩阵转换为fclusterdata可以轻松读取的格式:

import scipy.spatial.distance as ssd
# convert the redundant n*n square matrix form into a condensed nC2 array
    distArray = ssd.squareform(distMatrix) # distArray[{n choose 2}-{n-i choose 2} + (j-i-1)] is the distance between points i and j

对于分层聚类,scipy.cluster.hhierarchy.fclusterdata允许您通过metric=关键字参数使用列表中包含的任何距离度量,前提是它与您想要的链接方法配合使用。

相关内容

  • 没有找到相关文章

最新更新