Logarithmic sampling

2019-06-05 00:31发布

问题:

I am working with values between [minValue,maxValue] and I want to create a vector of values in between this range. But I want more values near to the minValue.

Example:

min = 1 max = 100

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

Something like that.

The goal is to be more accurate around the minimum.

Is that possible to implement that?

回答1:

You can start with by generating numbers from 0 to 1 with constant step (for example 0.1). Then power them with some exponent - the bigger exponent, the sharper curve. Then shift and multiply to get into your desired min-max range.

Pseudocode:

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)
}


回答2:

I had the same problem. I wanted well spaced points, but with much more point near the minimal value. I used a logarithmic transformation. Firstly the code:

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+')')]);
    }
}

The trick I used is to compress the data range (here 1 to 1600) with the logarithmic function; thereby, I was able to use a linear constant step width. Before feeding the x value into the math function, you have to back transform (math.exp) the values.

The function in math.eval is a rather complicated 4 paramater logistic fit, you might of course use something else.

In the image you see a plot of above mentioned function once with linear step width (orange) and once with my logarithmic step width (red). Visualisation of linear and logarithmic step width in data sampling.