如何使用自定义度量(设置距离)构建成对距离矩阵?

How can I construct a pairwise distance matrix using a custom metric (set distance)?

我想创建一个程序,根据我对集合的计算结果计算距离矩阵。有关这些集合的数据取自文件。 我目前有类似下面的代码,但也许我的想法很糟糕,可以改进(例如只列出集合,不排序)。

my_list = []
file = open("plik.txt","r")

for i in file:
    my_sets = i.split(", ")
    A = set(my_sets[0])
    B = set(my_sets[1])
    a = len(A.difference(B))
    b = len(B.difference(A))
    c = len(A.union(B))
    metric = (a*b)/c
    my_list.append(round(metric, 2))

print(my_list)
file.close()

举个例子,假设我在一个文件中有这样的东西(4 组的所有组合):

set1 set2
set1 set3
set1 set4
set2 set3
set2 set4
set3 set4

现在,结果指标的值示例可以是:

[0.8, 1.2, 4.3, 5, 7, 0.2]

我想从中得到一个 4x4 矩阵,包含所有对的度量:

[[0, 0.8, 1.2, 4.3],
[0.8, 0, 5, 7],
[1.2, 5, 0, 0.2],
[4.3, 7, 0.2, 0]]

我应该如何转换为对获得的度量值列表以获得距离矩阵?

如果距离的计算成本不高,我会按如下方式重构您的代码(为了说明目的,我正在即兴创作一个可重现的示例,您可以跳过 my_sets 创建位)

给定一个 plik.txt 文件,其中包含一列集合,如下所示:

my_sets
ABCD
EFGD
AGID
ZWHK

你可以读入它并用

将它转换成集合
import pandas as pd
import numpy as np
data = pd.read_csv("plik.txt")

my_sets = data.my_sets.apply(set).to_list()

我现在有 my_sets,一个 4 组列表(字母,但它们可以是任何东西):

 [{'A', 'B', 'C', 'D'},
 {'D', 'E', 'F', 'G'},
 {'A', 'D', 'G', 'I'},
 {'H', 'K', 'W', 'Z'}]

对于每对元素,我可以计算出您使用集合操作定义的距离

def dist(a, b) : return len(a.difference(b))*len(b.difference(a))/len(a.union(b))

要在 my_sets 中的集合之间创建一个简单的成对距离对称矩阵,一个简单的方法是嵌套 for 循环:

N = len(my_sets)

pdist = np.zeros((N, N)) # I have imported numpy as np above!

for i in range(N):
  for j in range(i + 1, N):
    pdist[i,j] = dist(my_sets[i], my_sets[j])
    pdist[j,i] = pdist[i,j]

pdist 应该是您要查找的对称矩阵,并填充 N*(N-1)/2 操作(N 元素成对的组合)。