[英]Generate random binary matrix constrained to no null row
我想生成一個隨機二進制矩陣,所以我使用W=np.random.binomial(1, p, (n,n))
。 它工作正常,但我想要一個約束,即沒有一行只是 0。
我創建以下 function:
def random_matrix(p,n):
m=0
while m==0:
W = np.random.binomial(1, p, (n,n))
m=min(W.sum(axis=1))
return W
它也可以正常工作,但在我看來效率太低了。 有沒有更快的方法來創建這個約束?
當矩陣很大時,僅因為少數行充滿零而重新生成整個矩陣是低效的。 僅重新生成目標行在統計上應該是安全的。 這是一個例子:
def random_matrix(p,n):
W = np.random.binomial(1, p, (n,n))
while True:
null_rows = np.where(W.sum(axis=1) == 0)[0]
# If there is no null row, then m>0 so we stop the replacement
if null_rows.size == 0:
break
# Replace only the null rows
W[null_rows] = np.random.binomial(1, p, (null_rows.shape[0],n))
return W
當p
接近 0 時,還有一種更有效的方法(當p
接近 1 時,上面的 function 已經很快了)。 實際上,具有 0-1 值的二項式隨機變量是伯努利隨機變量。 重復多次的概率為 p 的伯努利隨機值的總和是二項式隨機值,因此,您可以使用S = np.random.binomial(n, p, (n,n))
生成所有行的總和,然后應用上述方法刪除 null 個值,然后通過為第 i 行生成S[i]
個值來構建最終矩陣,並使用np.shuffle
隨機化每行中 0-1 值的順序。 這種方法比其他所有方法更有效地解決沖突。 事實上,它不需要生成整行來檢查它是否全是零。 解決沖突快n
倍!
如果這還不夠,您可以使用uint8
數據類型生成W
。 事實上,memory 很慢,所以生成較小的矩陣通常更快,更不用說它占用更少的 RAM。
如果這還不夠,您可以使用 Numba JIT 編譯器和基本循環為每個項目生成S
個項目。 這應該更快,因為除了最后一個之外沒有要創建的臨時數組。 對於大型矩陣,該算法甚至可以並行化(每一行都可以獨立生成)。 最后一個解決方案應該接近最佳。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.