我如何使用自定义的度量(集合距离)来构建一个对偶距离矩阵?

问题描述 投票:0回答:1

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

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]]

我应该如何转换得到的对的度量值列表,从而得到距离矩阵?

python matrix data-science bioinformatics
1个回答
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个元素成对的组合)。

© www.soinside.com 2019 - 2024. All rights reserved.