对数采样

Logarithmic sampling

我正在处理介于 [minValue,maxValue] 之间的值,我想创建一个介于该范围内的值向量。但我想要更多接近 minValue 的值。

示例:

分钟= 1 最大值 = 100

矢量 = [1,1.1,1.5,2,3,5,10,15,30,50,100];

类似的东西。

目标是在最小值附近更加准确。

可以实现吗?

您可以从以恒定步长(例如 0.1)生成从 0 到 1 的数字开始。然后用一些指数为它们供电——指数越大,曲线越尖锐。然后移动并相乘以进入您想要的最小-最大范围。

伪代码:

min = 1.0
max = 100.0
exponent = 2.0 // Sharpness
result = []

for(i = 0.0; i <= 1.0; i += 0.1) {
    result.push(pow(i, exponent) * (max - min) + min)
}

我遇到了同样的问题。我想要间隔良好的点,但在最小值附近有更多的点。我使用了对数变换。首先是代码:

function SampleData (min, max, points) {

    min = min || 1; // Minimum value
    max = max || 1600; // Maximum value
    points = points || 20; // data points between Min&Max

    var step = (Math.log(max)-Math.log(min))/(points-1);

    var data = [];

    var D= 100; // max asy
    var A= 0; // min asy
    var C= 50;  // inflectio
    var B= 1; // Hills slope

    for (i = Math.log(min); i <= Math.log(max); i=i+step) { 
        data.push ([Math.exp(i), math.eval (D+'+('+A+'-'+D+')/(1+('+math.exp(i)+'/'+C+')^'+B+')')]);
    }
}

我使用的技巧是用对数函数压缩数据范围(这里是1到1600);因此,我能够使用线性恒定步长。在将 x 值输入数学函数之前,您必须对值进行反向转换 (math.exp)。

math.eval中的函数是一个相当复杂的4参数逻辑拟合,你当然可以使用其他东西。

在图像中,您可以看到上述函数的绘图,一次是线性步长(橙色),一次是我的对数步长(红色)。 Visualisation of linear and logarithmic step width in data sampling.