2

我正在 python 中执行层次聚类分析。我的变量是二进制的,所以我想知道如何计算二进制欧几里得距离。根据文献,可以将此距离度量与这种聚类技术一起使用。

Choi, SS, Cha, SH, & Tappert, CC (2010)。二进制相似性和距离度量的调查。系统学、控制论和信息学杂志,8(1),43-48。

我正在使用scipy.spatial.distance.pdist(X, metric='euclidean'),但这个函数对非二进制数据使用欧几里得距离。

是否有任何 python 库来计算基于二进制欧几里德距离度量的距离矩阵?

4

2 回答 2

1

您引用的论文有一个公式,它只是一种计算二进制数据标准欧几里得距离的更快方法。在这种情况下,该scipy方法将正常工作。您是否希望使用不同的距离,或者您的数据是否以某种方式格式化,因此pdist()无法在本机上使用?

于 2018-08-16T07:04:49.393 回答
0

解决方案 1 - numpy

from numpy import linalg, array

M1 = [[1, 1], [0, 1]]
M2 = [[0, 1], [1, 1]]

print(linalg.norm(array(M1) - array(M2)))

解决方案 2 - 自定义

M1 = [[1, 1], [0, 1]]
M2 = [[0, 1], [1, 1]]

def binary_dist(m1, m2):
    sum = 0
    for i in range(len(m1)):
        for j in range(len(m1[i])):
            if m1[i][j] != m2[i][j]:
                sum += 1
    return sum ** .5


print(binary_dist(M1, M2))
于 2018-08-16T06:59:04.487 回答