有没有一种有效的方法来生成对称随机矩阵?

luw*_*luw 2 python random numpy matrix

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

Jak*_*orn 5

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

\n\n
import numpy as np \n\nU = np.random.uniform(low=0, high=1.0, size=(1000, 1000))\nS = np.tril(U) + np.tril(U, -1).T\n\nprint(np.histogram(S.flatten()))\nprint(np.histogram(S[0,:]))\nprint(np.histogram(S[:,0]))\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

速度方面我得到

\n\n
%timeit U = np.random.uniform(low=0, high=1.0, size=(1000, 1000))\n10.6 ms \xc2\xb1 46.5 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n\n%timeit S = np.tril(U) + np.tril(U, -1).T\n5.76 ms \xc2\xb1 75.2 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如其他人所指出的,你也可以这样做

\n\n
S = (U + U.T) / 2\n
Run Code Online (Sandbox Code Playgroud)\n\n

获得对称性,但这将为您提供非对角线中的三角形分布随机数,因为您正在对两个均匀随机变量求和。

\n