回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我建立了一个函数,通过一些度量找到一些对齐。你知道吗</p>
<p>它将获得一个矩阵,其中包含已计算的相似度值:
<code>weighted_res</code>可以是:</p>
<pre><code>[[0.2, 0.5, 0.3],
[0.1, 0.2, 0.4],
[0.8, 0.2, 0.4],
[0.1, 0.2, 0.7],
[0.1, 0.2, 0.4],
</code></pre>
<p>我的函数将exs1和exs2的索引的所有组合的值之和最大化,但索引不能取两次。结果是这些最优指标。(0,1),(2,0),(3,2)的和相应地0.5+0.8+0.7产生最大得分。你知道吗</p>
<p>在许多情况下,仅为每一列/每一行查找最大值是不够的。让矩阵为:</p>
<pre><code>[[0.1, 0.0, 0.1]
[0.5, 0.6, 0.4],
[0.5, 0.8, 0.3],
[0.0, 0.0, 0.2]]
</code></pre>
<p>这里,它选择(1,1),(2,1),(3,2),因为0.5+0.8+0.2是最大可达分数。你知道吗</p>
<p>我的代码如下,我担心,这是最大限度地无效。我会很高兴得到一些提示,找到一个更有效的算法,而不是计算所有的可能性,总结和最大化。代码如下:</p>
<pre class="lang-py prettyprint-override"><code>def one_to_one(weighted_res, exs1, exs2, mask):
inner_cube_len = min(len(list(exs1)), len(list(exs2)))
turned = False
if (len(exs1) < len(exs2)):
exs1, exs2 = exs2, exs1
weighted_res = weighted_res.T
mask = mask.T
turned = True
x_to_choose = np.array(list(itertools.permutations(range(len(exs1)), inner_cube_len)))
y_to_choose = np.array(list(range (len(exs2))))
weighted_res_overall = \
weighted_res[x_to_choose,y_to_choose].sum(axis=1)
best_overall_row = np.argmax(weighted_res_overall)
best_x_values = np.array (x_to_choose[best_overall_row] )
valid_mask = mask[best_x_values,y_to_choose]
best_res1 = best_x_values[valid_mask]
best_res2 = y_to_choose[valid_mask]
if not valid_mask.any():
return [],[]
if turned:
left_value = best_res2.tolist()
right_values = [[x] for x in best_res1.tolist()]
exs1, exs2 = exs2, exs1
weighted_res = weighted_res.T
mask = mask.T
else:
right_values = [[x] for x in best_res2.tolist()]
left_value = best_res1.tolist()
return left_value, right_values
</code></pre>
<p>对于长度为8和6的输入值,<code>weighted_res_overall</code>的大小为20160,并且增长非常快。你知道吗</p>