如何在javascript中找到多变量回归方程

时间:2012-11-13 21:07:39

标签: javascript math regression

我已经搜索了堆栈溢出,并且没有发现任何与我的相同的问题,因为没有一个真正有多个自变量。基本上我有一组数据点,我希望能够找到这些数据点的回归方程。到目前为止我的代码看起来像这样:(w,x,z是自变量,y是因变量)

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个点。

3 个答案:

答案 0 :(得分:1)

正如您所说的那样,问题在于转换时与线性回归问题等价。您在评论中表示您已修复指数k_1k_2k_3。转换将元组{w, x, z ,y}转换为元组{w^k_1, x^k_2, z^k_2, y} = {w', x', z' ,y}。对引导变量使用线性回归来获得系数。

例如,如果k_1 = 2k_2 = 3k_3 = 1,那么这是转换的一个示例:

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

这只是将polynomial regression问题转换为线性回归问题的一个特例。在您的情况下,您正在考虑的多项式形式特别简单。

使用您喜欢的任何JavaScript库来解决线性回归问题;有很多。

答案 1 :(得分:1)

我认为如果有四个方程且只有3个变量的情况(因为你已经确定了幂,插件并使其成为线性方程),线性方程式就完成了,并且不存在精确的答案将满足所有四个方程式。

您可以做的是最小化残留误差并获得最佳近似值。

假设你有w x和z的系数a b和c,

定义矩阵

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

并定义向量

v=[a;b;c], 

定义矢量

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

然后问题是

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 ^ 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/

答案 2 :(得分:0)

我建议使用最小二乘法来得到线性方程。 此外,您可以使用非线性最小二乘法 事先知道你想要适合的功能。

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

javascript中有几个线性LS的​​链接,你可以 可能会将这些维度调整为3维度(例如,快速Google搜索中的http://dracoblue.net/dev/linear-least-squares-in-javascript/159/)。对于非线性 如果它需要更多的工作。