在前端開發中,JavaScript 是一門不可或缺的語言。它提供了各種各樣的功能來讓我們的網站變得更有吸引力和交互性。其中,擬合(fitting)作為一種常見的數據分析方法之一,也可以通過 JavaScript 實現。在本篇文章中,我們將介紹 JavaScript 擬合的一些基本概念和實現方式。
擬合可以幫助我們理解一組數據的分布規律。比如說,我們有一批股票價格數據,我們會很自然地想知道這批數據的趨勢是升還是降。我們可以通過擬合來確定這個趨勢,并做出相應的決策。下面我們舉一個簡單的例子來說明這個過程:
let data = [ { x: 1, y: 1.6 }, { x: 2, y: 2.5 }, { x: 3, y: 4.6 }, { x: 4, y: 7.8 }, { x: 5, y: 12.1 }, { x: 6, y: 16.5 } ]; // 采用二次函數擬合 let result = polyfit(data, 2); console.log(result.coefficients);在上面的代碼中,我們有一個數組 data,表示了一組數據點的 x 和 y 坐標。我們希望用一個二次函數來擬合這組數據,得到對應的擬合曲線。我們可以調用 polyfit 函數,它會返回一個對象 result,其中包含了擬合曲線的系數 coefficients。在這個例子中,coefficients 為 [0.1607142857142911, -0.5535714285714413, 2.078571428571449]。這個數組中的三個元素分別對應于二次函數的三個系數 a、b、c,即 y = ax^2 + bx + c。我們可以將這個擬合結果用于數據分析和決策制定。 在 JavaScript 中,有很多擬合算法可以選擇。一個比較常用的算法是最小二乘法(Least Squares),它的原理是通過最小化數據點與擬合曲線之間的距離來確定擬合曲線的系數。實現這個算法的函數如下:
function polyfit(data, degree) { let x = []; let y = []; for (let i = 0; i< data.length; i++) { let row = data[i]; x.push(row.x); y.push(row.y); } let lhs = []; let rhs = []; let len = x.length; let nm1 = len - 1; let sd = []; for (let j = 0; j< len; j++) { let row = []; let v = 1; for (let i = 0; i<= nm1; i++) { row.push(v); v *= x[j]; } lhs.push(row); sd[j] = y[j]; } let transpose = []; for (let i = 0; i<= nm1; i++) { let row = []; for (let j = 0; j< len; j++) { row.push(lhs[j][i]); } transpose.push(row); } let prod = []; for (let i = 0; i<= nm1; i++) { let row = []; for (let j = 0; j<= nm1; j++) { let sum = 0; for (let k = 0; k< len; k++) { sum += transpose[i][k] * lhs[k][j]; } row.push(sum); } prod.push(row); } gaussianElimination(prod, sd, nm1); let coefficients = []; for (let i = 0; i<= degree; i++) { coefficients.push(sd[i]); } return {coefficients: coefficients}; }在這個函數中,我們首先將數據點的 x 和 y 坐標分別存儲到 x 和 y 數組中。然后,我們根據數據點的數量和擬合函數的階數(即 degree)創建兩個矩陣 lhs 和 rhs,lhs 是一個 n x (degree+1) 的矩陣,rhs 是一個長度為 n 的向量;接著,我們依次計算出 lhs 中的每個元素以及 rhs 中的每個元素。最后,我們調用高斯消元法(Gaussian Elimination)求解 lhs 和 rhs 的系數,并將系數返回。 除了最小二乘法,JavaScript 還提供了其他的數據擬合算法,例如多項式、指數、對數、冪函數等。這些算法通常通過庫函數來實現。例如,我們可以使用 Math.js 庫來進行多項式擬合:
let datapoints = [ [0, 1], [1, 2], [2, 3], [3, 4], [4, 5] ]; // 采用多項式擬合 let polynomial = math.polyfit(datapoints, 2); console.log(polynomial);在上面的代碼中,我們首先定義了一個二維數組 datapoints,表示了一組數據點的 x 和 y 坐標。然后,我們調用 math.polyfit 函數來進行二次多項式擬合。該函數的第一個參數是數據點數組,第二個參數是擬合的階數。在這個例子中,它會返回一個包含多項式各項系數的數組,例如 [0.0007142857142857143, 0.5999999999999992, 0.9999999999999998]。我們可以將這個數組用于數據分析和決策制定。 總之,JavaScript 擬合是一項非常有用的數據分析技術,它可以幫助我們理解和預測數據的分布規律,并做出相應的決策。通過本文的介紹,我們可以學習到一些基本的擬合算法和實現方式,它們可以幫助我們完成復雜的數據分析任務。