[英]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的線性回歸示例。 我們正在尋找紅線的方程。
我的方法是找到一條適合您的數據的直線(使用線性回歸),並將其變化率用作數據的一種近似平均變化率。 (另請注意,不是直線的函數沒有恆定的變化率。也就是說,每個點的變化率都是不同的)。
現在病毒的傳播並不完全遵循一條直線——它是指數級的。 幸運的是,在對數刻度上繪制指數 function 會產生一條直線。 所以第一步是將數據從 (x, y) 轉換為 (x, log y)。
這里是來自 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.