我想创建一个程序,从我对集合的计算结果中计算出一个距离矩阵。关于这些集合的数据是从一个文件中获取的。我目前有一些类似下面的代码,但也许我的想法是相当糟糕的,它可以被改进(例如,集合只列出,而不是排序)。
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个元素成对的组合)。