【问题标题】:How can I construct a pairwise distance matrix using a custom metric (set distance)?如何使用自定义度量(设置距离)构造成对距离矩阵?
【发布时间】:2020-06-10 22:52:01
【问题描述】:

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

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

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

【问题讨论】:

  • 感觉还有什么可以发的。您能否用文字描述如何从列表中计算距离矩阵。例如,矩阵条目 m(i,j) 可能如何依赖于列表。
  • 好的,我会努力写更多的,我会附上代码。
  • 我很可能无法完成这项任务。对不起代码,但我很快就粘贴了草图。我会尽快编辑它。也许从一开始我会解释项目的假设:)

标签: python matrix data-science bioinformatics


【解决方案1】:

如果距离的计算成本不高,我将重构您的代码如下(为了说明目的,我正在即兴创作一个可重现的示例,您可以跳过 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 个元素成对的组合)。

【讨论】:

  • 我试图根据一些假设草拟一个答案,不确定它是否正确,但我希望这会有所帮助。一些想法是 1)您可以使用像 pandas 这样的专用库来读取数据 2)无需计算所有组合的成对距离并将列表重塑为矩阵,可以逐个元素地构造矩阵。跨度>
  • 非常感谢。我刚刚开始冒险,你帮了我很多! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2020-02-21
  • 2023-03-10
  • 1970-01-01
  • 2016-12-06
  • 2011-08-08
相关资源
最近更新 更多