gpt4 book ai didi

python ,Scipy : Building triplets using large adjacency matrix

转载 作者:太空狗 更新时间:2023-10-29 18:06:19 25 4
gpt4 key购买 nike

我正在使用邻接矩阵来表示可以在视觉上解释为的 friend 网络

Mary     0        1      1      1

Joe 1 0 1 1

Bob 1 1 0 1

Susan 1 1 1 0

Mary Joe Bob Susan

使用这个矩阵,我想编译所有可能的友谊三角列表,条件是用户 1 是用户 2 的 friend ,用户 2 是用户 3 的 friend 。对于我的列表,用户 1 不需要是用户 3 的 friend 。

(joe, mary, bob)
(joe, mary, susan)
(bob, mary, susan)
(bob, joe, susan)

我有一些代码可以很好地处理小三角形,但我需要它来缩放非常大的稀疏矩阵。

from numpy import *
from scipy import *

def buildTriangles(G):
# G is a sparse adjacency matrix
start = time.time()
ctr = 0
G = G + G.T # I do this to make sure it is symmetric
triples = []
for i in arange(G.shape[0] - 1): # for each row but the last one
J,J = G[i,:].nonzero() # J: primary friends of user i
# I do J,J because I do not care about the row values
J = J[ J < i ] # only computer the lower triangle to avoid repetition
for j in J:
K, buff = G[:,j].nonzero() # K: secondary friends of user i
K = K[ K > i ] # only compute below i to avoid repetition
for k in K:
ctr = ctr + 1
triples.append( (i,j,k) )
print("total number of triples: %d" % ctr)
print("run time is %.2f" % (time.time() - start())
return triples

我能够在大约 21 分钟内在 csr_matrix 上运行代码。该矩阵为 1032570 x 1032570,包含 88910 个存储元素。一共生成了2178893个三元组。

我需要能够对具有 9428596 个存储元素的 1968654 x 1968654 稀疏矩阵执行类似操作。

我是 python 的新手(不到一个月的经验)并且在线性代数方面不是最好的,这就是为什么我的代码没有利用矩阵运算的原因。谁能提出任何改进建议,或者让我知道我的目标是否现实?

最佳答案

我认为您只能在行或列中找到三角形。例如:

Susan    1        1      1      0 
Mary Joe Bob Susan

这意味着 Mary、Joe、Bob 都是 Susan 的 friend ,因此,使用组合从 [Mary, Joe, Bob] 中选择两个人并将其与 Susan 组合将得到一个三角形。 itertools.combinations() 快速执行此操作。

代码如下:

import itertools
import numpy as np

G = np.array( # clear half of the matrix first
[[0,0,0,0],
[1,0,0,0],
[1,1,0,0],
[1,1,1,0]])
triples = []
for i in xrange(G.shape[0]):
row = G[i,:]
J = np.nonzero(row)[0].tolist() # combinations() with list is faster than NumPy array.
for t1,t2 in itertools.combinations(J, 2):
triples.append((i,t1,t2))
print triples

关于 python ,Scipy : Building triplets using large adjacency matrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6931985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com