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

如何在javascript中找到多元回归方程,javascript,math,regression,Javascript,Math,Regression,我搜索了堆栈溢出,没有发现任何与我的问题相同的问题,因为没有一个真正有一个以上的自变量。基本上,我有一个数据点数组,我希望能够找到这些数据点的回归方程。到目前为止,我的代码是这样的:(w,x,z是自变量,y是因变量) 我想要一个返回公式对象的函数,如下所示: var regressionEquation = [{ "var" : "w", "power" : 1, "coeff" : "1.5" }, { "var" : "x", "power" : 1, "coeff" : "2" },

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

我想要一个返回公式对象的函数,如下所示:

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点

正如你所说的,这个问题在变换下等价于一个线性回归问题。你在评论中说你有固定的指数
k_1
k_2
,和
k_3
。转换将元组
{w,x,z,y}
转换为元组
{w^k_1,x^k_2,z^k_2,y}={w',x',z',y}
。对素数变量使用线性回归来获得系数

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

{"w" : 4, "x" : 3, "z" : 5, "y" : 15} 
==> {"w*" : 16, "x*" : 27, "z*" : 5, "y" : 15}
这只是如何将问题转化为线性回归问题的一个特例。在您的例子中,您考虑的多项式形式特别简单


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

我认为如果有四个方程,只有三个变量(因为你已经确定了幂,把它变成一个线性方程),那么线性方程就太完整了,不存在一个能满足所有四个方程的精确解

你能做的就是最小化残余误差,得到一个最佳近似值

假设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]. 
那么问题是

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)我建议使用最小二乘法得到一个线性方程。 此外,您可以使用非线性最小二乘法,假设 提前知道您想要安装的功能

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

javascript中有几个用于线性LS的链接,您可以 可能会将其调整为3个维度(例如,通过快速谷歌搜索)。对于非线性
如果是这样的话,还需要做更多的工作。

你在考虑多项式插值之类的东西吗?()我以前写过一些js,通过对范德蒙矩阵的运算来实现这一点。不,我想找到一个回归方程,然后外推,你有函数w=ax^k1+by^k2+cz^k3,在那里你想找到适合你数据的a,b,c,k1,k2和k3?我想要一个能找到a,b和c的过程。但我希望它适用于任何值k1、k2和k3。(我已经决定了这些值)这可能更适合使用数学标记。如果第一种情况已经可以解决。但是如果是第二种情况,我没有看到任何javascript库可以返回伪逆。也许这个库可以帮助你,因为它可以计算矩阵的奇异值分解,你可以用U和V得到伪逆。我不完全理解解释中使用的所有数学,我理解的是,在第一种情况下(这是我唯一关心的)为了得到解决方案,我需要使用你们提供的库来求M的倒数,然后使用这个库来求*r。我是对的吗?我试过了,它导致了一个错误,因为M是不可逆的,因为它不是平方,它不是M的逆,它是M的MP逆,v=逆(转置(M)*M)*转置(M)*r;因为转置(M)*M是平方的,在你的例子中是满秩的,它是可逆的。如果你的矩阵M不是太大,这个封闭形式的解决方案会非常快。我理解你发布的链接的方式,它不适用于多个变量,这是一个主要问题。好吧,它可以适用于任何数量的变量或任何函数(参见示例)--问题是它主要用于y=ax+b,因此您将发现的大多数代码都是针对这种类型的函数的。有关多变量的线性情况,请参见。但是,一般来说,对于非线性问题,你可能需要自己做一些数学计算。编辑/添加:但是,由于系统是过度确定的,这可能是正确的做法。问题是我不知道如何做这个数学
M^T*M*v-M^T*r=0 => v=(M^T*M)\M^T*r. 
M*v=r. 
M=U*S*V^T, 
v=V*S^-1*U^T*r