2

我在 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!)

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

4

1 回答 1

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) 等组合一样,等等等等

于 2012-06-14T23:51:29.163 回答