2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
régression linéaire: Dans des données limitées, en ajustant les paramètres, une ligne droite est ajustée, et cette ligne droite (modèle) est utilisée pour effectuer des expériences sur des données inconnues.prédire。
DroitForme générale:
y = w × x + by = w fois x + bet=m×X+b
L’état de la droite entière est donné par w et pc et bmetbDécider, wwwmdéterminer la ligne droitepente(c'est-à-dire l'angle d'inclinaison), bbbDéterminer la ligne droite sur l'axe Yintercepter(Contrôlez la translation vers le haut et vers le bas d'une ligne droite, également connue sous le nom debiais ).Il suffit donc de calculer wwwmet bbbLa valeur de peut déterminer une ligne droite spécifique. Ensuite, nous étudierons comment trouver. wwwmet bbb。
nom propre
nom | Définition |
---|---|
Ensemble d'entraînement | Ensemble de données utilisé pour entraîner le modèle |
ensemble d'essai | Ensemble de données utilisé pour tester la qualité du modèle |
Échantillon de formation/Point de formation (Échantillon de formation) | Chaque élément de données de l'ensemble d'apprentissage |
Caractéristiques | Les données saisies dans le modèle peuvent être des valeurs numériques, des étiquettes de catégorie, des valeurs de pixels d'image, etc. |
Étiquette | Le modèle doit prédire la valeur cible. Pour les problèmes de classification, l'étiquette est généralement le nom de la classe ; pour les problèmes de régression, l'étiquette est une valeur continue. |
Étudions d'abord la régression linéaire univariée. La régression linéaire dite univariée fait référence à une fonction linéaire avec une seule variable indépendante, telle que : y = w ⋅ x + par = wcdot x + bet=m⋅X+bC'estLigne droite univariée, n'a qu'une seule variable d'entrée xxX . Cette droite peut être exprimée sur un plan bidimensionnel (l'axe horizontal est X et l'axe vertical est Y).
Lorsque nous obtenons un ensemble de données non divisées, nous divisons généralement les données en un ensemble d'apprentissage et un ensemble de test. Une méthode de division simple consiste à prendre les premiers 80 % des échantillons comme ensemble d'apprentissage et les 20 % restants comme ensemble. l’ensemble de test.
Supposons que nous ayons découvert wwwmet bbb, alors nous avons déterminé une ligne droite, et nous pouvons utiliser cette ligne droite pour faire des prédictions afin de faciliter le jugement de la valeur que nous prédisons.etavec une vraie valeuretentreerreurCombien, nous voulons définir *"une règle"*, utilisée pour mesurer la valeur prédite y ′ y'et′avec une vraie valeur ouaiset erreur entre.Ici, nous utilisonserreur quadratique moyennedéfinirfonction de coût:
J ( w , b ) = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}sommelimites_{i = 1}^m(f_{w,b}(x^{(i)}) - y^{(i)})^2J(m,b)=2m1je=1∑m(Fm,b(X(je))−et(je))2
Démantèlement de la formule:
fw , b ( x ( i ) ) − y ( i ) f_{w,b}(x^{(i)}) - y^{(i)}Fm,b(X(je))−et(je):dans fw , b ( x ( i ) ) f_{w,b}(x^{(i)})Fm,b(X(je))représente la valeur prédite à l'aide du modèle entraîné, tandis que y ( i ) y^{(i)}et(je)représente le vrai résultat de chaque échantillon d'apprentissage, et la différence entre les deux représente l'erreur entre la valeur prédite par le modèle et la vraie valeur.
Pourquoi quadraturer l’erreur ?
Dans tous les ensembles d'échantillons, chaque erreur peut être positive ou négative, et il y aura une certaine probabilité de décalage pendant le processus de sommation. Cela conduira à ce que l'erreur de chaque élément soit très grande (par exemple : -100, + 90,). -25, +30), après addition, une petite valeur (-5) est obtenue, et finalement un mauvais jugement est obtenu.
1 2 m frac{1}{2m}2m1: Représente la moyenne de la somme de toutes les erreurs de données (cette moyenne peut représenter l'erreur de l'ensemble du modèle dans un sens) et obtient l'erreur quadratique moyenne.
Pourquoi diviser par 2?
Car lorsque la descente de gradient sera effectuée ultérieurement, la dérivation divisera l'indice 2 en coefficients, car pour une grande quantité de données, une constante a peu d'impact sur le modèle. Afin d'introduire la formule de dérivation, divisez-la par 2 au préalable. , pour un décalage ultérieur.
Connaissant la fonction de coût, il nous suffit de trouver des moyens de réduire le coût. Plus le coût est faible, plus notre valeur prédite est proche de la valeur réelle.
En observant la fonction de coût d'erreur, nous pouvons voir que la fonction de coût d'erreur est une fonction quadratique, c'est-à-dire unefonction convexe, une propriété de la fonction convexe est :Le point extrême est le point maximum , puisque la fonction de coût est une fonction quadratique qui s'ouvre vers le haut (la formule peut être développée et vous pouvez intuitivement sentir que le coefficient du terme carré est supérieur à 0), donc la fonction convexe n'a qu'une valeur minimale, et nous seulement besoin de trouver la valeur minimale est la valeur minimale.Pour la fonction de coût d'erreur J ( w , b ) J(w,b)J(m,b) , son développement de formule peut s'écrire :
J ( w , b ) = 1 2 m ∑ i = 1 m ( ( wx ( i ) + b ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}sommelimites_{i = 1}^m((wx^{(i)}+b) - y^{(i)})^2J(m,b)=2m1je=1∑m((mX(je)+b)−et(je))2
JJJLa taille dépend des paramètres wwwmet bbb, qui peut être résolu par descente de gradient. La forme de la fonction de coût est à peu près la suivante :
L'idée de la descente de pente fonctionne principalementTrouver la dérivée partielleméthode, qui est liée à la biologievariables de contrôleLa méthode est très similaire, comme par exemple : dans le contrôle bbbMettre à jour sans changement wwwm(Visible bbbest une constante), formule : w ′ = w − α ∂ J ( w ) ∂ ww' = w - alpha frac{partiel J(w)}{partiel w}m′=m−α∂m∂J(m) Indique qu'il a été mis à jour dans l'ordre wwwm,dans alpha-alphaα représentetaux d'apprentissage Utilisé pour représenter la taille du pas, qui peut également être comprise comme la vitesse de descente, ∂ J ( w ) ∂ w frac{partiel J(w)}{partiel w}∂m∂J(m) exprime le droit wwwmEn recherchant la dérivée partielle, on obtient W − JW - JL−J(PoidsLet le prixJfonction) Une ligne tangente sur une fonction convexe, utilisée pour représenter la valeur de fonction décroissante la plus rapidedirection, le produit des deux représenteDéplacez-vous d'un pas dans la direction où la valeur de la fonction diminue le plus rapidement .Cette distance doit être ajustée en fonction de l'ensemble de données If. alpha-alphaαS'il est trop grand (la taille du pas est trop grande), cela entraînera wwwmpasse directement du point le plus bas au point le plus haut de l'autre côté, de sorte qu'il ne s'approche jamais du minimum, si alpha-alphaαS'il est trop petit (la taille du pas est trop petite), cela entraînera wwwmCela devient de plus en plus lent à mesure qu’il s’approche du minimum, consommant des coûts de calcul.
taux d'apprentissage ( alpha-alphaα) méthode de réglage:
Définissez d'abord un plus petit alpha-alphaα Tel que : 0,001.
Ensuite, il augmente de 10 fois à chaque fois, jusqu'à un maximum de 1.
Après avoir déterminé une certaine valeur, telle que : 0,01.
Effectuez ensuite 3 fois le traitement, tel que : 0,01 × 3 = 0,03, 0,03 × 3 = 0,09 0,01 fois 3 = 0,03, 0,03 fois 3 = 0,090.01×3=0.03,0.03×3=0.09 (Le but est de rendre la convergence plus rapide).
Le processus de résolution des dérivées partielles (trouver la direction de la descente du gradient) :
mendier ∂ J ( w ) ∂ w frac{partiel J(w)}{partiel w}∂m∂J(m) :
∂ J ( w ) ∂ w frac{partiel J(w)}{partiel w}∂m∂J(m) = ∂ ∂ w 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 frac{partiel}{partiel w}frac{1}{2m}sommelimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})^2∂m∂2m1je=1∑m(Fm,b(X(je))−et(je))2
= ∂ ∂ w 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 frac{partiel}{partiel w}frac{1}{2m}sommelimites_{i = 1}^{m}wx^{(i)} - y^{(i)})^2∂m∂2m1je=1∑mmX(je)−et(je))2
= 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 x ( i ) frac{1}{2m}sommelimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})cdot2x^{(i)}2m1je=1∑m(Fm,b(X(je))−et(je))⋅2X(je)
= 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) x ( i ) frac{1}{m}sommelimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)}m1je=1∑m(Fm,b(X(je))−et(je))X(je)
mendier ∂ J ( w ) ∂ b frac{partiel J(w)}{partiel b}∂b∂J(m) :
∂ J ( w ) ∂ b frac{partiel J(w)}{partiel b}∂b∂J(m) = ∂ ∂ b 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 frac{partiel}{partiel b}frac{1}{2m}sommelimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})^2∂b∂2m1je=1∑m(Fm,b(X(je))−et(je))2
= ∂ ∂ b 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 frac{partiel}{partiel b}frac{1}{2m}sommelimites_{i = 1}^{m}wx^{(i)} - y^{(i)})^2∂b∂2m1je=1∑mmX(je)−et(je))2
= 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 frac{1}{2m}sommelimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})cdot22m1je=1∑m(Fm,b(X(je))−et(je))⋅2
= 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) frac{1}{m}sommelimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})m1je=1∑m(Fm,b(X(je))−et(je))
Trouvez-en des spécifiques grâce à l'itération de boucle wwwmvaleur avec bbbvaleur:
pendant que ( ) : pendant que():mSalutlet():
w ∗ = w − α ∂ ∂ w J ( w , b ) w^* = w - alpha frac{partiel}{partiel w}J(w,b)m∗=m−α∂m∂J(m,b)
b ∗ = b − α ∂ ∂ b J ( w , b ) b^* = b - alpha frac{partiel}{partiel b}J(w,b)b∗=b−α∂b∂J(m,b)
l = l ∗ l = l^*m=m∗
b = b ∗ b = b^*b=b∗
Au début, nous valorisons w et b de manière aléatoire, puis itérons. Nous pouvons définir la descente du gradient pour qu'elle se termine lorsque l'erreur est inférieure à un certain seuil, ou personnaliser le nombre d'itérations, nous pouvons obtenir un résultat plus idéal. wwwmvaleur somme bbbvaleur.
La régression linéaire multivariée étend les dimensions à trois dimensions et même à des états multidimensionnels, tels que y = l 1 x 1 + l 2 x 2 + par = l_1 x_1 + l_2 x_2 + bet=m1X1+m2X2+b peut être compris commeXAxe etYLes axes sont x 1 et x 2 x_1 et x_2X1etX2 ZL'axe est ouaiset, il s'agit d'un état tridimensionnel. Chaque échantillon d'apprentissage est un point dans l'espace tridimensionnel. Il est nécessaire de trouver une ligne droite appropriée pour ajuster le point échantillon dans l'espace tridimensionnel.
Méthode : Pour chaque variable séparément ( w 1 , w 2 , … , wn , b w_1,w_2,points,w_n,bm1,m2,…,mn,b) pour le traitement de descente de gradient
Points principaux: Pour la régression linéaire multivariée, les plages de valeurs des différentes valeurs de caractéristiques sont différentes, telles que : la plage de valeurs de la caractéristique d'âge : 0 0 0 ~ 100 100 100, couvrant la zone : 0 m 2 0 m^20m2 ~ 10000 m2 10000m^210000m2 , il peut aussi y avoirÉchantillon étrange, l'existence d'échantillons de données singuliers entraînera une augmentation du temps de formation et peut également entraîner un échec de convergence. Par conséquent, lorsqu'il existe des données d'échantillon singulières, il est nécessaire de prétraiter les données avant la formation.Normalisé Au contraire, lorsqu'il n'y a pas de données d'échantillon singulières, la normalisation n'a pas besoin d'être effectuée.Pour résoudre ce problème, nous devons effectuerLes fonctionnalités sont mises à l'échelle (normalisées)。
Traitement de normalisation des données
accomplirNormalisation des donnéesIl existe trois méthodes :
Identique à diviser par la valeur maximale :
Divisez toutes les valeurs de chaque fonctionnalité par la valeur maximale de cette fonctionnalité.
Normalisation moyenne :
Soustrayez la valeur de chaque fonctionnalité de la valeur de cette fonctionnalitésignifier, puis divisé par la différence entre les valeurs maximales et minimales de la fonctionnalité.
Normalisation du score Z :
Calculer chaque fonctionnalitéécart-typeetsignifier
Soustrayez la valeur de chaque fonctionnalité de toutes les valeurs de cette fonctionnalitévaleur moyenne, puis divisé par la fonctionnalitésignifier
Si la normalisation n'est pas effectuée, la fonction de coût changera en raison de grandes différences dans les valeurs des différentes caractéristiques dans le vecteur de caractéristiques. "plat" .De cette façon, lors de la descente du gradient, la direction du gradient s'écartera de la direction de la valeur minimale, et cela ira beaucoupDEVIATION, ce qui rendra le temps de formation trop long.
Après normalisation, la fonction objectif affichera une comparaison "rond", de sorte que la vitesse d'entraînement soit considérablement accélérée et que de nombreux détours soient évités.
Avantages de la normalisation des données :
J ( w , b ) = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}sommelimites_{i = 1}^m(f_{w,b}(x^{(i)}) - y^{(i)})^2J(m,b)=2m1je=1∑m(Fm,b(X(je))−et(je))2
Descente de gradient pour la régression linéaire multiple:
w 1 = W 1 − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) x 1 ( i ) w_1 = W_1 - alpha frac{1}{m}sommelimites_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_1^{(i)}m1=L1−αm1je=1∑m(Fm,bX(je)−et(je))X1(je)
⋮ points vidéo⋮
wn = W n − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) xn ( i ) w_n = W_n - alpha frac{1}{m}sumlimits_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_n^{(i)}mn=Ln−αm1je=1∑m(Fm,bX(je)−et(je))Xn(je)
b = b − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) b = b - alpha frac{1}{m}sommelimites_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})b=b−αm1je=1∑m(Fm,bX(je)−et(je))
expliquer: w 1 ⋯ wn w_1cdots w_nm1⋯mn représente le coefficient de chaque variable et b représente le terme constant de la fonction linéaire.
Omettre...
Dérivation mathématique :
J = 1 2 m ∑ i = 1 m ( θ ⃗ ix ⃗ i − yi ) 2 J = frac{1}{2m}sommelimites_{i = 1}^{m}(vec{theta}_i vec{x}_i - y_i)^2J=2m1je=1∑m(θjeXje−etje)2
= 1 2 m ∣ ∣ θ ⃗ x ⃗ − y ∣ ∣ 2 frac{1}{2m}||vec{thêta} vec{x} - y||^22m1∣∣θX−et∣∣2
= 1 2 m ( θ ⃗ x ⃗ − y ) T ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{thêta} vec{x} - y)^T(vec{thêta} vec{x} - y)2m1(θX−et)T(θX−et)
= 1 2 m ( θ ⃗ T x ⃗ T − y T ) ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{thêta}^T vec{x}^T - y^T)(vec{thêta} vec{x} - y)2m1(θTXT−etT)(θX−et)
= 1 2 m ( θ ⃗ T x ⃗ T x ⃗ θ ⃗ − y T x ⃗ θ ⃗ − θ ⃗ T x ⃗ T y + y T y ) frac{1}{2m}(vec{thêta}^T vec{x}^Tvec{x}vec{thêta} - y^Tvec{x}vec{thêta} -vec{thêta}^Tvec{x}^Ty +y^Ty )2m1(θTXTXθ−etTXθ−θTXTet+etTet)
droite θ thêtaθTrouvez la dérivée partielle : Δ = ∂ J ∂ θ = 1 2 m ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ ∂ θ − ∂ θ ⃗ T x ⃗ T y ∂ θ + y T y ∂ θ ) Delta =frac{partiel J}{partiel thêta}= frac{1}{2m}(frac{partiel vec{thêta}^T vec{x}^Tvec{x}vec{thêta}}{partiel thêta} - frac{partiel y^Tvec{x}vec{thêta}}{partiel thêta} - frac{partiel vec{theta}^Tvec{x}^Ty}{thêta partiel} + frac{y^Ty}{thêta partiel})Δ=∂θ∂J=2m1(∂θ∂θTXTXθ−∂θ∂etTXθ−∂θ∂θTXTet+∂θetTet)
Règle de dérivation matricielle :
∂ θ TA θ ∂ θ = ( A + AT ) θ frac{thêta partiel^{T}Athêta}{thêta partiel} = (A + A^T)thêta∂θ∂θTUNθ=(UN+UNT)θ
∂ XTA ∂ X = A frac{partiel X^{T}A}{partiel X} = A∂X∂XTUN=UN
∂ AX ∂ X = AT frac{partiel AX}{partiel X} = A^T∂X∂UNX=UNT
∂ A ∂ X = 0 frac{partiel A}{partiel X} = 0∂X∂UN=0
Disponible Δ = 1 2 m ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ ∂ θ − ∂ θ ⃗ T x ⃗ T y ∂ θ + y T y ∂ θ ) = 1 2 m ⋅ ( 2 x T x θ − 2 x T y ) = 1 m ⋅ ( x T x θ − x T y ) Delta = frac{1}{2m}(frac{partiel vec{theta}^T vec{x}^Tvec{x}vec{theta}}{partiel thêta} - frac{partiel y^Tvec{x}vec{theta}}{thêta partiel} - frac{vec{theta partiel}^Tvec{x}^Ty}{thêta partiel} + frac{y^Ty}{thêta partiel}) = frac{1}{2m}cdot (2x^Txtheta - 2x^Ty) = frac{1}{m} cdot (x^Txtheta - x^Ty)Δ=2m1(∂θ∂θTXTXθ−∂θ∂etTXθ−∂θ∂θTXTet+∂θetTet)=2m1⋅(2XTXθ−2XTet)=m1⋅(XTXθ−XTet)
quand Δ = 0 Delta = 0Δ=0 heure: x T x θ = x T yx^Tx thêta = x^TyXTXθ=XTet , θ = ( x T x ) − 1 x T y thêta = (x^Tx)^{-1}x^Tyθ=(XTX)−1XTet peut être calculé θ thêtaθ valeur.
Comparaison de la descente de gradient et des équations normales:
Descente graduelle: Il est nécessaire de sélectionner le taux d'apprentissage α, qui nécessite plusieurs itérations. Il peut également être mieux appliqué lorsque le nombre de fonctionnalités n est grand et convient à différents types de modèles.
équation normale: Il n'est pas nécessaire de sélectionner le taux d'apprentissage α. Il est calculé une fois et doit être calculé. ( x T x ) − 1 (x^Tx)^{-1}(XTX)−1 , si le nombre de fonctionnalités nnnS'il est plus grand, le coût de fonctionnement sera plus important, car la complexité du temps de calcul de l'inverse de la matrice est O ( n 3 ) O(n^3)O(n3) , généralement quand nnnIl reste acceptable quand il est inférieur à 10 000.Uniquement disponible pour les modèles linéaires, ne convient pas à d'autres modèles tels que les modèles de régression logistique.
Étant donné que dans certains cas, il est difficile pour une ligne droite d'ajuster toutes les données, des courbes sont nécessaires pour ajuster les données, telles que des modèles quadratiques, des modèles cubiques, etc.
En général, la fonction de régression des données est inconnue, même si elle est connue, il est difficile de la transformer en un modèle linéaire avec une simple transformation de fonction, l'approche courante est donc la suivante.régression polynomiale(Régression polynomiale), c'est-à-dire utiliser une fonction polynomiale pour ajuster les données.
Comment choisir le degré d'un polynôme:
Il existe de nombreux types de fonctions polynomiales. De manière générale, vous devez d'abord observer la forme des données, puis décider quelle forme de fonction polynomiale utiliser pour résoudre le problème. Par exemple, à partir du nuage de points des données, s'il y a un "plier ", vous pouvez envisager d'utiliser un polynôme quadratique (c'est-à-dire mettre les caractéristiques au carré) ; il y en a deux "plier ", vous pouvez envisager d'utiliser un polynôme cubique (en prenant la puissance cubique de l'entité) ; il y en a trois "plier », puis envisagez d'utiliser un polynôme du quatrième ordre (en prenant la quatrième puissance de la caractéristique), et ainsi de suite.
Bien que la fonction de régression réelle ne soit pas nécessairement un polynôme d'un certain degré, tant que l'ajustement est bon, il est possible d'utiliser un polynôme approprié pour se rapprocher de la fonction de régression réelle.
L'annexe à la fin de l'article contient toutes les données originales utilisées dans l'expérience.ex1data1.txt
est la relation entre la population et le profit, ex1data2.txt
C'est l'impact de la taille de la maison et du nombre de chambres sur le prix de la maison.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path = "ex1data1.txt"
data = pd.read_csv(path,header = None,names=['Population','Profit'])
data.head() # 预览数据
data.describe() # 更加详细的数据描述
# 可视化训练数据
data.plot(kind = 'scatter',x = 'Population',y = 'Profit',figsize = (12,8))
plt.show()
def computerCost(X,y,theta): # 定义代价函数
inner = np.power(((X*theta.T)-y),2) # theta.T表示theta的转置
return np.sum(inner)/(2*len(X))
data.insert(0,"One",1) # 表示在第0列前面插入一列数,其表头为One,其值为1
Insérer dans la première colonne de l'ensemble de données 1 1 1La fonction est deFacilite les calculs matriciels, lorsque les matrices sont multipliées, des poids entrent en jeu wwwmet les préjugés bbb,parce que bbbn'est pas multiplié par la variable, donc un 1 1 1, utilisé avec bbbMultiplier.
cols = data.shape[1]
X = data.iloc[:,0:cols - 1] #“,”前只有“:”,表示所有的行,“,”后表示抽取数据中第[0列~第cols-1列)(左闭右开),去掉最后一列,最后一列为预测值
y = data.iloc[:,cols - 1:cols] #只取最后一列的值,表示预测值
X.head()
y.head()
X = np.matrix(X.values)
y = np.matrix(y.values) #只将表格中的值装换为矩阵而不是包括序号与标题
#初始化theta
theta = np.matrix(np.array([0,0])) #先是一个一维的数据,然后在转换为一个二维的矩阵
theta
# => matrix([[0, 0]])
X.shape,theta.shape,y.shape # 此时theta为一行列,需要进行转置
# => ((97, 2), (1, 2), (97, 1))
computerCost(X,y,theta)
# => 32.072733877455676
def gradientDecent(X,y,theta,alpha,iters): #iters为迭代次数
temp = np.matrix(np.zeros(theta.shape)) #构造一个与theta大小一样的零矩阵,用于存储更新后的theta
parmaters = int (theta.ravel().shape[1]) #.ravel()的功能是将多维数组降至一维,用于求需要求的参数个数
cost = np.zeros(iters) #构建iters个0的数组,相当于对每次迭代的cost进行记录
for i in range(iters):
error = (X * theta.T - y) #记录误差值,结果为一个数组
for j in range(parmaters): #对每一个参数进行更新,j用于表示每一个参数
term = np.multiply(error,X[:,j]) #.multiply 是对矩阵当中的数对应相乘,这里表示与X矩阵的第j列相乘。
temp[0,j] = theta[0,j] - ((alpha/len(X))*np.sum(term)) #存储更行后的theta的值,.sum()表示将矩阵中的数进行求和
theta = temp #更新theta
cost[i] = computerCost(X,y,theta) #计算此时的代价,并记录在cost中。
return theta,cost
alpha = 0.01 # 学习率
iters = 1000 # 迭代次数
g,cost = gradientDecent(X,y,theta,alpha,iters)
g
# => matrix([[-3.24140214, 1.1272942 ]])
computerCost(X,y,g)
# => 4.515955503078914
x = np.linspace(data.Population.min(),data.Population.max(),100) #抽取100个样本 (从data数据集中的最小值到最大值之间抽取100个样本)
f = g[0,0] + (g[0,1] * x) #f = ax + b
fig,ax = plt.subplots(figsize = (12,8)) #figsize表示图的大小
ax.plot(x,f,'r',label = "Prediction") #绘制直线,横坐标,纵坐标,直线名称
ax.scatter(data.Population,data.Profit,label = 'Training data') #绘制点,横坐标,纵坐标,点的名称
ax.legend(loc = 4) #显示图例位置
ax.set_xlabel('Population') #设置x轴的名称
ax.set_ylabel('Profit') #设置y轴的名称
ax.set_title('Predicted Profit vs. Population Size') #设置标题的名称
plt.show()
fig,ax = plt.subplots(figsize = (12,8))
ax.plot(np.arange(iters),cost,'r')
ax.set_xlabel('Interations')
ax.set_ylabel('Cost')
ax.set_title("Error vs. Training Epoc")
plt.show()
path = "ex1data2.txt"
data2 = pd.read_csv(path,header = None,names=["Size","Bedroom","Price"])
data2.head()
data2 = (data2 - data2.mean())/data2.std()
data2.head()
data2.insert(0,'Ones',1) #在x的第一列插入1
clos = data2.shape[1] #存储第二维(列)的数据量
X2 = data2.iloc[:,0:clos-1] #对X2进行赋值
y2 = data2.iloc[:,clos-1:clos] #对y2进行赋值
X2 = np.matrix(X2.values) #将X2转为矩阵
y2 = np.matrix(y2.values) #将y2转为矩阵
theta2 = np.matrix(np.array([0,0,0])) #初始化theta2为0矩阵
computerCost(X2, y2, theta2)
# => 0.48936170212765967
g2,cost2 = gradientDecent(X2,y2,theta2,alpha,iters) #记录放回值g2(theta2)和cost2
g2
# => matrix([[-1.10868761e-16, 8.78503652e-01, -4.69166570e-02]])
computerCost(X2,y2,g2)
# => 0.13070336960771892
fig,ax = plt.subplots(figsize = (12,8))
ax.plot(np.arange(iters),cost2,'x')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()
#正规方程
def normalEqn(X,y):
theta = np.linalg.inv(X.T@X)@X.T@y #.linalg中包含线性代数中的函数,求矩阵的逆(inv)、特征值等。@表示矩阵相乘
return theta
final_theta2 = normalEqn(X,y)
final_theta2
# => matrix([[-3.89578088], [ 1.19303364]])
Étapes générales pour entraîner un modèle:
ex1data1.txt
6.1101,17.592
5.5277,9.1302
8.5186,13.662
7.0032,11.854
5.8598,6.8233
8.3829,11.886
7.4764,4.3483
8.5781,12
6.4862,6.5987
5.0546,3.8166
5.7107,3.2522
14.164,15.505
5.734,3.1551
8.4084,7.2258
5.6407,0.71618
5.3794,3.5129
6.3654,5.3048
5.1301,0.56077
6.4296,3.6518
7.0708,5.3893
6.1891,3.1386
20.27,21.767
5.4901,4.263
6.3261,5.1875
5.5649,3.0825
18.945,22.638
12.828,13.501
10.957,7.0467
13.176,14.692
22.203,24.147
5.2524,-1.22
6.5894,5.9966
9.2482,12.134
5.8918,1.8495
8.2111,6.5426
7.9334,4.5623
8.0959,4.1164
5.6063,3.3928
12.836,10.117
6.3534,5.4974
5.4069,0.55657
6.8825,3.9115
11.708,5.3854
5.7737,2.4406
7.8247,6.7318
7.0931,1.0463
5.0702,5.1337
5.8014,1.844
11.7,8.0043
5.5416,1.0179
7.5402,6.7504
5.3077,1.8396
7.4239,4.2885
7.6031,4.9981
6.3328,1.4233
6.3589,-1.4211
6.2742,2.4756
5.6397,4.6042
9.3102,3.9624
9.4536,5.4141
8.8254,5.1694
5.1793,-0.74279
21.279,17.929
14.908,12.054
18.959,17.054
7.2182,4.8852
8.2951,5.7442
10.236,7.7754
5.4994,1.0173
20.341,20.992
10.136,6.6799
7.3345,4.0259
6.0062,1.2784
7.2259,3.3411
5.0269,-2.6807
6.5479,0.29678
7.5386,3.8845
5.0365,5.7014
10.274,6.7526
5.1077,2.0576
5.7292,0.47953
5.1884,0.20421
6.3557,0.67861
9.7687,7.5435
6.5159,5.3436
8.5172,4.2415
9.1802,6.7981
6.002,0.92695
5.5204,0.152
5.0594,2.8214
5.7077,1.8451
7.6366,4.2959
5.8707,7.2029
5.3054,1.9869
8.2934,0.14454
13.394,9.0551
5.4369,0.61705
ex1data2.txt
2104,3,399900
1600,3,329900
2400,3,369000
1416,2,232000
3000,4,539900
1985,4,299900
1534,3,314900
1427,3,198999
1380,3,212000
1494,3,242500
1940,4,239999
2000,3,347000
1890,3,329999
4478,5,699900
1268,3,259900
2300,4,449900
1320,2,299900
1236,3,199900
2609,4,499998
3031,4,599000
1767,3,252900
1888,2,255000
1604,3,242900
1962,4,259900
3890,3,573900
1100,3,249900
1458,3,464500
2526,3,469000
2200,3,475000
2637,3,299900
1839,2,349900
1000,1,169900
2040,4,314900
3137,3,579900
1811,4,285900
1437,3,249900
1239,3,229900
2132,4,345000
4215,4,549000
2162,4,287000
1664,2,368500
2238,3,329900
2567,4,314000
1200,3,299000
852,2,179900
1852,4,299900
1203,3,239500