假设,我们有
points1 = np.array([[0,0], [1,1], [0,1],[1,0]])
points2 = np.array([[2,1], [0,0], [1,0],[0,1]])
现在他们按施工命令。然而,这只是一个MVE,在我的应用程序中,每个数组的元素都将被洗牌。 (这里我们可以使用np.random.shuffle()
)。
如果查看数据集,可以看到3个元素是相同的点,而只有其中一个元素发生了变化。换句话说:
[0,0]
中的points2
是[0,0]
中与points1
最近的点,而[0,0]
中的points1
是[0,0]
的最近点1}}在points2
。
{li} [0,1]
中的points2
是[0,1]
中与points1
最近的点,而[0,1]
中的points1
是[0,1]
的最近点1}}在points2
。
{li} [1,0]
中的points2
是[1,0]
中与points1
最近的点,而[1,0]
中的points1
是[1,0]
的最近点1}}在points2
。
[0,1]
,[1,0],
中的[2,1]
points2
是[1,1]
points1
和[1,1]
points1
中最近的点1}}是[2,1]
points2
的最近点
注意我是如何指定两种方式的!实际上,第一个列表中的一个点可能最接近第二个列表中的一个点,但反之可能不正确! (即第二个列表中可能有一个点实际上与第一个列表中的同一个点最接近)。
另外,请注意,在最后一个项目符号点,我们有3个点最接近[1,1]
。但是,在多个点最接近给定点的情况下,我想要消除已经找到不同最近点的那些点。例如,在最后一个要点中,我会[2,1]
points2
作为[1,1]
的最近点,因为[0,1]
中的points2
认为[0,1]
在points1
中,[1,0]
中points2
[1,0]
中points1
认为points1
中的points2
最近,因此它们已经“已发货”或“忙碌”。
我的问题
现在给出两个相同尺寸的数组(如上所述),即它们包含相同数量的点,我希望能够找到匹配(或者如果没有唯一的匹配则匹配),这样: / p>
points2
中的每个点都与points1
中的一个点匹配。这样points1
中的每个点都与points2
中的一个点匹配。我该怎么做?
我的尝试
首先,我尝试编写一个循环遍历sklearn.metrics.pairwise_distances_argmin_min(Y,X)
中的点的函数,并为每个函数计算 <label for="">Select Ticker: </label>
<select class="form-control" style="display: inline" id='selected'>
{% for p in tickers %}
<option value="{{ p.ticker_name }}">
{{ p.ticker_name }}
</option>
{% endfor %}
</select>
<label for="">Select Ratio: </label>
<select class="form-control" style="display: inline" id="fin_ratio">
{% for f in fin_ratio %}
<option value="">
{{ f.ratio_code }}
</option>
{% endfor %}
</select>
<label for="">Select Item: </label>
<select class="form-control" style="display: inline" id="item_code">
{% for i in items %}
<option value="">
{{ i.item_code }}
</option>
{% endfor %}
</select>
<div class="col-md-12" style="">
<table class="table table-responsive" style="width: 100%" id="myTable">
<thead>
</thead>
<tbody>
</tbody>
</table>
</div>
中每个点的距离。在此之后,我会浏览每个距离列表,订购它们并找到最小值。因此,我会将每个点与具有最小距离的点匹配。然而,如果a最接近于a,则并不意味着b最接近a,因此您可以最终得到匹配,然后将许多点匹配到一个点,依此类推。
$(document).on('change', '#selected', function () {
var ticker = $( "#selected" ).val();
var ratio = $( "#fin_ratio" ).val();
alert(ratio);
var item = $("#item_code").val();
var tr = (
'<tr>' +
'<td>'+ ticker +'</td>'+
'<td>'+ ratio+'</td>'+
'<td>' + item + '</td>' +
'</tr>'
);
,因为您可以阅读here,但它似乎正在做一些与我想要的略有不同的事情,因为再次将每个点与一个且只有一个匹配。 (或者更好的是,在它的输出中,实际上我认为它只是根据哪个点被声明为最接近的一个来选择它)你有什么建议吗?
基本上给出了两个点(相同大小)的列表我希望按距离匹配点(任何距离指标都可以,我猜,欧几里德和曼哈顿可能是最好的)。如果可能在找到此匹配后,我希望能够输出“相似性得分”。有什么想法吗?
答案 0 :(得分:1)
计算list1和list2中所有元素之间的所有距离。订购这些距离。 (实际上这些对象包含距离和对两个端点的引用)获取最小距离并配对此距离的端点。 然后得到下一个最小距离,其中没有任何端点配对。继续,直到所有点都配对。
不幸的是,该算法具有O(n 2 )复杂度。只要您必须将列表与只有几百(或几千)个元素进行比较,它就能工作。在它之上它可能非常慢......