我想生成大小为mx n和等级的矩阵r,元素来自指定的有限集,例如{0,1}或{1,2,3,4,5}.我希望它们在某个非常松散的意义上是"随机的",即我希望从算法获得各种可能的输出,其分布模糊地类似于具有指定等级的那组元素上的所有矩阵的分布.
事实上,我实际上并不关心它是否具有等级r,只是它接近于等级矩阵r(由Frobenius规范测量).
当设置在手是实数,我已经执行以下操作,这是完全足够我需要:生成矩阵U尺寸的mX r和V的nX r,从例如普通独立地采样元件(0,2).然后U V'是一个排名的mx n矩阵r(好吧<= r,但我认为这很有r可能).
如果我只是这样做然后舍入到二进制/ 1-5,则等级增加.
通过进行SVD并获取第一个r奇异值,也可以得到矩阵的低秩近似.但是,这些值不会出现在所需的集合中,并且对它们进行舍入将再次提高等级.
这个问题是相关的,但接受的答案不是"随机的",另一个答案表明SVD,这在这里不起作用.
我想过的一种可能性是,使r从集线性无关的行或列向量,然后通过这些的线性组合获得其矩阵的其余部分.但是,我不是很清楚如何获得"随机"线性独立向量,或者如何在此之后以准随机方式组合它们.
(并不是说这是超级相关的,但我是在numpy中这样做.)
更新:我在评论中尝试了EMS建议的方法,这个简单的实现:
real = np.dot(np.random.normal(0, 1, (10, 3)), np.random.normal(0, 1, (3, 10)))
bin = (real > .5).astype(int)
rank = np.linalg.matrix_rank(bin)
niter = 0
while …Run Code Online (Sandbox Code Playgroud)