我已经搜索了堆栈溢出,并且没有发现任何与我的相同的问题,因为没有一个真正有多个自变量。基本上我有一组数据点,我希望能够找到这些数据点的回归方程。到目前为止我的代码看起来像这样:(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个点。
答案 0 :(得分:1)
正如您所说的那样,问题在于转换时与线性回归问题等价。您在评论中表示您已修复指数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}
这只是将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/)。对于非线性 如果它需要更多的工作。