Du er ikke logget inn. Så lenge du ikke er logget inn går du glipp av muligheten for å holde styr på din egen progresjon.

Logg inn

Valgte tags:

Filtrering:

Skriv ut:

Lineær regresjon: Fra bunn av! (Utfordringsoppgave)

I denne oppgaven skal du implementere en least square error regresjonslinje matematisk. Å regne ut regresjonslinjer for hånd eller å implementere dem fra bunn av er strengt tatt ikke pensum, men kan være nyttig for å lære litt mer om lineær regresjon

Du kan lese mer her

OBS! I lenka over bruker de litt annen notasjon. De skriver "b" for vektene, og "a" for skjæringspunktet.

Selv om lineær regresjon kan estimeres, så kan også linær regresjon, i motsetning til logistisk regresjon, lett estimeres matematisk. For å gjøre det må vi utnytte to ting vi vet om regresjonslinja:

1) Formelen y = w1x1 + w2x2 + .... + b
2) Faktum at regresjonslinjen alltid går gjennom gjennomsnittet for y og alle x-variablene.

Vi kan derfor dele opp oppgaven i to deler:

1) Finne vektene og gjennomsnittene for alle klassene
2) Sette den ukjente b først, og finne b = y-gjennomsnitt - w1x2-gjennomsnitt + w2x2-gjennomsnitt etc.

Oppgave 1
Skriv en funksjon som takler et vilkårlig antall forklaringsvariabler (x) og som returnerer en funksjon som tar inn forklaringsvariablene og returnerer y-verdien. Den bør starte som noe som dette:

def regresjon(y,x_liste):
    ...
    ...
    return lambda x1,x2,xn... : 

Formelen for å finne en vekt w gitt en rekke verdier finner du på siden over, men gjentas her i noe dårligere skrevet form:

w = sum((x - avg(x)) × (y - avg(y))) / sum(x - x)2

...hvor avg(x) er gjennomsnittet for den x-variabelen, og avg(y) er gjennomsnittet for responsvariabelen y.

Oppgave 2
Denne deloppgaven mangler løsningsforslag enn så lenge, men kan være morsom å gjøre.

Bruk funksjonen fra oppgave 1 og lag en klasse Linear_regression som har to metoder: fit() og predict(). Fit skal ta inn samme type variabler som i oppgave 1, eller eventuelt en Pandas-dataramme på samme måte som sklearn. Husk å skille mellom responsvariablene (y) og forklaringsvariablene(x). Predict skal ta inn en liste med x-argumenter og returnere en predikert y-verdi.

Vis løsningsforslag
# eksempler til bruk
X = [6,10,2,4,6,7,0,1,8,5,3]
Y = [82,88,56,64,77,92,23,41,80,59,47]

def w_b(X_list,Y):
    # x er ei liste med lister med forklaringsvariabler
    # y er ei liste responsvariabler
    x_bars = []
    weights = []
    for li in X_list:
        x_bar = sum(li)/len(li)
        x_bars.append(x_bar)

    y_bar = sum(Y)/len(Y)
    #regner ut vektene
    for num,li in enumerate(X_list):
        teller = 0
        for x,y in zip(li,Y):
            teller += (x - x_bar) * (y - y_bar)    
        nevner = sum([(x - x_bar)**2 for x in li])
        w = teller/nevner
        weights.append(w)
    print("weights=",weights)
    #calculate the intercept
    #y_bar = b + w * x_bar
    #several explanatory variables:
    #y_bar = b + w1x_bar1 + w2x_bar2 ....
    b = y_bar - sum(w*x_bar for w,x_bar in zip(weights,x_bars))
    print("b=",b)
    #return teller/nevner
    #return lambda x:x*w + b

print(w_b([X,X,X],Y))