sklearn:测量不同变量集之间的相似性

时间:2017-08-21 10:13:33

标签: python algorithm scikit-learn cluster-analysis similarity

假设,我们有

 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个元素是相同的点,而只有其中一个元素发生了变化。换句话说:

    {li} [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中的一个点匹配。
  • 这些匹配是由它们最接近的事实给出的。想象一下,我只有一个点列表,我对每个点都应用了随机冲击。然后我想基本上“猜测”每个点的位置(它们应该是最接近的,但不要介意这一部分)。

我该怎么做?

我的尝试

  1. 首先,我尝试编写一个循环遍历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,因此您可以最终得到匹配,然后将许多点匹配到一个点,依此类推。

    1. 我尝试使用$(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,但它似乎正在做一些与我想要的略有不同的事情,因为再次将每个点与一个且只有一个匹配。 (或者更好的是,在它的输出中,实际上我认为它只是根据哪个点被声明为最接近的一个来选择它)
  2. 你有什么建议吗?

    基本上给出了两个点(相同大小)的列表我希望按距离匹配点(任何距离指标都可以,我猜,欧几里德和曼哈顿可能是最好的)。如果可能在找到此匹配后,我希望能够输出“相似性得分”。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

计算list1和list2中所有元素之间的所有距离。订购这些距离。 (实际上这些对象包含距离和对两个端点的引用)获取最小距离并配对此距离的端点。 然后得到下一个最小距离,其中没有任何端点配对。继续,直到所有点都配对。

不幸的是,该算法具有O(n 2 )复杂度。只要您必须将列表与只有几百(或几千)个元素进行比较,它就能工作。在它之上它可能非常慢......