получить уравнение кривой в javascript с учетом набора координат x и y - PullRequest
0 голосов
/ 04 апреля 2020

Я создал этот график, который просто показывает количество смертей по сравнению со днями после первой смерти.

Мне кажется интересным было бы показать скорость изменения для каждого страна, но я борюсь за то, как сделать это с данными.

Ниже приведен пример данных одной страны:

{
  "gb": {
    "data": [
      // last 4 records
      {
        "x": 26,
        "date": "31/03/2020",
        "y": 1793,
        "country": "GBR",
        "delta": 382
      },
      {
        "x": 27,
        "date": "01/04/2020",
        "y": 2357,
        "country": "GBR",
        "delta": 564
      },
      {
        "x": 28,
        "date": "02/04/2020",
        "y": 2926,
        "country": "GBR",
        "delta": 569
      },
      {
        "x": 29,
        "date": "03/04/2020",
        "y": 3611,
        "country": "GBR",
        "delta": 685
      }
    ]
  }

Дельта - это просто отличие от предыдущего дня. .

Я помню из математики, что скорость изменения была dy/dx.

Моим первым шагом было бы получить заданное уравнение кривой.

Я знаю как сделать остальное, но как я могу получить уравнение линии, заданной набором координат javascript?

1 Ответ

1 голос
/ 04 апреля 2020

Реальные данные беспорядочные. Было бы трудно найти функцию, которая бы идеально соответствовала вашим данным (и если бы вы создали новые точки данных, это, конечно, не соответствовало бы вашей функции). Вы можете аппроксимировать свои данные тем, что называется регрессией. Самый простой алгоритм регрессии пытается найти прямую линию, которая наилучшим образом соответствует вашим данным (линейная регрессия).

An example of linear regression from https://en.wikipedia.org/wiki/Linear_regression

Пример линейной регрессии из https://en.wikipedia.org/wiki/Linear_regression. Мы ищем уравнение красной линии.

Мой подход заключается в том, чтобы найти прямую линию, которая соответствует вашим данным (с использованием линейной регрессии), и использовать ее скорость изменения как своего рода приблизительную среднюю скорость изменить для ваших данных. (Также обратите внимание, что функции, которые не являются прямой линией, не имеют постоянной скорости изменения. То есть скорость изменения в каждой точке различна).

Теперь распространение вирусов точно не следует прямая линия - это экспоненциально. К счастью, построение экспоненциальной функции в логарифмическом масштабе c дает прямую линию. Поэтому первым шагом будет преобразование данных из (x, y) в (x, log y).

exponential growth of coronavirus from worldometers.info logarithmic scale from worldometers.info

Здесь те же данные из 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'] содержит скорость изменения линии - это будет приблизительная средняя скорость изменения ваших данных.

Это, по крайней мере, мой подход. Люди, более знакомые со статистикой и машинным обучением, безусловно, могут предложить что-то лучшее. Надеюсь, это поможет.

...