如何使用自定义度量(设置距离)构建成对距离矩阵?
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 元素成对的组合)。
我想创建一个程序,根据我对集合的计算结果计算距离矩阵。有关这些集合的数据取自文件。 我目前有类似下面的代码,但也许我的想法很糟糕,可以改进(例如只列出集合,不排序)。
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 元素成对的组合)。