当前位置: 首页 > 知识库问答 >
问题:

如何有效地从事务行构建亲和矩阵?

颜楚青
2023-03-14

给定json文件中节点之间的事务(可能大到2 GBs),其中约有100万个节点和约1000万个事务,每个事务有10-1000个节点,例如

{"transactions":
 [
  {"transaction 1": ["node1","node2","node7"], "weight":0.41},
  {"transaction 2": ["node4","node2","node1","node3","node10","node7","node9"], "weight":0.67},
  {"transaction 3": ["node3","node10","node11","node2","node1"], "weight":0.33},...
  ]
}

将其转换为节点亲和力矩阵的最优雅和有效的pythonic方法是什么,其中亲和力是节点之间加权事务的总和。

affinity [i,j] = weighted transaction count between nodes[i] and nodes[j] = affinity [j,i]

例如

affinity[node1, node7] = [0.41 (transaction1) + 0.67 (transaction2)] / 2 = affinity[node7, node1]

注意:亲和矩阵将是对称的,因此仅计算下三角形就足够了。

数值不具有代表性***仅结构示例!


共有1个答案

张鹏鹍
2023-03-14

首先,我会清理数据,用一个整数表示每个节点,并从这样一个字典开始

data=[{'transaction': [1, 2, 7], 'weight': 0.41},
      {'transaction': [4, 2, 1, 3, 10, 7, 9], 'weight': 0.67},
      {'transaction': [3, 10, 11, 2, 1], 'weight': 0.33}]

不确定这是否足够Python化,但它应该是不言而喻的

def weight(i,j,data_item):
    return data_item["weight"] if i in data_item["transaction"] and j in data_item["transaction"] else 0

def affinity(i,j):
    if j<i: # matrix is symmetric
        return affinity(j,i)
    else:
        weights = [weight(i,j,data_item) for data_item in data if weight(i,j,data_item)!=0]
        if len(weights)==0:
            return 0
        else:
            return sum(weights) / float(len(weights))

ln = 10 # number of nodes
A = [[affinity(i,j) for j in range(1,ln+1)] for i in range(1,ln+1)]

要查看关联性矩阵

import numpy as np
print(np.array(A))
    [[ 0.47  0.47  0.5   0.67  0.    0.    0.54  0.    0.67  0.5 ]
     [ 0.47  0.47  0.5   0.67  0.    0.    0.54  0.    0.67  0.5 ]
     [ 0.5   0.5   0.5   0.67  0.    0.    0.67  0.    0.67  0.5 ]
     [ 0.67  0.67  0.67  0.67  0.    0.    0.67  0.    0.67  0.67]
     [ 0.    0.    0.    0.    0.    0.    0.    0.    0.    0.  ]
     [ 0.    0.    0.    0.    0.    0.    0.    0.    0.    0.  ]
     [ 0.54  0.54  0.67  0.67  0.    0.    0.54  0.    0.67  0.67]
     [ 0.    0.    0.    0.    0.    0.    0.    0.    0.    0.  ]
     [ 0.67  0.67  0.67  0.67  0.    0.    0.67  0.    0.67  0.67]
     [ 0.5   0.5   0.5   0.67  0.    0.    0.67  0.    0.67  0.5 ]]
 类似资料:
  • 问题内容: 这是我目前的方式。有什么办法可以使用矩阵运算吗?X是数据点。 问题答案: 您是否要使用高斯核进行图像平滑?如果是这样,则scipy中有一个函数: 更新的答案 这应该可以工作- 尽管仍不能100%准确,但它会尝试考虑网格每个像元内的概率质量。我认为在每个像元的中点使用概率密度的准确性稍差,尤其是对于小内核。有关示例,请参见https://homepages.inf.ed.ac.uk/rb

  • 如何建立角度 在使用TypeScript编写Angular应用程序后,我们使用Angular CLI命令构建应用程序。 命令将应用程序编译到一个输出目录中,构建构件将存储在目录中。 这篇文章说Angular有两个编译器: > 视图编译器 模块编译器 > 当使用类(在main.ts中)进行引导时,Angular在中查找,找到它,实例化AppComponent的实例,并在标记中呈现它。 当用户在应用程

  • 问题内容: 我有一个包含单个模块和一些依赖项的项目。我想在一个包含编译模块的单独目录中创建一个jar。另外,我想在模块旁边提供依赖项。 无论我如何扭曲IntelliJ的“构建jar”过程,模块的输出都将显示为空(除了META-INF文件之外)。 问题答案: 这是使用IntelliJ 10构建jar的方法http://blogs.jetbrains.com/idea/2010/08/quickly-

  • 当接收到消息时,它将运行,并将接收到的每个项发布到。 我怎么能那么做? 以防万一它可能会添加更多选项,请注意,另一个代码块是的Websocket处理程序。

  • 问题内容: 我有以下代码,该代码分析YAML文件,并且需要匹配一个结构的值并更新该结构的属性。 例如,这是yaml文件(为简单起见翻译为bin)和正确解析的内容 最后,我需要做的是将内部yaml文件更改为上面的结构 。更改是 当我需要 修改 的值时,这里是从to 和to 问题在于第二个循环,我应该使用它来迭代和匹配的值,我不确定如何以有效的方式将它们组合在一起。 问题答案: Golang常见问题解

  • 我有一个相当复杂的Jenkins工作,它构建,单元测试和打包Web应用程序。根据情况,一旦这项工作完成,我想做不同的事情。我还没有找到一种可重用/可维护的方法来做到这一点。真的是这样还是我错过了什么? 完成复杂的工作后,我希望拥有的选项: > 什么都不做 启动我的低风险变更构建管道: < li >将我的WAR文件复制到我的工件库 < li >部署到生产环境中 启动我的高风险变更构建管道: 将我的W