Comment trouver une équation de régression multivariable en javascript

J'ai cherché un débordement de la pile et je n'ai trouvé aucune question qui est exactement la même que la mienne, car aucune n'a vraiment plus d'une variable indépendante. Fondamentalement, j'ai un ensemble de points de données et je souhaite trouver une équation de régression pour ces points de données. Le code que j'ai jusqu'ici ressemble à ceci: (w, x, z sont les variables indépendantes et y est la variable dépendante)

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 }]; 

Je voudrais une fonction qui renverrait un objet de formule comme ceci:

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

Existe-t-il un moyen de proposer une équation de régression comme celle-ci sans utiliser une boucle pour passer et brancher les valeurs? Existe-t-il un moyen d'élaborer l'équation de régression pour des puissances supérieures à 1? Merci d'avance.

MODIFIER

Beaucoup de gens ont suggéré de résoudre un système d'équations créé en branchant les puissances. Le problème que j'ai avec cela est quand il y a plus que suffisamment de points de données pour résoudre un système d'équations. Dans les exemples de la question, j'ai 3 variables afin de résoudre le système d'équations que les gens suggèrent, j'aurais besoin de 3 points de données mais j'ai 4. Cela mène à un problème car il existe plus d'une solution. Il existe 4 solutions possibles car il existe 4 façons de combiner les 4 équations en différents groupes de 3. Cela me laisserait 4 réponses avec peut-être aucune d'entre elles le meilleur pour tous les 4 points.

Le problème, comme vous l'avez déclaré, est équivalent, en transformation, à un problème de régression linéaire. Vous avez dit dans les commentaires que vous avez k_1 exposants k_1 , k_2 et k_3 . La transformation prend un tuple {w, x, z ,y} au tuple {w^k_1, x^k_2, z^k_2, y} = {w', x', z' ,y} . Utilisez une régression linéaire sur les variables amorties pour obtenir vos coefficients.

Par exemple, si k_1 = 2 , k_2 = 3 et k_3 = 1 , voici un exemple unique de la transformation:

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

Ce n'est qu'un cas particulier de la façon dont vous convertissez un problème de régression polynomiale en une régression linéaire. Dans votre cas, les formes polynomiales que vous envisagez sont particulièrement simples.

Utilisez n'importe quelle bibliothèque JavaScript que vous souhaitez résoudre le problème de régression linéaire; Il y en a plusieurs.

Je pense que si c'est le cas, il existe quatre équations et seulement 3 variables (Comme vous avez déjà déterminé les pouvoirs, le plugin et en fait une équation linéaire), l'équation linéaire est terminée et il n'existe pas de réponse exacte Satisfaire les quatre équations.

Ce que vous pouvez faire, c'est de minimiser l'erreur résiduelle et d'obtenir une meilleure approximation.

Supposons que vous avez des coefficients ab et c pour le wx et z,

Définir une matrice

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

Et définissez le vecteur

 v=[a;b;c], 

Définir le vecteur

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

Ensuite, le problème est

 M*v=r solve v. 

1. Si le nombre de rang (M)> variable, vous devez minimiser l'erreur résiduelle

 ||M*vr||_2. 

Comme cela est convexe, prenez-le dérivé et faites-le zéro:

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

(M ^ T * M) \ M ^ T est MP-inverse de M, si le nombre de rang (M)> variable, alors (M ^ T * M) est inversible.

2. Si le nombre de rang (M) <= variable, vous pouvez obtenir infiniment une solution exacte à l'équation.

 M*v=r. 

Supposons une décomposition de valeur singulière de M:

 M=U*S*V^T, 

puis

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

Est l'une des solutions.

V * S ^ -1 * U ^ T est pseudo inverse de M.

Si vous utilisez une bibliothèque d'algèbre linéaire, il est très facile d'obtenir une solution de formulaire fermée sans itération. http://sylvester.jcoglan.com/

Je suggère d'utiliser les moindres carrés pour obtenir une équation linéaire. En outre, vous pouvez utiliser des moindres carrés non linéaires, étant donné que vous savez à l'avance la fonction que vous souhaitez adapter.

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

Il existe plusieurs liens pour LS linéaire en javascript et vous pouvez probablement l'adapter à 3 dimensions (par exemple http://dracoblue.net/dev/linear-least-squares-in-javascript/159/ à partir d'une recherche rapide Google). Pour le cas non linéaire, il faudrait encore plus de travail.