2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
lineaarinen regressio: Rajoitetuissa tiedoissa parametreja säätämällä sovitetaan suora viiva, ja tätä suoraa (mallia) käytetään kokeiden suorittamiseen tuntemattomilla tiedoilla.ennustaa。
Suoraanyleinen muoto:
y = w × x + x = w kertaa x + by=w×x+b
Koko suoran tila on annettu kaavalla w ja bw ja bwjabPäättää, wwwmääritä suorakaltevuus(eli kallistuskulma), bbbMääritä Y-akselin suorasiepata(Hallitse suoran käännöksen ylös- ja alaspäin, joka tunnetaan myös nimelläpuolueellisuus ).Siksi meidän tarvitsee vain laskea wwwja bbbArvo voi määrittää tietyn suoran Seuraavaksi tutkimme kuinka löytää wwwja bbb。
erisnimi
substantiivi | Määritelmä |
---|---|
Harjoitussetti | Mallin kouluttamiseen käytetty tietojoukko |
testisarja | Mallin laadun testaamiseen käytetty tietojoukko |
Koulutusnäyte/koulutuspiste (koulutusnäyte) | Jokainen harjoitussarjan tieto |
ominaisuudet | Malliin syötettävät tiedot voivat olla numeerisia arvoja, luokkatunnisteita, kuvan pikseliarvoja jne. |
Label | Mallin on ennakoitava tavoitearvo. Luokitteluongelmissa tunniste on yleensä luokan nimi regressio-ongelmissa, etiketti on jatkuva arvo. |
Tutkitaan ensin yksimuuttuja lineaarista regressiota. Niin sanottu yksimuuttuja lineaariregressio viittaa lineaariseen funktioon, jossa on vain yksi riippumaton muuttuja, kuten y = w ⋅ x + by = wcdot x +by=w⋅x+bTuo onYksimuuttuja suora, sisältää vain yhden syöttömuuttujan xxx . Tämä suora voidaan ilmaista kaksiulotteisella tasolla (vaaka-akseli on X ja pystyakseli on Y).
Kun saamme joukon jakamattomia tietoja, jaamme tiedot yleensä harjoitusjoukoksi ja testijoukoksi Yksinkertainen jakomenetelmä on: ota ensimmäiset 80 % näytteistä harjoitusjoukoksi ja loput 20 %. testisarja.
Oletetaan, että olemme havainneet wwwja bbb, niin olemme määrittäneet suoran ja voimme käyttää tätä suoraa ennusteiden tekemiseen helpottaaksemme ennustamamme arvon arviointiay'todellisella arvollayvälillävirheKuinka paljon, haluamme määrittää *"viivaimen"*, jota käytetään mittaamaan ennustettu arvo y'y'y′todellisella arvolla vvy virhe välillä.Täällä käytämmekeskimääräinen neliövirhemääritelläkustannustoiminto:
J ( w , b ) = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = murto{1}{2m}sumlimits_{i = 1}^m(f_{w,b}(x^{(i)}) - y^{(i)})^2J(w,b)=2m1i=1∑m(fw,b(x(i))−y(i))2
Kaavan purkaminen:
fw , b ( x ( i ) ) − y ( i ) f_{w,b}(x^{(i)}) - y^{(i)}fw,b(x(i))−y(i):sisään fw , b ( x ( i ) ) f_{w,b}(x^{(i)})fw,b(x(i))edustaa arvoa, joka on ennustettu käyttämällä koulutettua mallia, while y (i) y^{(i)}y(i)edustaa kunkin harjoitusnäytteen todellista tulosta, ja näiden kahden välinen ero edustaa mallin ennustaman arvon ja todellisen arvon välistä virhettä.
Miksi virhe tasoittaa?
Kaikissa näytejoukkoissa jokainen virhe voi olla positiivinen tai negatiivinen, ja summausprosessin aikana on tietty poikkeaman todennäköisyys. Tämä johtaa siihen, että kunkin kohteen virhe on erittäin suuri (kuten: -100, + 90, -25, +30), summauksen jälkeen saadaan pieni arvo (-5) ja lopulta saadaan väärä tuomio.
1 2 m frac{1}{2m}2m1: Edustaa kaikkien datavirheiden summan keskiarvoa (tämä keskiarvo voi edustaa tietyssä mielessä koko mallin virhettä) ja saa keskimääräisen neliövirheen.
Miksi jakaa kahdella?
Koska kun gradientti laskee myöhemmin, johtaminen jakaa indeksin 2 kertoimiin, koska suurella datamäärällä vakiolla on vain vähän vaikutusta malliin. , myöhempää kompensaatiota varten.
Kun tiedämme kustannusfunktion, meidän tarvitsee vain löytää tapoja vähentää kustannuksia, sitä lähempänä ennustettu arvomme on todellista arvoa.
Tarkkailemalla virhekustannusfunktiota voimme nähdä, että virhekustannusfunktio on neliöfunktio, elikupera funktio, konveksin funktion ominaisuus on:Ääripiste on maksimipiste , koska kustannusfunktio on neliöfunktio, joka avautuu ylöspäin (kaavaa voidaan laajentaa ja voit intuitiivisesti tuntea neliötermin kertoimen olevan suurempi kuin 0), joten kuperalla funktiolla on vain minimiarvo, ja me vain täytyy löytää Minimiarvo on pienin arvo.Virhekustannustoiminnolle J ( w , b ) J(w, b)J(w,b) , sen kaavan laajennus voidaan kirjoittaa seuraavasti:
J ( w , b ) = 1 2 m ∑ i = 1 m ( ( wx ( i ) + b ) − y ( i ) ) 2 J(w,b) = murto{1}{2m}huippurajat_{i = 1 }^m((wx^{(i)}+b) - y^{(i)})^2J(w,b)=2m1i=1∑m((wx(i)+b)−y(i))2
JJJKoko riippuu parametreista wwwja bbb, joka voidaan ratkaista gradienttilaskulla Kustannusfunktion muoto on suunnilleen seuraava:
Ajatus gradienttilaskeutumisesta kulkee pääasiassaEtsi osittaisderivaatamenetelmä, joka liittyy biologiseenohjausmuuttujatMenetelmä on hyvin samanlainen, kuten: ohjauksessa bbbPäivitä ilman muutoksia www(Näkyy bbbon vakio), kaava: w ′ = w − α ∂ J ( w ) ∂ ww' = w - alpha frac{osittais J(w)}{osittais w}w′=w−α∂w∂J(w) Osoittaa, että se on päivitetty järjestyksessä www,sisään α alfaα edustaaoppimisaste Käytetään edustamaan askelkokoa, joka voidaan ymmärtää myös laskeutumisnopeudeksi, ∂ J ( w ) ∂ w murto{osittais J(w)}{osittais w}∂w∂J(w) ilmaisee oikein wwwEtsimällä osittaista johdannaista saamme W - JW - JW−J(PainotWja hintaJfunktio) Tangenttiviiva kuperalla funktiolla, jota käytetään edustamaan nopeimmin laskevaa funktion arvoasuunta, näiden kahden tulo edustaaSiirry yksi askel siihen suuntaan, jossa funktion arvo pienenee nopeimmin .Tämä etäisyys on säädettävä tietojoukon mukaan α alfaαJos se on liian suuri (askelkoko on liian suuri), se johtaa wwwmenee suoraan alimman pisteen yli toisella puolella olevaan korkeaan pisteeseen niin, ettei se koskaan pääse lähelle minimiä, jos α alfaαJos se on liian pieni (askelkoko on liian pieni), se johtaa wwwSe hidastuu ja hidastuu, kun se lähestyy minimiä, mikä kuluttaa laskentakustannuksia.
oppimisnopeus ( α alfaα) säätömenetelmä:
Aseta ensin pienempi α alfaα Esimerkiksi: 0,001.
Sitten se kasvaa 10 kertaa joka kerta, enintään 1.
Tietyn arvon määrittämisen jälkeen, kuten: 0,01.
Suorita sitten käsittely 3 kertaa, kuten: 0,01 × 3 = 0,03 , 0,03 × 3 = 0,09 0,01 kertaa 3 = 0,03 , 0,03 kertaa 3 = 0,090.01×3=0.03,0.03×3=0.09 (Tämän tarkoituksena on nopeuttaa lähentymistä).
Prosessi osittaisten derivaattojen ratkaisemiseksi (gradientin laskeutumissuunnan löytäminen):
kerjätä ∂ J ( w ) ∂ w murto{osittais J(w)}{osittais w}∂w∂J(w) :
∂ J ( w ) ∂ w murto{osittais J(w)}{osittais w}∂w∂J(w) = ∂ ∂ w 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 murto-osaa {osittainen w}frac{1}{2m}sumlimits_{i = 1}^ {m}(f_{w,b}(x^{(i)}) - y^{(i)})^2∂w∂2m1i=1∑m(fw,b(x(i))−y(i))2
= ∂ ∂ w 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 murto-osa{osittainen w}frac{1}{2m}sumlimits_{i = 1}^{m}wx^{( i)} - y^{(i)})^2∂w∂2m1i=1∑mwx(i)−y(i))2
= 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 x ( i ) frac{1}{2m}sumlimits_{i = 1}^{m}(f_{ w,b}(x^{(i)}) - y^{(i)})cdot2x^{(i)}2m1i=1∑m(fw,b(x(i))−y(i))⋅2x(i)
= 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) x ( i ) murto{1}{m}sumlimits_{i = 1}^{m}(f_{w,b }(x^{(i)}) - y^{(i)})x^{(i)}m1i=1∑m(fw,b(x(i))−y(i))x(i)
kerjätä ∂ J ( w ) ∂ b murto{osittais J(w)}{osittais b}∂b∂J(w) :
∂ J ( w ) ∂ b murto{osittais J(w)}{osittais b}∂b∂J(w) = ∂ ∂ b 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 frac{osittais}{osittais b}frac{1}{2m}sumlimits_{i = 1}^ {m}(f_{w,b}(x^{(i)}) - y^{(i)})^2∂b∂2m1i=1∑m(fw,b(x(i))−y(i))2
= ∂ ∂ b 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 murto-osaa}{osittais b}frac{1}{2m}sumlimits_{i = 1}^{m}wx^{( i)} - y^{(i)})^2∂b∂2m1i=1∑mwx(i)−y(i))2
= 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 frac{1}{2m}sumlimits_{i = 1}^{m}(f_{w,b} (x^{(i)}) - y^{(i)})cdot22m1i=1∑m(fw,b(x(i))−y(i))⋅2
= 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) frac{1}{m}sumlimits_{i = 1}^{m}(f_{w,b}(x^) {(i)}) - y^{(i)})m1i=1∑m(fw,b(x(i))−y(i))
Etsi tiettyjä silmukkaiteroinnin avulla wwwarvo kanssa bbbarvo:
while ( ) : while():wHeile():
w ∗ = w − α ∂ ∂ w J ( w , b ) w^* = w - alfa murto{osittainen}{osittais w}J(w,b)w∗=w−α∂w∂J(w,b)
b ∗ = b − α ∂ ∂ b J ( w , b ) b^* = b - alpha frac{osittais}{osittais b}J(w,b)b∗=b−α∂b∂J(w,b)
w = w ∗ w = w^*w=w∗
b = b ∗ b = b^*b=b∗
Alussa arvotaan satunnaisesti w ja b, ja sitten iteroidaan. Voimme asettaa gradientin laskeutumisen poistumaan, kun virhe on pienempi kuin tietty kynnys, tai mukauttaa iteraatioiden määrää rajoitetuilla vaiheilla wwwarvon summa bbbarvo.
Monimuuttuva lineaarinen regressio laajentaa mitat kolmeen ulottuvuuteen ja jopa moniulotteisiin tiloihin, kuten esim. y = l 1 x 1 + le 2 x 2 + by = w_1 x_1 + l_2 x_2 + by=w1x1+w2x2+b voidaan ymmärtääXAkseli jaYAkselit ovat x 1 ja x 2 x_1 ja x_2x1jax2 ZAkseli on vvy, tämä on kolmiulotteinen tila. Jokainen harjoitusnäyte on piste kolmiulotteisessa avaruudessa. On tarpeen löytää sopiva suora sopimaan näytepiste kolmiulotteiseen avaruuteen.
Menetelmä: Jokaiselle muuttujalle erikseen ( w 1 , w 2 , … , wn , b w_1,w_2,pisteet,w_n,bw1,w2,…,wn,b) gradienttilaskujen käsittelyyn
Pääasiat: Monimuuttujaisessa lineaarisessa regressiossa eri piirrearvojen arvoalueet ovat erilaisia, kuten: ikäpiirteen arvoalue: 0 0 0 ~ 100 100 100, peittoalue: 0 m 2 0 m^20m2 ~ 10000 m 2 10000m^210000m2 , voi myös ollaOuto näyteYksittäisen näytedatan olemassaolo aiheuttaa harjoitusajan pidentymisen ja voi myös johtaa epäonnistumiseen konvergoinnissa. Siksi, kun on yksittäisiä näytetietoja, data on esikäsiteltävä ennen harjoittelua.Normalisoitu Päinvastoin, kun yksittäisiä näytetietoja ei ole, normalisointia ei tarvitse suorittaa.Tämän ongelman ratkaisemiseksi meidän on suoritettavaOminaisuudet skaalataan (normalisoitu)。
Tietojen normalisoinnin käsittely
saavuttaaTietojen normalisointiMenetelmiä on kolme:
Sama kuin jakamalla enimmäisarvolla:
Jokaisen ominaisuuden kaikki arvot jaetaan ominaisuuden enimmäisarvolla.
Keskimääräinen normalisointi:
Vähennä kunkin ominaisuuden arvo kyseisen ominaisuuden arvostatarkoittaaja jaettuna sitten ominaisuuden enimmäis- ja vähimmäisarvon erolla.
Z-pisteiden normalisointi:
Laske jokainen ominaisuuskeskihajontajatarkoittaa
Vähennä kunkin ominaisuuden arvo kaikista ominaisuuden arvoistakeskiarvoja jaettuna ominaisuuden arvollatarkoittaa
Jos normalisointia ei suoriteta, kustannusfunktio muuttuu johtuen suurista eroista piirrevektorin eri ominaisuuksien arvoissa. "tasainen" .Tällä tavalla gradienttilaskua suoritettaessa gradientin suunta poikkeaa minimiarvon suunnasta ja menee paljonkiertotie, mikä tekee harjoittelusta liian pitkän.
Normalisoinnin jälkeen tavoitefunktio näyttää vertailun "pyöristää", jotta harjoitusnopeus nopeutuu huomattavasti ja vältytään monilta kiertoteiltä.
Tietojen normalisoinnin edut:
J ( w , b ) = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = murto{1}{2m}sumlimits_{i = 1}^m(f_{w,b}(x^{(i)}) - y^{(i)})^2J(w,b)=2m1i=1∑m(fw,b(x(i))−y(i))2
Gradienttilasku moninkertaiselle lineaariselle regressiolle:
w 1 = W 1 − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) x 1 ( i ) w_1 = W_1 - alfa frac{1}{m}sumlimits_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_1^{(i)}w1=W1−αm1i=1∑m(fw,bx(i)−y(i))x1(i)
⋮ vdots⋮
wn = W n − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) xn ( i ) w_n = W_n - alfa frac{1}{m}sumlimits_{i = 1} ^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_n^{(i)}wn=Wn−αm1i=1∑m(fw,bx(i)−y(i))xn(i)
b = b − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) b = b - alfa frac{1}{m}sumlimits_{i = 1}^{m}( f_{vec{w},b}vec{x}^{(i)} - y^{(i)})b=b−αm1i=1∑m(fw,bx(i)−y(i))
selittää: w 1 ⋯ wn w_1cdots w_nw1⋯wn edustaa kunkin muuttujan kerrointa ja b edustaa lineaarisen funktion vakiotermiä.
Jättää pois...
Matemaattinen johtaminen:
J = 1 2 m ∑ i = 1 m ( θ ⃗ ix ⃗ i − yi ) 2 J = murto{1}{2m}sumlimits_{i = 1}^{m}(vec{theta}_i vec{x}_i - y_i)^2J=2m1i=1∑m(θixi−yi)2
= 1 2 m ∣ ∣ θ ⃗ x ⃗ − y ∣ ∣ 2 frac{1}{2m}||vec{theta} vec{x} - y||^22m1∣∣θx−y∣∣2
= 1 2 m ( θ ⃗ x ⃗ − y ) T ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{theta} vec{x} - y)^T(vec{theta} vec{x} - y)2m1(θx−y)T(θx−y)
= 1 2 m ( θ ⃗ T x ⃗ T − y T ) ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{theta}^T vec{x}^T - y^T)(vec{ theta} vec{x} - y)2m1(θTxT−yT)(θx−y)
= 1 2 m ( θ ⃗ T x ⃗ T x ⃗ θ ⃗ − y T x ⃗ θ ⃗ − θ ⃗ T x ⃗ T y + y T y ) frac{1}{2m}(vec{theta}^T vec{ x}^Tvec{x}vec{theta} - y^Tvec{x}vec{theta} -vec{theta}^Tvec{x}^Ty +y^Ty )2m1(θTxTxθ−yTxθ−θTxTy+yTy)
oikein θ thetaθEtsi osittainen derivaatta: Δ = ∂ J ∂ θ = 1 2 m ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ T ∂ θ − ∂ T ∂ θ − ∂ θ y + ∂ θ ) Delta =murto frac{osittainen y^Tvec{x}vec{theta}}{osittainen theta} - frac{osittainen vec{theta}^Tvec{x}^Ty}{osittainen theta} + frac{y^Ty}{partial theta})Δ=∂θ∂J=2m1(∂θ∂θTxTxθ−∂θ∂yTxθ−∂θ∂θTxTy+∂θyTy)
Matriisin johtamissääntö:
∂ θ TA θ ∂ θ = ( A + AT ) θ murto∂θ∂θTAθ=(A+AT)θ
∂ XTA ∂ X = A murto{osittainen X^{T}A}{osittainen X} = A∂X∂XTA=A
∂ AX ∂ X = AT murto{osittainen AX}{osittainen X} = A^T∂X∂AX=AT
∂ A ∂ X = 0 murto-osa{osittainen A}{osittainen X} = 0∂X∂A=0
Saatavilla Δ = 1 2 m ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ ∂ θ − ∂ θ ⃗ T x T θ y) =1 θ y + y) m ⋅ ( 2 x T x θ − 2 x T y ) = 1 m ⋅ ( x T x θ − x T y ) Delta = murto{1}{2m}(frac{osittainen ve{theta}^T vec{x }^Tvec{x}vec{theta}}{osittainen theta} - frac{osittainen y^Tvec{x}vec{theta}}{osittainen theta} - frac{osittainen vec{theta}^Tvec{x}^Ty} {osittainen theta} + frac{y^Ty}{partial theta}) = frac{1}{2m}cdot (2x^Txtheta - 2x^Ty) = frac{1}{m} cdot (x^Txtheta - x^ Ty)Δ=2m1(∂θ∂θTxTxθ−∂θ∂yTxθ−∂θ∂θTxTy+∂θyTy)=2m1⋅(2xTxθ−2xTy)=m1⋅(xTxθ−xTy)
kun Δ = 0 Delta = 0Δ=0 tunnin: x T x θ = x T yx^Tx theta = x^TyxTxθ=xTy , θ = ( x T x ) − 1 x T y theta = (x^Tx)^{-1}x^Tyθ=(xTx)−1xTy voidaan laskea θ thetaθ arvo.
Gradientin laskeutumisen ja normaaliyhtälöiden vertailu:
gradienttilasku: On tarpeen valita oppimisnopeus α, joka vaatii useita iteraatioita. Sitä voidaan myös paremmin soveltaa, kun ominaisuuksia n on suuri, ja se sopii erilaisiin malleihin.
normaali yhtälö: Oppimisnopeutta α ei tarvitse valita. Se lasketaan kerran ja se on laskettava. ( x T x ) − 1 (x^Tx)^{-1}(xTx)−1 , jos ominaisuuksien määrä nnnJos se on suurempi, operaatiokustannukset ovat korkeammat, koska matriisikäänteisen laskenta-ajan monimutkaisuus on O (n 3 ) O (n^3)O(n3) , yleensä kun nnnSe on edelleen hyväksyttävää, kun se on alle 10 000.Saatavilla vain lineaarisille malleille, ei sovellu muihin malleihin, kuten logistisiin regressiomalleihin.
Koska joissain tapauksissa suorien viivojen on vaikea sovittaa kaikki tiedot, datan sovittamiseksi tarvitaan käyriä, kuten neliömalleja, kuutiomalleja jne.
Yleisesti ottaen datan regressiofunktio on tuntematon Vaikka se on tiedossa, sitä on vaikea muuttaa lineaariseksi malliksi yksinkertaisella funktiomuunnoksella, joten yleinen lähestymistapa on.polynomiregressio(Polynomiaalinen regressio), eli käyttämällä polynomifunktiota datan sovittamiseksi.
Kuinka valita polynomin aste:
Polynomifunktioita on monen tyyppisiä Yleisesti ottaen sinun on ensin tarkkailtava datan muotoa ja sitten päätettävä, mitä polynomifunktiota käytetään ongelman ratkaisemiseen. Esimerkiksi datan hajontakaaviosta, jos on "mutka ", voit harkita toisen asteen polynomin käyttöä (eli ominaisuuksien neliöintiä); niitä on kaksi "mutka ", voit harkita kuutiopolynomin käyttöä (ottaen ominaisuuden kuutiotehoa); niitä on kolme "mutka ”, harkitse sitten neljännen kertaluvun polynomin käyttöä (ottaen ominaisuuden neljännen potenssin) ja niin edelleen.
Vaikka todellinen regressiofunktio ei välttämättä ole tietyn asteen polynomi, niin kauan kuin sovitus on hyvä, on mahdollista käyttää sopivaa polynomia todellisen regressiofunktion approksimoimiseksi.
Artikkelin lopussa oleva liite sisältää kaikki kokeessa käytetyt alkuperäiset tiedot.ex1data1.txt
on väestön ja voiton välinen suhde, ex1data2.txt
Se on talon koon ja makuuhuoneiden lukumäärän vaikutus talon hintaan.
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
Lisää tietojoukon ensimmäiseen sarakkeeseen 1 1 1Tehtävä onHelpottaa matriisilaskelmia, kun matriiseja kerrotaan, painot ovat mukana wwwja puolueellisuus bbb,koska bbbei kerrota muuttujalla, joten a 1 1 1, käytetty kanssa bbbKerro.
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]])
Yleiset vaiheet mallin kouluttamiseen:
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