Algorithm 排序列表差异

Algorithm 排序列表差异,algorithm,language-agnostic,comparison,Algorithm,Language Agnostic,Comparison,我有以下问题 我有一组元素,可以通过某种算法进行排序。分类很好,但是很贵 还有一种算法B可以近似A的结果。它的速度要快得多,但排序将不完全相同 将A的输出作为“黄金标准”,我需要对在相同数据上使用B所产生的误差进行有意义的估计 有谁能给我建议一些可以解决我问题的资源吗? 提前谢谢 编辑: 根据要求:添加一个示例来说明该案例: 如果数据是字母表的前10个字母 A输出:A、b、c、d、e、f、g、h、i、j B输出:a、B、d、c、e、g、h、f、j、i 产生误差的可能措施是什么,这将允许我调整算法

我有以下问题

我有一组元素,可以通过某种算法进行排序。分类很好,但是很贵

还有一种算法B可以近似A的结果。它的速度要快得多,但排序将不完全相同

将A的输出作为“黄金标准”,我需要对在相同数据上使用B所产生的误差进行有意义的估计

有谁能给我建议一些可以解决我问题的资源吗? 提前谢谢

编辑:

根据要求:添加一个示例来说明该案例: 如果数据是字母表的前10个字母

A输出:A、b、c、d、e、f、g、h、i、j

B输出:a、B、d、c、e、g、h、f、j、i


产生误差的可能措施是什么,这将允许我调整算法B的内部参数,以使结果更接近A的输出?

您可以尝试一些涉及到的内容

您是否在寻找一些算法,根据以A和B作为输入排序的数组计算差异?或者,您是在寻找一种通用方法来确定使用B排序时数组的平均偏移量

如果是第一个,那么我建议做一些简单的事情,比如每个项目离它应该在的位置的距离(一个平均值比一个总和更好,以消除数组长度的问题)

如果是第二种,那么我想我需要更多地了解这些算法。

计算可能是许多可能的方法之一。下面是一些小python代码

def calc_error(out_A,out_B):
        # in    <= input
        # out_A <= output of algorithm A
        # out_B <= output of algorithm B

        rms_error = 0

        for i in range(len(out_A)):
            # Take square of differences and add
            rms_error +=  (out_A[i]-out_B[i])**2 

        return rms_error**0.5   # Take square root

>>> calc_error([1,2,3,4,5,6],[1,2,3,4,5,6])
0.0
>>> calc_error([1,2,3,4,5,6],[1,2,4,3,5,6]) # 4,3 swapped
1.414
>>> calc_error([1,2,3,4,5,6],[1,2,4,6,3,5]) # 3,4,5,6 randomized
2.44
def calc_错误(out_A,out_B):
#计算误差([1,2,3,4,5,6],[1,2,3,4,5,6])
0
>>>计算错误([1,2,3,4,5,6],[1,2,4,3,5,6])#4,3交换
1.414
>>>计算误差([1,2,3,4,5,6],[1,2,4,6,3,5])#3,4,5,6随机化
2.44
注: 求平方根是不必要的,但求平方是因为差值之和可能等于零。我认为calc_error函数给出了错误放置对的大致数量,但我手头没有任何编程工具,所以:(


看看

我将确定正确排序的最大子集

                               +-------------> I
                               |   +--------->
                               |   |
A -> B -> D ----->  E  -> G -> H --|--> J
     |             ^ |             |    ^
     |             | |             |    |
     +------> C ---+ +-----------> F ---+
在您的示例中,10分之7,因此算法得分为0.7。其他集合的长度为6。正确排序得分为1.0,反向排序为1/n

我假设这与反转的数量有关。x+y表示x-y(错误的顺序)

A+B+D-C+E+G+H-F+J-I

我们得到了几乎相同的结果——9个中的6个是正确的,评分为0.667。同样,正确排序得分为1.0,反向排序得分为0.0,这可能更容易计算。

Spearman's rho 我想你想要的是。使用两个排序的索引[rank]向量(完美
A
和近似
B
),计算秩相关性
rho
,范围从-1(完全不同)到1(完全相同):

其中d(i)是A和B之间每个字符的秩差


您可以将误差度量定义为距离
D:=(1-rho)/2

很难给出一个好的通用答案,因为您的正确解决方案取决于您的应用程序

我最喜欢的选项之一就是有序元素对的数量除以对的总数。这是一个很好的、简单的、易于计算的指标,它只告诉你有多少错误。但它没有试图量化这些错误的大小

double sortQuality = 1;
if (array.length > 1) {
   int inOrderPairCount = 0;
   for (int i = 1; i < array.length; i++) {
      if (array[i] >= array[i - 1]) ++inOrderPairCount;
   }
   sortQuality = (double) inOrderPairCount / (array.length - 1);
}
double-sortQuality=1;
如果(array.length>1){
int inOrderPairCount=0;
for(int i=1;i=array[i-1])++inOrderPairCount;
}
sortQuality=(双精度)inOrderPairCount/(array.length-1);
}

我认为汉明距离不是解决这个问题的好办法。它提供了一个元素对一个元素的比较,但两个元素之间的距离并不能说明排序质量。你是对的,我说的不仅仅是使用汉明距离,而是一些涉及到它的东西。如果他想做一个更昂贵的估计,他应该d使用距离计算。这还不够好,好像列表是z,a,b,c,d…整个列表被移动了1。我也在考虑RMSE。但最初的问题是“排序很昂贵”,所以我必须假设误差度量必须在没有标准排序的情况下进行计算。没有标准排序,就无法计算RMSE。不,OP可以访问金标准进行培训。他需要一个误差函数,这样他可以在松开近似排序器之前对其进行优化。是的,这是l很像我要找的东西,谢谢!