Ответ 1
Логарифмические наименьшие квадраты
Так как мы можем преобразовать логарифмическую функцию в строку, взяв значения log
значений x
, мы можем выполнить линейные наименьшие квадраты подгонка кривой. Фактически, работа была выполнена для нас, и решение представлено в Math World.
Вкратце, нам присваиваются значения $X
и $Y
, которые относятся к распределению типа y = a + b * log(x)
. Метод наименьших квадратов даст несколько значений aFit
и bFit
, которые минимизируют расстояние от параметрической кривой до заданных данных.
Вот пример реализации в PHP:
Сначала я создам некоторые случайные данные с известным базовым распределением, заданным $a
и $b
// True parameter valaues
$a = 10;
$b = 5;
// Range of x values to generate
$x_min = 1;
$x_max = 10;
$nPoints = 50;
// Generate some random points on y = a * log(x) + b
$X = array();
$Y = array();
for($p = 0; $p < $nPoints; $p++){
$x = $p / $nPoints * ($x_max - $x_min) + $x_min;
$y = $a + $b * log($x);
$X[] = $x + rand(0, 200) / ($nPoints * $x_max);
$Y[] = $y + rand(0, 200) / ($nPoints * $x_max);
}
Теперь, как использовать уравнения, данные для оценки $a
и $b
.
// Now convert to log-scale for X
$logX = array_map('log', $X);
// Now estimate $a and $b using equations from Math World
$n = count($X);
$square = create_function('$x', 'return pow($x,2);');
$x_squared = array_sum(array_map($square, $logX));
$xy = array_sum(array_map(create_function('$x,$y', 'return $x*$y;'), $logX, $Y));
$bFit = ($n * $xy - array_sum($Y) * array_sum($logX)) /
($n * $x_squared - pow(array_sum($logX), 2));
$aFit = (array_sum($Y) - $bFit * array_sum($logX)) / $n;
Затем вы можете создавать точки для вашего Javascript так же плотно, как вам нравится:
$Yfit = array();
foreach($X as $x) {
$Yfit[] = $aFit + $bFit * log($x);
}
В этом случае оценки кода bFit = 5.17
и aFit = 9.7
, что довольно близко только для точек данных 50
.
Для данных примера, приведенных в комментарии ниже, логарифмическая функция не подходит хорошо.
Решение наименьших квадратов y = -514.734835478 + 2180.51562281 * log(x)
, которое по существу является линией в этой области.