如何指定聚类的距离函数?
How to specify a distance function for clustering?
我想根据自定义距离对点进行聚类,奇怪的是,scipy 和 sklearn 聚类方法似乎都不允许指定距离函数。
例如,在sklearn.cluster.AgglomerativeClustering
中,我唯一可以做的就是输入一个亲和力矩阵(这将非常占用内存)。为了构建这个矩阵,建议使用 sklearn.neighbors.kneighbors_graph
,但我不明白如何在两点之间指定距离函数。有没有大神能指教一下?
对于层次聚类,scipy.cluster.hierarchy.fclusterdata allows you to use any of the distance metrics included in the list here 通过 metric=
关键字参数,前提是它适用于您想要的链接方法。
所有 scipy 层次聚类例程都将接受自定义距离函数,该函数接受指定一对点的两个一维向量和 returns 一个标量。例如,使用 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.hierarchy.fclusterdata 还允许预先计算距离指标。 this reply 中给出了一段代码,它提供了一些代码将 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 和 sklearn 聚类方法似乎都不允许指定距离函数。
例如,在sklearn.cluster.AgglomerativeClustering
中,我唯一可以做的就是输入一个亲和力矩阵(这将非常占用内存)。为了构建这个矩阵,建议使用 sklearn.neighbors.kneighbors_graph
,但我不明白如何在两点之间指定距离函数。有没有大神能指教一下?
对于层次聚类,scipy.cluster.hierarchy.fclusterdata allows you to use any of the distance metrics included in the list here 通过 metric=
关键字参数,前提是它适用于您想要的链接方法。
所有 scipy 层次聚类例程都将接受自定义距离函数,该函数接受指定一对点的两个一维向量和 returns 一个标量。例如,使用 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.hierarchy.fclusterdata 还允许预先计算距离指标。 this reply 中给出了一段代码,它提供了一些代码将 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