间隔中数字之间的接近程度

时间:2012-06-14 23:28:16

标签: php math statistics

我在x = 1和y = 9之间有一组(浮点)数字:

$numbers = array(1, 2, 3, 4, 5, 6, 7, 8, 9);

如何在给定的时间间隔内计算A和B之间的接近度量?


我尝试过什么

如果上述集合的幅度(max - min)为9 - 1 = 8,我可以使用公式(n - min) / (max - min)计算任意数字的相对值,为所有值计算得出:

  • (1 - 1) / (9 - 1) = 0
  • (2 - 1) / (9 - 1) = 0.125
  • (3 - 1) / (9 - 1) = 0.25
  • (4 - 1) / (9 - 1) = 0.375
  • (5 - 1) / (9 - 1) = 0.5
  • (6 - 1) / (9 - 1) = 0.625
  • (7 - 1) / (9 - 1) = 0.75
  • (8 - 1) / (9 - 1) = 0.875
  • (9 - 1) / (9 - 1) = 1

将最小相对值(A和B之间)除以最大相对值(也在A和B之间),似乎产生了我正在寻找的那种度量。以下是一些例子:

var_dump(min(0.875, 0.25) / max(0.875, 0.25));   // 0.286 between 8 and 3
var_dump(min(0.875, 0.375) / max(0.875, 0.375)); // 0.429 between 8 and 4
var_dump(min(0.875, 0.75) / max(0.875, 0.75));   // 0.857 between 8 and 7
var_dump(min(0.875, 0.875) / max(0.875, 0.875)); // 1 between 8 and 8
var_dump(min(0.25, 0.25) / max(0.25, 0.25));     // 1 between 3 and 3

问题

每当该组的最小值发挥作用时,结果将始终为0

var_dump(min(0.875, 0) / max(0.875, 0));         // 0 between 8 and 1
var_dump(min(0.125, 0) / max(0.125, 0));         // 0 between 2 and 1
var_dump(min(0, 0) / max(0, 0));                 // 0 between 1 and 1 (ERR!)

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:3)

我建议这样的事情:

<?php

function prox($a,$b)
{
    return(abs($a-$b) / abs(1-9));
}

printf("%f\n", prox(1,2)); // 0.125000 
printf("%f\n", prox(2,3)); // 0.125000
printf("%f\n", prox(1,1)); // 0.000000
printf("%f\n", prox(1,9)); // 1.000000

1和2之间的接近度与2和3相同。这似乎是有道理的。

您获得的最大接近度是您指定的数字是预定义范围的范围。

您获得的最小接近度是您指定的数字相等。

如果您希望相反的情况属实(我认为更好地反映 接近度 ,您可以这样做:

<?php

function prox($a,$b)
{
    return(1 - (abs($a-$b) / abs(1-9)));
}

printf("%f\n", prox(1,2));
printf("%f\n", prox(2,3));
printf("%f\n", prox(1,1));
printf("%f\n", prox(1,9));

哪个会输出:

0.875000
0.875000
1.000000
0.000000

现在,相同的数字会生成您指定的1,并且边界产生0,因为它们是最近邻值。像(1,2),(2,3),(3,4)等组合都产生相同的值,如(2,4),(3,5),(4,6)这样的组合,等等。