簡體   English   中英

生成限制為無 null 行的隨機二進制矩陣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM