Wielowymiarowa regresja liniowa w Pythonie

10

Szukam pakietu Python, który implementuje regresję liniową na wielu odmianach.

(Uwaga terminologiczna: regresja wielowymiarowa dotyczy przypadku, w którym występuje więcej niż jedna zmienna zależna, podczas gdy regresja wielokrotna dotyczy przypadku, w którym istnieje jedna zmienna zależna, ale więcej niż jedna zmienna niezależna.)

Franck Dernoncourt
źródło
Interesuje mnie również to, ale chcę tylko wektora cech po transformacji nieliniowej. Tak byłoby w rzędzie[1,x1,x2),x1x2),x12),x2)2)]powiedzmy o modelu stopnia 2 z 2 zmiennymi.
Pinokio

Odpowiedzi:

9

Nadal możesz używać sklearn.linear_model.LinearRegression . Po prostu utwórz dane wyjściowe yjako macierz z tyloma kolumnami, ile zmiennych zależnych. Jeśli chcesz czegoś nieliniowego , możesz wypróbować różne funkcje podstawowe, użyć funkcji wielomianowych lub użyć innej metody regresji (np. NN).

jamesmf
źródło
1
Czy pytasz konkretnie o wielowymiarową regresję logistyczną? Czy chcesz przeprowadzić wiele klasyfikacji jednocześnie? Z pewnością zastosowano wielowymiarową regresję liniową . Aby skorzystać z biblioteki sklearn, regresja logistyczna musiałaby zostać inaczej sformułowana.
jamesmf
Ups, przepraszam, że źle przeczytałem, czytałem dokumentację sklearn.linear_model.LogisticRegression myśląc o regresji liniowej. Usunę mój komentarz, aby uniknąć mylących przyszłych czytelników. Dzięki!
Franck Dernoncourt
szkoda, że ​​nie podkreśliłeś, jak uzyskać wektor funkcji wielomianowej ...
Pinokio
2

Dla zabawy możesz obliczyć tę funkcję ręcznie, tworząc krotki smiq=(re1,...,reN.) takie, że S.um(smiq)=ja=1N.re. Po utworzeniu krotek każdy wpis wskazuje moc, o którą powinna podnieść obecna funkcja raw. Tak powiedz(1,2),3)) odwzorowałby na monomial x1x2)2)x3)3).

Kod, aby uzyskać krotki to:

def generate_all_tuples_for_monomials(N,D):
    if D == 0:
        seq0 = N*[0]
        sequences_degree_0 = [seq0]
        S_0 = {0:sequences_degree_0}
        return S_0
    else:
        # S_all = [ k->S_D ] ~ [ k->[seq0,...,seqK]]
        S_all = generate_all_tuples_for_monomials(N,D-1)# S^* = (S^*_D-1) U S_D
        print(S_all)
        #
        S_D_current = []
        # for every prev set of degree tuples
        #for d in range(len(S_all.items())): # d \in [0,...,D_current]
        d = D-1
        d_new = D - d # get new valid degree number
        # for each sequences, create the new valid degree tuple
        S_all_seq_for_deg_d = S_all[d]
        for seq in S_all[d]:
            for pos in range(N):
                seq_new = seq[:]
                seq_new[pos] = seq_new[pos] + d_new # seq elements dd to D
                if seq_new not in S_D_current:
                    S_D_current.append(seq_new)
        S_all[D] = S_D_current
        return S_all

to powinna być łatwa regresja, jeśli znasz algebrę liniową.

c = pseudo_inverse(X_poly)*y

przykład. Prawdopodobnie lepiej zrobić regularną regresję liniową, jeśli jesteś zainteresowany uogólnieniem.


Podziękowania dla Yuval to wymiana CS na pomoc.

Pinokio
źródło