本文簡要介紹 python 語言中 scipy.optimize.quadratic_assignment
的用法。
用法:
scipy.optimize.quadratic_assignment(A, B, method='faq', options=None)#
二次分配問題和圖匹配問題的近似解。
二次分配解決以下形式的問題:
其中 是所有置換矩陣的集合, 和 是方陣。
圖匹配試圖最大化相同的目標函數。該算法可以被認為是找到兩個圖的節點的對齊方式,以最小化引起的邊不一致的數量,或者,在加權圖的情況下,是平方邊權重差的總和。
請注意,二次分配問題是NP-hard。這裏給出的結果是近似值,不能保證是最優的。
- A: 二維陣列,正方形
上麵目標函數中的方陣 。
- B: 二維陣列,正方形
上麵目標函數中的方陣 。
- method: {‘faq’, ‘2opt’} 中的字符串(默認值:‘faq’)
用於解決問題的算法。 ‘faq’(默認)和‘2opt’可用。
- options: 字典,可選
求解器選項字典。所有求解器都支持以下內容:
- 最大化 布爾(默認值:假)
如果
True
則最大化目標函數。- partial_match 二維整數數組,可選(默認值:無)
修複部分匹配。也稱為“seed” [2]。
每一行partial_match指定一對匹配的節點:node
partial_match[i, 0]
的A與節點匹配partial_match[i, 1]
的B.數組有形狀(m, 2)
,其中m
不大於節點數, .- rng {無,整數,
numpy.random.Generator
, numpy.random.RandomState
}, optional如果種子是無(或np.random), 這
numpy.random.RandomState
使用單例。如果種子是一個 int,一個新的RandomState
使用實例,播種種子.如果種子已經是一個Generator
或者RandomState
實例然後使用該實例。
對於 method-specific 選項,請參閱
show_options('quadratic_assignment')
。
- res: OptimizeResult
OptimizeResult
包含以下字段。- col_ind 一維數組
對應於 B 的節點中找到的最佳排列的列索引。
- 樂趣 浮點數
解決方案的客觀值。
- 尼特 int
優化期間執行的迭代次數。
參數 ::
返回 ::
注意:
默認方法‘faq’使用Fast Approximate QAP算法[1];它通常提供速度和準確性的最佳組合。方法 ‘2opt’ 的計算成本可能很高,但可能是一種有用的替代方法,或者它可以用於細化其他方法返回的解決方案。
參考:
[1]J.T. Vogelstein, J.M. Conroy, V. Lyzinski, L.J. Podrazik, S.G. Kratzer, E.T.哈雷,D.E.菲什金德,R.J. Vogelstein 和 C.E. Priebe,“用於圖形匹配的快速近似二次規劃”,PLOS one,vol。 10,沒有。第 4 頁e0121002, 2015, DOI:10.1371/journal.pone.0121002
[2]D. Fishkind、S. Adali、H. Patsolic、L. Meng、D. Singh、V. Lyzinski、C. Priebe、“Seeded graph matching”、模式識別。 87(2019):203-215,DOI:10.1016/j.patcog.2018.09.014
[3]“2-opt,” 維基百科。 https://en.wikipedia.org/wiki/2-opt
例子:
>>> import numpy as np >>> from scipy.optimize import quadratic_assignment >>> A = np.array([[0, 80, 150, 170], [80, 0, 130, 100], ... [150, 130, 0, 120], [170, 100, 120, 0]]) >>> B = np.array([[0, 5, 2, 7], [0, 0, 3, 8], ... [0, 0, 0, 3], [0, 0, 0, 0]]) >>> res = quadratic_assignment(A, B) >>> print(res) fun: 3260 col_ind: [0 3 2 1] nit: 9
查看返回的
col_ind
和fun
之間的關係,使用col_ind
形成找到的最佳置換矩陣,然後評估目標函數 。>>> perm = res['col_ind'] >>> P = np.eye(len(A), dtype=int)[perm] >>> fun = np.trace(A.T @ P @ B @ P.T) >>> print(fun) 3260
或者,為了避免顯式構造置換矩陣,直接置換距離矩陣的行和列。
>>> fun = np.trace(A.T @ B[perm][:, perm]) >>> print(fun) 3260
雖然一般不能保證,但
quadratic_assignment
恰好找到了全局最優解。>>> from itertools import permutations >>> perm_opt, fun_opt = None, np.inf >>> for perm in permutations([0, 1, 2, 3]): ... perm = np.array(perm) ... fun = np.trace(A.T @ B[perm][:, perm]) ... if fun < fun_opt: ... fun_opt, perm_opt = fun, perm >>> print(np.array_equal(perm_opt, res['col_ind'])) True
這是默認方法‘faq’ 找不到全局最優值的示例。
>>> A = np.array([[0, 5, 8, 6], [5, 0, 5, 1], ... [8, 5, 0, 2], [6, 1, 2, 0]]) >>> B = np.array([[0, 1, 8, 4], [1, 0, 5, 2], ... [8, 5, 0, 5], [4, 2, 5, 0]]) >>> res = quadratic_assignment(A, B) >>> print(res) fun: 178 col_ind: [1 0 3 2] nit: 13
如果準確性很重要,請考慮使用‘2opt’ 來優化解決方案。
>>> guess = np.array([np.arange(len(A)), res.col_ind]).T >>> res = quadratic_assignment(A, B, method="2opt", ... options = {'partial_guess': guess}) >>> print(res) fun: 176 col_ind: [1 2 3 0] nit: 17
相關用法
- Python SciPy optimize.rosen_der用法及代碼示例
- Python SciPy optimize.line_search用法及代碼示例
- Python SciPy optimize.rosen用法及代碼示例
- Python SciPy optimize.shgo用法及代碼示例
- Python SciPy optimize.minimize_scalar用法及代碼示例
- Python SciPy optimize.root用法及代碼示例
- Python SciPy optimize.fmin用法及代碼示例
- Python SciPy optimize.NonlinearConstraint用法及代碼示例
- Python SciPy optimize.KrylovJacobian用法及代碼示例
- Python SciPy optimize.toms748用法及代碼示例
- Python SciPy optimize.linprog_verbose_callback用法及代碼示例
- Python SciPy optimize.bracket用法及代碼示例
- Python SciPy optimize.milp用法及代碼示例
- Python SciPy optimize.diagbroyden用法及代碼示例
- Python SciPy optimize.bisect用法及代碼示例
- Python SciPy optimize.isotonic_regression用法及代碼示例
- Python SciPy optimize.golden用法及代碼示例
- Python SciPy optimize.brute用法及代碼示例
- Python SciPy optimize.newton用法及代碼示例
- Python SciPy optimize.fsolve用法及代碼示例
- Python SciPy optimize.Bounds用法及代碼示例
- Python SciPy optimize.fixed_point用法及代碼示例
- Python SciPy optimize.rosen_hess用法及代碼示例
- Python SciPy optimize.nnls用法及代碼示例
- Python SciPy optimize.broyden1用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.quadratic_assignment。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。