【问题标题】:Is there an efficient way to generate a symmetric random matrix?有没有一种有效的方法来生成对称随机矩阵?
【发布时间】:2019-10-29 12:07:52
【问题描述】:

有没有一种有效的方法(使用 numpy)来生成一个对称随机矩阵,其条目均匀分布在 [0,1) 中?

【问题讨论】:

  • 创建对称矩阵的常用方法是将矩阵添加到其转置中。 (A+A.T)/2 应保持在 (0,1) 范围内。但我不能随便说它是否仍然是统一的(我主要担心对角线值)。
  • @hpaulj 相反,对角线是没有问题的,因为您添加了两次相同的随机数,即按两倍缩放。非对角线你得到两个不均匀的独立制服的总和。
  • @hpaulj,对角线以外的元素将是两个均匀变量的平均值,因此它们将具有三角形分布。

标签: python numpy matrix random


【解决方案1】:

这是一个使用scipy.spatial.distance.squareform的方法:

squareform 在对称矩阵的完整形式和“压缩”形式之间来回切换:

>>> full = squareform(np.arange(1,11))
>>> full
array([[ 0,  1,  2,  3,  4],
       [ 1,  0,  5,  6,  7],
       [ 2,  5,  0,  8,  9],
       [ 3,  6,  8,  0, 10],
       [ 4,  7,  9, 10,  0]])
>>> squareform(full)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

由于它在设计时考虑了距离矩阵,因此它使对角线为零,因此我们必须手动填充它。为此,我们使用einsum,它使用我们所做的方式返回对角线的可写视图,

>>> from scipy.spatial.distance import squareform
>>> 
>>> N = 5
>>> a = squareform(np.random.random(N*(N-1)//2))
>>> np.einsum('ii->i', a)[:] = np.random.random(N)
>>> a
array([[0.29946651, 0.3636706 , 0.00708741, 0.87536594, 0.62197293],
       [0.3636706 , 0.31774527, 0.05597852, 0.10800514, 0.99871399],
       [0.00708741, 0.05597852, 0.83912235, 0.86241008, 0.01806965],
       [0.87536594, 0.10800514, 0.86241008, 0.11039534, 0.64213608],
       [0.62197293, 0.99871399, 0.01806965, 0.64213608, 0.84755054]])

【讨论】:

  • 这种方法比我的答案更快,因为它不绘制尽可能多的随机数并在浮点运算上使用赋值。
【解决方案2】:

令 U 是一个均匀分布的随机数的方阵。然后,您可以将 U 的下三角部分与自身转置(仅包括对角线一次)相加,以获得与 U 具有相同分布的随机数的对称矩阵。

import numpy as np 

U = np.random.uniform(low=0, high=1.0, size=(1000, 1000))
S = np.tril(U) + np.tril(U, -1).T

print(np.histogram(S.flatten()))
print(np.histogram(S[0,:]))
print(np.histogram(S[:,0]))

np.random.uniform 的文档将矩阵作为一个整体以及任何行或列均匀分布在 [0,1) 中

速度方面我明白了

%timeit U = np.random.uniform(low=0, high=1.0, size=(1000, 1000))
10.6 ms ± 46.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit S = np.tril(U) + np.tril(U, -1).T
5.76 ms ± 75.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

正如其他人所说,你也可以这样做

S = (U + U.T) / 2

为了获得对称性,但这会给你在非对角线上的三角形分布随机数,因为你正在对两个均匀随机变量求和。

【讨论】:

  • "...但这会给您正态分布的随机数,因为您要添加两个随机变量。" 这将是一种非常便宜的生成正常样本的方法.. .
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2020-01-25
相关资源
最近更新 更多