问题
n*n的稀疏矩阵,平均每行每列都有m个非0的数,n>>m。如果A和B都是上述类型矩阵,那么C=A@B ,C平均每行有多少个非0的数据?
思路
- A的第i行平均有m个非零元素,对应列位置k1, k2, …, km。
- 对于每个k,B的第k行平均有m个非零元素,分布在n列中,因此每个位置BkjB_{kj}Bkj非零的概率为mn\frac{m}{n}nm。 对于每个j,CijC_{ij}Cij非零的概率为1 - (1−mn)m(1 - \frac{m}{n})^m(1−nm)m,即在m个k中存在至少一个k使得AikA_{ik}Aik和BkjB_{kj}Bkj都不为零的概率。
- 1−(1−mn)m1 - (1 - \frac{m}{n})^m1−(1−nm)m用二项公式近似展开是m2n\frac{m^2}{n}nm2,CijC_{ij}Cij非零的概率为m2n\frac{m^2}{n}nm2,那么整体一行非零个数的期望就是m2m^2m2
易混淆点
- A的第i行平均有m个非零元素,对应列位置k1, k2, …, km,那么第i行中每一个位置非零的概率就是m/n,那么CijC_{ij}Cij和中的每一项非零的概率就是(mn)2(\frac{m}{n})^2(nm)2,然后再把和给加起来算概率就有点晕了。。。这么思考会忽略A的第i行平均有m个非零元素,这m个非零元素的排列就有A(n,m)中可能性,假设这些可能性之间是等概率的,那就整体相当于A(n,m)∗1A(n,m)∗pA(n,m)*\frac{1}{A(n,m)}*pA(n,m)∗A(n,m)1∗p,即固定A的第i行平均有m个非零元素分布的前提下再去讨论B的非零情况,其中p就是B的非零概率和A的某一种分布对上的情况。所以首先要放弃Cij=∑kAikBkjC_{ij}=\sum_k A_{ik}B_{kj}Cij=∑kAikBkj中每一个AikA_{ik}Aik概率的分析,而且把A的第i行整体固定成一个分布
代码验证
import torch
n = 1000
m = 3
def generate(n,m):
res = torch.empty(0,n)
for _ in range(n):
row = torch.concat([torch.ones(m), torch.zeros(n-m)])
indices = torch.randperm(row.size(0))
row = row[indices].unsqueeze(0)
res = torch.concat([res, row], dim=0)
return res
a = generate(n, m)
b = generate(n, m)
c = a@b
for i in range(n):
print(len([item for item in c[i,:].tolist() if item > 0]))
'''
输出:
9
9
9
8
9
...
9
9
'''