2 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
我將遵循您的要求,并提供一種非編程方法,但僅是我認(rèn)為的邏輯(半數(shù)學(xué))方法。
算法步驟:
讓我們將閾值定義為
T
用無(wú)關(guān)值填充較小的列表(例如無(wú)) - 只是為了確保尺寸一致
通過(guò)取一個(gè)列表中每個(gè)元素與另一個(gè)列表中元素的絕對(duì)值來(lái)創(chuàng)建相似度矩陣,我們將矩陣定義為 S。
澄清:S[i,j]指的是列表A中的第i個(gè)元素與列表B中的第j個(gè)元素之間的差異
創(chuàng)建二進(jìn)制矩陣 B,其中滿足閾值 Critirea 的每個(gè)元素為 1,否則為 0 (MATLAB-> B=S<L)
例如:
???????0?0?0 ???B?=???0?1?1 ???? ???????1?0?0
假設(shè) X 維度代表列表 A,Y 維度代表列表 B,則:
B[2]?===?A[2] B[2]?===?A[3] B[3]?===?A[1]?(===?means?that?two?elements?satisfy?the?criteria?of?similarity)
現(xiàn)在 - 問(wèn)題變得更加數(shù)學(xué)化,為了找到最佳匹配,您可以使用以下建議之一:
蠻力(我認(rèn)為不太優(yōu)雅的方法):
選擇為 1 的元素(在未標(biāo)記的行和列中)
將他的整個(gè)列和行標(biāo)記為已標(biāo)記
繼續(xù)選擇另外1個(gè),直到?jīng)]有合法位置為止,求和為
score
對(duì)所有選項(xiàng)迭代執(zhí)行此操作并選擇最高的選項(xiàng)
score
更優(yōu)雅的方法:
迭代所有列的排列(對(duì)于 B 矩陣)
如果 Trace 或?qū)蔷€等于 len(A) 則完成(找到所有元素的匹配)
選擇具有最高 TRACE(或相反對(duì)角線)的排列 最壞情況下的排列數(shù)量當(dāng)然是 N?。ㄆ渲蠳是B的維度)
正如文檔所述 - 該算法試圖找到所有可能的矩陣排列的最小跟蹤 - 因此只需將其-B
作為參數(shù)即可。
總體示例(最后一步采用更優(yōu)雅的方法):
A = [1,5,7]
B = [6,6,2]
T = 2
S =?
5 5 1?
1 1 3
1 1 5
B =?
0 0 1
1 1 0
1 1 0
permutations of columns:
1-?
0 0 1
1 1 0
1 1 0
Trace = 1
other-diagonal = 3
Done -- > no need for more permutations because len(other-diagonal) == 3
A[1] =1 === B[3] =2
A[2] =5 === B[2] =6
A[3] =7 === B[1] =6
請(qǐng)隨意詢問(wèn),或提供您可能有的任何見(jiàn)解

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
我剛剛發(fā)現(xiàn) scipy python 包中“匈牙利算法”(賦值問(wèn)題)有很好的實(shí)現(xiàn):
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linear_sum_assignment.html
示例(對(duì)于expected, detected,metric請(qǐng)參閱問(wèn)題的示例代碼):
from scipy.optimize import linear_sum_assignment
...
def match_events(expected, detected, metric, tolerance=5):
# some arbitrary large value used to prevent impossible matches
dont_match = 1000 * tolerance
def modified_metric(e, d):
dt = metric(e, d)
return dt if dt <= tolerance else dont_match
cost_matrix = [
[
modified_metric(exp, det)
for det in detected
]
for exp in expected
]
row_idx, col_idx = linear_sum_assignment(cost_matrix)
for e_idx, d_idx in zip(row_idx, col_idx):
dt = cost_matrix[e_idx][d_idx]
if dt <= time_tolerance:
yield (expected[e_idx], detected[d_idx], dt)
它不是很優(yōu)雅,因?yàn)槲冶仨氁阅撤N方式將匹配限制為tolerance,但匈牙利算法僅適用于所有可能組合的矩陣,因此我使用dont_matchvalue 來(lái)標(biāo)記這些情況。
添加回答
舉報(bào)