簡體   English   中英

給定一組 x 和 y 坐標,得到 javascript 中的曲線方程

[英]get the equation of a curve in javascript given a set of x and y coordinates

我創建了這張圖表,它簡單地顯示了自第一次死亡以來的死亡人數與天數。

我認為有趣的是顯示每個國家/地區的變化率,但我正在努力解決如何使用數據來做到這一點。

一個國家的數據示例如下:

{
  "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

我的第一步是得到給定曲線的方程。

我知道如何做 rest,但是在給定 javascript 中的一組坐標的情況下,如何獲得直線方程?

現實世界的數據是混亂的。 很難找到完全適合您的數據的 function(如果您這樣做,新數據點肯定不適合您的功能)。 您可以使用所謂的回歸來近似您的數據。 最簡單的回歸算法試圖找到一條最適合您的數據的直線(線性回歸)。

來自 https://en.wikipedia.org/wiki/Linear_regression 的線性回歸示例

來自https://en.wikipedia.org/wiki/Linear_regression的線性回歸示例。 我們正在尋找紅線的方程。

我的方法是找到一條適合您的數據的直線(使用線性回歸),並將其變化率用作數據的一種近似平均變化率。 (另請注意,不是直線的函數沒有恆定的變化率。也就是說,每個點的變化率都是不同的)。

現在病毒的傳播並不完全遵循一條直線——它是指數級的。 幸運的是,在對數刻度上繪制指數 function 會產生一條直線。 所以第一步是將數據從 (x, y) 轉換為 (x, log y)。

來自worldometers.info的冠狀病毒呈指數增長 來自 worldometers.info 的對數刻度

這里是來自 worldometers.info 的相同數據在轉換為對數刻度后冠狀病毒的傳播。

現在我們的數據看起來或多或少像一條直線,我們可以使用線性回歸來找到最適合數據的直線方程。

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

function 采用 y 坐標數組(在我們的例子中是原始坐標的 Math.log)和 x 坐標數組,並返回 object lr。 lr['slope'] 包含線的變化率 - 這將是您數據的近似平均變化率。

這至少是我的方法。 更熟悉統計和機器學習的人當然可以提供更好的東西。 希望能幫助到你。

有一個d3-regression庫可以為常見類型的曲線執行此操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM