对数采样

时间:2015-09-02 09:06:56

标签: sampling logarithm

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

示例:

min = 1 max = 100

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

类似的东西。

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

可以实现吗?

2 个答案:

答案 0 :(得分:3)

您可以通过使用常量步长(例如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)
}

答案 1 :(得分:1)

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

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.