2012-11-13 54 views
7

我已經搜索堆棧溢出,並沒有發現任何與我的相同的問題,因爲沒有一個真正具有多個獨立變量。基本上我有一個數據點陣列,我希望能夠找到這些數據點的迴歸方程。我的代碼到目前爲止看起來像這樣:(W,X,Z是獨立變量,y是因變量)如何在javascript中找到多變量回歸方程

var dataPoints = [{ 
"w" : 1, "x" : 2, "z" : 1, "y" : 7 
}, { 
"w" : 2, "x" : 1, "z" : 4, "y" : 5 
}, { 
"w" : 1, "x" : 5, "z" : 3, "y" : 2 
}, { 
"w" : 4, "x" : 3, "z" : 5, "y" : 15 
}]; 

我想,將返回一個式對象這樣的功能:

var regressionEquation = [{ 
"var" : "w", "power" : 1, "coeff" : "1.5" 
}, { 
"var" : "x", "power" : 1, "coeff" : "2" 
}, { 
"var" : "z", "power" : 1, "coeff" : "1" 
}]; 

有沒有辦法像這樣迴歸方程,而不使用循環來插入和插入值?有沒有辦法提出超過1的冪的迴歸方程?提前致謝。

編輯

很多人都認爲解決由權力堵漏取得方程的系統。我遇到的問題是當有足夠多的數據點來解決方程組時。在這個問題的例子中,我有3個變量來解決人們建議的方程組,我需要3個數據點,但是我有4個數據點。這導致了一個問題,因爲有多個解決方案。有4種可能的解決方案,因爲有4種方法將4個方程組合成3個不同的組。這將給我4個答案,可能沒有一個答案適合所有4個點。

+0

您是否在想像多項式插值之類的東西? (https://en.wikipedia.org/wiki/Polynomial_interpolation)我之前通過Vandermonde矩陣的操作寫了一些j。 – sgcharlie

+0

不,我想找到一個迴歸方程,然後外推 –

+0

所以你有函數w = ax^k1 +^k2 + cz^k3在那裏你想找到適合你的a,b,c,k1,k2和k3數據? –

回答

1

問題就像你所說的那樣,在轉換過程中,它與線性迴歸問題是等價的。您在評論中說,您的固定指數k_1,k_2k_3。該變換將元組{w, x, z ,y}帶到元組{w^k_1, x^k_2, z^k_2, y} = {w', x', z' ,y}。對引發變量使用線性迴歸來獲得係數。

例如,如果k_1 = 2k_2 = 3,並k_3 = 1,那麼這裏的變換的一個例子:

{"w" : 4, "x" : 3, "z" : 5, "y" : 15} 
==> {"w*" : 16, "x*" : 27, "z*" : 5, "y" : 15} 

這只是你如何轉換polynomial regression問題轉化爲線性迴歸一個特例。在你的情況下,你正在考慮的多項式格式特別簡單。

使用任何您喜歡的JavaScript庫來解決線性迴歸問題;有一些他們。

+0

找到二次迴歸或立方數請查看編輯我的問題與您的答案 –

1

我想如果是這樣的情況,有四個方程式和只有3個變量(因爲你已經確定了權力,插件,並使其成爲線性方程),線性方程是完整的,並不存在確切的答案,將滿足所有四個方程。

你可以做的是儘量減少殘留誤差並得到最佳的近似值。

假設有用於WX和z係數AB和c,

定義矩陣

M=[w1,x1,z1;w2,x2,z2;w3,x3,z3;w4,x4,z4]. 

並定義矢量

v=[a;b;c], 

限定矢量

r=[y1;y2;y3;y4]. 

然後p roblem是

M*v=r solve v. 

1.如果秩(M)>可變數目,必須最小化殘差

||M*v-r||_2. 

由於這是凸形的,取它的衍生物,並使其爲零:

M^T*M*v-M^T*r=0 => v=(M^T*M)\M^T*r. 

(M^T * M)\ M 1 T是M的MP-逆,如果秩(M)>變量號碼,然後(M^T * M)是可逆。

2.如果排名(M)< =變量數,那麼您可以得到無窮多個方程的精確解。

M*v=r. 

令M的奇異值分解:

M=U*S*V^T, 

然後

v=V*S^-1*U^T*r 

是解決方案之一。

V * S^-1 * U^T是M

的僞逆如果使用線性代數庫,它是很容易得到封閉形式的解決方案,而迭代。 http://sylvester.jcoglan.com/

+0

如果第一個案例http://sylvester.jcoglan.com/api/matrix.html#inverse已經可以解決。但如果第二種情況,我沒有看到任何可以返回僞逆的JavaScript庫。也許這個庫http://www.numericjs.com/可以提供幫助,因爲它可以計算矩陣的svd,並且可以使用US和V獲得僞逆。 –

+0

我並不真正理解解釋中使用的所有數學我所理解的是,在第一種情況下(這是我唯一關心的情況),爲了提出解決方案,我需要使用您提供的庫來查找M的逆矩陣,然後使用* r那個圖書館。我對麼? –

+0

我試過這個,它導致了一個錯誤,因爲M不是不可逆的,因爲它不是一個正方形 –

0

我建議使用最小二乘法來獲得線性方程。 此外,如果您事先知道要合適的函數,則可以使用非線性最小二乘法。

(http://en.wikipedia.org/wiki/Least_squares)

有線性LS在JavaScript,你可以 可能適應這些以3個維度(如http://dracoblue.net/dev/linear-least-squares-in-javascript/159/從快速谷歌搜索幾個環節)。對於非線性 的情況,它需要更多的工作。

+0

我瞭解你發佈的鏈接的方式不適用於多個變量,這是一個主要問題 –

+0

嗯,它可以適用於任何數量的變量或任何函數(請參閱http://en.wikipedia.org/ wiki/Least_squares#Solving_the_least_squares_problem) - 問題在於它主要用於y = ax + b,所以大部分代碼都會針對這種類型的函數。對於具有多個變量的線性情況,請參閱http://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)#The_general_problem。但通常,對於非線性問題,您可能需要自己計算一些數學。 – nvlass

+0

編輯/增加:但是,由於系統超出了預定的範圍,這可能是一條可行的路。 – nvlass