當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy csgraph.min_weight_full_bipartite_matching用法及代碼示例


本文簡要介紹 python 語言中scipy.sparse.csgraph.min_weight_full_bipartite_matching的用法。

用法:

scipy.sparse.csgraph.min_weight_full_bipartite_matching(biadjacency_matrix, maximize=False)#

返回二部圖的最小權重完全匹配。

參數

biadjacency_matrix 稀疏矩陣

二分圖的雙鄰接矩陣:CSR、CSC 或 COO 格式的稀疏矩陣,其行表示圖的一個分區,其列表示另一個分區。兩個頂點之間的邊由矩陣中的相應條目指示,邊的權重由該條目的值給出。這不應與圖的完整鄰接矩陣混淆,因為我們隻需要定義二分結構的子矩陣。

maximize 布爾(默認值:假)

如果為真,則計算最大權重匹配。

返回

row_ind, col_ind 數組

提供最佳匹配的行索引數組和對應的列索引之一。匹配的總權重可以計算為 graph[row_ind, col_ind].sum() 。行索引將被排序;在方陣的情況下,它們將等於 numpy.arange(graph.shape[0])

注意

為權重非零的加權二部圖 。這個函數然後產生一個匹配的 與基數

最小化匹配中包含的邊的權重總和 ,如果不存在這樣的匹配,則會引發錯誤。

什麽時候\(\lvert U \rvert = \lvert V \rvert\) ,這通常被稱為完美匹配;在這裏,因為我們允許\(\lvert U \rvert\) \(\lvert V \rvert\) 不同的是,我們遵循卡普[1]並將匹配稱為滿的.

此函數實現 LAPJVsp 算法 [2],簡稱“線性分配問題,Jonker-Volgenant,稀疏”。

它解決的問題等價於矩形線性分配問題。 [3] 因此,該函數可用於解決與 scipy.optimize.linear_sum_assignment 相同的問題。當輸入密集時,或者對於某些特定類型的輸入,例如 條目是歐幾裏得空間中兩點之間的距離的輸入,該函數可能會表現得更好。

如果不存在完全匹配,則此函數引發 ValueError 。要確定圖中最大匹配的大小,請參閱 maximum_bipartite_matching

我們要求權重非零隻是為了避免在不同稀疏表示之間轉換時處理顯式零的問題。零權重可以通過向所有權重添加一個常數來處理,以便生成的矩陣不包含零。

如果可能存在多個有效解決方案,則輸出可能會因 SciPy 和 Python 版本而異。

參考

[1]

Richard Manning Karp:在預期時間 O(mn log n) 內解決 m x n 分配問題的算法。網絡,10(2):143-152,1980。

[2]

Roy Jonker 和 Anton Volgenant:密集和稀疏線性分配問題的最短增廣路徑算法。計算 38:325-340, 1987。

例子

>>> from scipy.sparse import csr_matrix
>>> from scipy.sparse.csgraph import min_weight_full_bipartite_matching

讓我們首先考慮一個所有權重都相等的示例:

>>> biadjacency_matrix = csr_matrix([[1, 1, 1], [1, 0, 0], [0, 1, 0]])

在這裏,我們得到的隻是圖的完美匹配:

>>> print(min_weight_full_bipartite_matching(biadjacency_matrix)[1])
[2 0 1]

即第一、二、三行分別與第三、一、二列相匹配。請注意,在此示例中,輸入矩陣中的 0 不對應權重為 0 的邊,而是對應於未與邊配對的一對頂點。

另請注意,在這種情況下,輸出與應用 maximum_bipartite_matching 的結果相匹配:

>>> from scipy.sparse.csgraph import maximum_bipartite_matching
>>> biadjacency = csr_matrix([[1, 1, 1], [1, 0, 0], [0, 1, 0]])
>>> print(maximum_bipartite_matching(biadjacency, perm_type='column'))
[2 0 1]

當多個邊可用時,優先選擇權重最低的邊:

>>> biadjacency = csr_matrix([[3, 3, 6], [4, 3, 5], [10, 1, 8]])
>>> row_ind, col_ind = min_weight_full_bipartite_matching(biadjacency)
>>> print(col_ind)
[0 2 1]

在這種情況下,總重量是

>>> print(biadjacency[row_ind, col_ind].sum())
9

當矩陣不是方陣時,即當兩個分區具有不同的基數時,匹配與兩個分區中較小的一樣大:

>>> biadjacency = csr_matrix([[0, 1, 1], [0, 2, 3]])
>>> row_ind, col_ind = min_weight_full_bipartite_matching(biadjacency)
>>> print(row_ind, col_ind)
[0 1] [2 1]
>>> biadjacency = csr_matrix([[0, 1], [3, 1], [1, 4]])
>>> row_ind, col_ind = min_weight_full_bipartite_matching(biadjacency)
>>> print(row_ind, col_ind)
[0 2] [1 0]

當一個或兩個分區為空時,匹配也為空:

>>> biadjacency = csr_matrix((2, 0))
>>> row_ind, col_ind = min_weight_full_bipartite_matching(biadjacency)
>>> print(row_ind, col_ind)
[] []

一般來說,我們總是會達到與使用 scipy.optimize.linear_sum_assignment 相同的權重總和,但請注意,對於那個,缺失的邊由 float('inf') 的矩陣條目表示。讓我們生成一個具有 1 到 10 之間整數條目的隨機稀疏矩陣:

>>> import numpy as np
>>> from scipy.sparse import random
>>> from scipy.optimize import linear_sum_assignment
>>> sparse = random(10, 10, random_state=42, density=.5, format='coo') * 10
>>> sparse.data = np.ceil(sparse.data)
>>> dense = sparse.toarray()
>>> dense = np.full(sparse.shape, np.inf)
>>> dense[sparse.row, sparse.col] = sparse.data
>>> sparse = sparse.tocsr()
>>> row_ind, col_ind = linear_sum_assignment(dense)
>>> print(dense[row_ind, col_ind].sum())
28.0
>>> row_ind, col_ind = min_weight_full_bipartite_matching(sparse)
>>> print(sparse[row_ind, col_ind].sum())
28.0

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.sparse.csgraph.min_weight_full_bipartite_matching。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。