我搜索了堆栈溢出,没有发现任何与我的问题相同的问题,因为没有一个真正的自变量超过一个。基本上,我有一个数据点数组,我希望能够找到这些数据点的回归方程。到目前为止,我的代码是这样的:(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分。
正如您所说的,这个问题在转换下等价于线性回归问题。您在评论中说您有固定的指数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库来解决线性回归问题;他们有很多。
我认为,如果是四个方程只有三个变量的情况(正如你已经确定了幂,插件并使其成为线性方程),则线性方程是过完备的,并且不存在满足所有四个方程的确切答案。
你能做的就是最小化残差并得到最佳近似值。
假设你有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/
我建议使用最小二乘法来获得线性方程。此外,考虑到提前知道你想要适应的功能。
(http://en.wikipedia.org/wiki/Leastrongquares)
javascript中有几个线性LS链接,您可以可能将其调整为3个维度(例如。http://dracoblue.net/dev/linear-least-squares-in-javascript/159/从快速谷歌搜索)。对于非线性万一还需要更多的工作。