Реальные данные беспорядочные. Было бы трудно найти функцию, которая бы идеально соответствовала вашим данным (и если бы вы создали новые точки данных, это, конечно, не соответствовало бы вашей функции). Вы можете аппроксимировать свои данные тем, что называется регрессией. Самый простой алгоритм регрессии пытается найти прямую линию, которая наилучшим образом соответствует вашим данным (линейная регрессия).
Пример линейной регрессии из https://en.wikipedia.org/wiki/Linear_regression. Мы ищем уравнение красной линии.
Мой подход заключается в том, чтобы найти прямую линию, которая соответствует вашим данным (с использованием линейной регрессии), и использовать ее скорость изменения как своего рода приблизительную среднюю скорость изменить для ваших данных. (Также обратите внимание, что функции, которые не являются прямой линией, не имеют постоянной скорости изменения. То есть скорость изменения в каждой точке различна).
Теперь распространение вирусов точно не следует прямая линия - это экспоненциально. К счастью, построение экспоненциальной функции в логарифмическом масштабе c дает прямую линию. Поэтому первым шагом будет преобразование данных из (x, y) в (x, log y).
Здесь те же данные из worldometer.info о распространении коронавируса после преобразования в логарифмическую шкалу c.
Теперь, когда наши данные более или менее похожи на прямую линию, мы можем использовать линейную регрессию чтобы найти уравнение прямой линии, которое наилучшим образом соответствует данным.
Простой подход в javascript можно найти здесь: Линейная регрессия в Javascript
function linearRegression(y,x) {
var lr = {};
var n = y.length;
var sum_x = 0;
var sum_y = 0;
var sum_xy = 0;
var sum_xx = 0;
var sum_yy = 0;
for (var i = 0; i < y.length; i++) {
sum_x += x[i];
sum_y += y[i];
sum_xy += (x[i]*y[i]);
sum_xx += (x[i]*x[i]);
sum_yy += (y[i]*y[i]);
}
lr['slope'] = (n * sum_xy - sum_x * sum_y) / (n*sum_xx - sum_x * sum_x);
lr['intercept'] = (sum_y - lr.slope * sum_x)/n;
lr['r2'] = Math.pow((n*sum_xy - sum_x*sum_y)/Math.sqrt((n*sum_xx-sum_x*sum_x)*(n*sum_yy-sum_y*sum_y)),2);
return lr;
}
Функция принимает массив координат y (в нашем случае Math.log ваших исходных координат) и массив координат x и возвращает объект lr. lr ['slope'] содержит скорость изменения линии - это будет приблизительная средняя скорость изменения ваших данных.
Это, по крайней мере, мой подход. Люди, более знакомые со статистикой и машинным обучением, безусловно, могут предложить что-то лучшее. Надеюсь, это поможет.