对数采样
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.
我正在处理介于 [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.