Y a-Linéaire de la Fonction de Régression dans SQL Server?
Y a-Linéaire de la Fonction de Régression dans SQL Server 2005/2008, semblable à la La Régression linéaire des fonctions d'Oracle ?
Vous devez vous connecter pour publier un commentaire.
Y a-Linéaire de la Fonction de Régression dans SQL Server 2005/2008, semblable à la La Régression linéaire des fonctions d'Oracle ?
Vous devez vous connecter pour publier un commentaire.
Au meilleur de ma connaissance, il n'en est rien. L'écriture est assez simple, cependant. Le suivant vous donne la constante de l'alpha et de la pente de la bêta pour y = Alpha + Beta * x + epsilon:
Ici
GroupID
est utilisé pour montrer comment le groupe en a de la valeur à votre source de données de la table. Si vous voulez juste les statistiques de toutes les données dans la table (pas de sous-groupes spécifiques), vous pouvez les supprimer et les jointures. J'ai utilisé leWITH
déclaration pour des raisons de clarté. Comme alternative, vous pouvez utiliser des sous-requêtes à la place. Veuillez être conscient de la précision du type de données utilisées dans vos tables comme la stabilité numérique peut se détériorer rapidement si la précision n'est pas assez élevé par rapport à vos données.EDIT: (en réponse à Pierre de la question pour ce qui est des statistiques tels que R2 dans les commentaires)
Vous pouvez facilement calculer des statistiques supplémentaires à l'aide de la même technique. Voici une version avec R2, corrélation, et l'échantillon de covariance:
EDIT 2 améliore la stabilité numérique par la standardisation des données (au lieu de seulement centrage) et par le remplacement de
STDEV
en raison de numérique des problèmes de stabilité. Pour moi, l'implémentation actuelle semble être le meilleur compromis entre la stabilité et de la complexité. J'ai pu améliorer la stabilité en remplacement de mon écart-type avec un numériquement stable algorithme en ligne, mais cela ne ferait que compliquer la mise en œuvre substantantially (et de le ralentir). De même, les mises en œuvre à l'aide par exemple Kahan(-Babuška-Neumaier) compensations pour leSUM
etAVG
semblent effectuer modestement mieux dans les tests limités, mais faire la requête beaucoup plus complexe. Et tant que je ne sais pas combien de T-SQL implémenteSUM
etAVG
(par exemple, il pourrait déjà être à l'aide de paires de sommation), je ne peux pas garantir que de telles modifications de toujours améliorer la précision.avg(x*y)
etVARP(X)
dans votre formule. Un autre petit point, c'est queavg(expression)
vous donne un entier si vos données d'entrée est de type integer. Mais maintenant, la vraie question: votre code n'est pas numériquement stable, voir les commentaires dans le code et commencer à "Edit 2". Aussi n'hésitez pas à regarder l'historique de la révision de la réponse et vous remarquerez que la première version est assez proche de la vôtre. Longue histoire courte: je n'aurais jamais utiliser votre version parce que je n'aurais pas confiance en elle dans de nombreux numériquement comporte bien des situations.AVG(x * 1.)
hack) - je crois que votre version donne un mauvais résultat six
ety
sont des entiers; 2) la version dans mes réponses normalise les données qui pourraient aider certains idiosyncrazies / edge-cas de virgule flottante de l'arithmétique. Mais en tout normal de cas d'utilisation de votre version semble bien pour moi.1.0
. C'est un hack pour forcer un type de données non entier, même si le type de données dex
est entier (en T-SQL,AVG
pour les entiers retourne un entier qui n'est pas ce que nous voulons ici). Il aurait probablement été plus propre d'écrireCAST(x as FLOAT)
, mais c'est plus court, et autant que je me souvienne, il fonctionne mieux avecNUMERIC
(pas de garantie). C'est RDB-dépendant, j'ai uniquement testé avec MS SQL Server.Ceci est une autre méthode, basée sur un blog sur la Régression Linéaire en T-SQL, qui utilise les équations suivantes:
SQL suggestion dans le blog utilise des curseurs bien. Voici une version embellie de forum répondre que j'ai utilisé:
En fait, j'ai écrit une routine SQL à l'aide de Gram-Schmidt orthoganalization. Elle, comme d'autres l'apprentissage de la machine et de la prévision de routines, est disponible à sqldatamine.blogspot.com
À la suggestion de Brad Larson, j'ai ajouté le code ici, plutôt que de simplement diriger les utilisateurs vers mon blog. Ce produit les mêmes résultats que la fonction droitereg dans Excel. Ma principale source est Éléments de l'Apprentissage Statistique (2008) par Hastie, Tibshirni et Friedman.
Il n'y a pas de régression linéaire des fonctions dans SQL Server. Mais pour calculer une Simple Régression Linéaire (Y = bX + A) entre des paires de points de données x,y - y compris le calcul du Coefficient de Corrélation, le Coefficient de Détermination (R^2) et Standard de l'Estimation d'Erreur (Écart-type), procédez de la manière suivante:
Pour une table
regression_data
avec des colonnes numériquesx
ety
:À ajouter à @icc97 réponse, j'ai inclus la pondérée des versions pour la pente et l'ordonnée à l'origine. Si les valeurs sont toutes constante de la pente va être NUL (avec les paramètres appropriés
SET ARITHABORT OFF; SET ANSI_WARNINGS OFF;
), et devra être substitué par 0 via fusionnent().Voici une solution écrite en SQL:
Où w est le poids. J'ai vérifié cela sur R pour confirmer les résultats.
On peut avoir besoin de jeter les données de somedatasource à virgule flottante.
J'ai inclus les versions instables de vous mettre en garde contre ceux-ci. (Un merci spécial va à Stephan dans une autre réponse.)
Garder à l'esprit que la corrélation est la corrélation des points de données x et y et non pas de la prédiction.
J'ai traduit la Régression Linéaire de la Fonction utilisée pour la fonction de Prévision dans Excel, et créé une fonction SQL qui retourne a,b, et les Prévisions.
Vous pouvez voir l'intégralité de l'teorical explication dans l'aide d'excel pour les PRÉVISIONS fuction.
Des sapins de tout ce dont vous aurez besoin pour créer la table type de données XYFloatType:
Puis écrire la suite de la fonction:
Ici, c'est aussi une fonction qui prend un tableau de type de type: de table (Y, float, double X) qui est
appelé XYDoubleType et n'assume notre fonction linéaire est de la forme AX + B. Il retourne A et B d'une colonne de Table, juste au cas où vous souhaitez avoir dans une jointure ou quelque chose
J'espère que la réponse suivante permet de comprendre où les solutions viennent de. Je vais l'illustrer par un exemple simple, mais la généralisation à plusieurs variables est théoriquement simple, aussi longtemps que vous savez comment utiliser l'indice de notation ou des matrices. Pour la mise en œuvre de la solution pour quelque chose au-delà de 3 variables que vous aurez de Gram-Schmidt (Voir Colin Campbell réponse ci-dessus) ou une autre matrice algorithme d'inversion.
Depuis toutes les fonctions dont nous avons besoin sont la variance, covariance, la moyenne, la somme etc. sont des fonctions d'agrégation en SQL, on peut facilement mettre en œuvre la solution. Je l'ai fait dans la RUCHE pour faire d'étalonnage linéaire des scores d'un modèle Logistique - parmi les nombreux avantages, l'un est que vous pouvez fonctionner entièrement à l'intérieur de la RUCHE sans aller et retour de certains langage de script.
Le modèle de vos données (x_1, x_2, y) où les points de données sont indexées par i, est
Le modèle "linéaire", mais ne doit pas être, Par exemple x_2 peut être n'importe quelle fonction non linéaire de x_1, tant qu'il n'a pas de paramètres libres dans cela, par exemple, x_2 = Sinh(3*(x_1)^2 + 42). Même si x_2 est "juste" x_2, et le modèle est linéaire, la régression problème n'est pas le cas. Seulement lorsque vous décidez que le problème est de trouver les paramètres m_1, m_2, c tels qu'ils minimisent l'erreur L2 avez-vous un problème de Régression Linéaire.
L'erreur L2 est sum_i( (y[i] - f(x_1[i], x_2[i]))^2 ). Afin de minimiser cette w.r.t. les 3 paramètres (définir les dérivées partielles w.r.t. chaque paramètre = 0) donne 3 équations linéaires pour 3 inconnues. Ces équations sont LINÉAIRES dans les paramètres (c'est ce qui fait de la Régression Linéaire) et peut être résolu analytiquement. Faire cela pour un modèle simple (1 variable, modèle linéaire, il y a donc deux paramètres) est simple et instructif. La généralisation à un non-Euclidienne métrique norme du vecteur d'erreur de l'espace est simple, la diagonale cas particulier des montants à l'aide de "poids".
Retour à notre modèle à deux variables:
Prendre l'attente de la valeur =>
Maintenant prendre la covariance w.r.t. x_1 et x_2, et l'utilisation cov(x,x) = var(x):
Ces deux équations à deux inconnues, que vous pouvez résoudre par inversion de la matrice 2X2.
Sous forme matricielle:
...
qui peut être inversé de rendement
...
où
(oh barf, ce que le diable sont des "points de réputation? Donne-moi un peu si vous voulez voir les équations.)
En tout cas, maintenant que vous avez m1 et m2 dans la forme fermée, vous pouvez résoudre (0) pour c.
J'ai vérifié la solution analytique ci-dessus pour le Solveur d'Excel pour une équation du second degré avec le bruit Gaussien et les erreurs résiduelles engagez à 6 chiffres significatifs.
Me contacter si vous voulez faire la transformée de Fourier Discrète dans SQL dans environ 20 lignes.