2010-10-13 21 views
7

Próbuję zrobić prostą funkcję regresji liniowej ale nadal napotykająregresji liniowej z Pythonem NumPy

numpy.linalg.linalg.LinAlgError: Singular matrix error

istniejącą funkcję (z nadrukami debugowania):

def makeLLS(inputData, targetData): 
    print "In makeLLS:" 
    print " Shape inputData:",inputData.shape 
    print " Shape targetData:",targetData.shape 
    term1 = np.dot(inputData.T, inputData) 
    term2 = np.dot(inputData.T, targetData) 
    print " Shape term1:",term1.shape 
    print " Shape term2:",term2.shape 
    #print term1 
    #print term2 
    result = np.linalg.solve(term1, term2) 
    return result 

wyjścia do konsola z moimi danymi testowymi to:

In makeLLS: 
    Shape trainInput1: (773, 10) 
    Shape trainTargetData: (773, 1) 
    Shape term1: (10, 10) 
    Shape term2: (10, 1) 

Następnie błędy w linii linalg.solve. Jest to podręcznikowa funkcja regresji liniowej i nie mogę się domyślić, dlaczego to się nie udaje.

Jaki jest pojedynczy błąd macierzy?

+1

Można również użyć 'np.polyfit (x, y, 1)'. – naught101

Odpowiedz

16

Jak wyjaśniono w drugiej odpowiedzi linalg.solve oczekuje macierzy pełnej rangi. Dzieje się tak, ponieważ próbuje rozwiązać równanie macierzowe, a nie regresję liniową, która powinna działać dla wszystkich rang.

Istnieje kilka metod regresji liniowej. Najprostszy, jaki sugerowałbym, to standardowa metoda najmniejszych kwadratów. Po prostu użyj zamiast tego numpy.linalg.lstsq. Dokumentacja obejmująca przykład to here.

+0

Całkiem dobrze, myślałem o lstsq po tym, jak napisałem. –

8

Pojedyncza macierz to taka, dla której wyznacznikiem jest zero. Oznacza to, że macierz ma wiersze, które nie są liniowo niezależne. Na przykład, jeśli jeden z wierszy nie jest liniowo niezależny od innych, wówczas można go skonstruować za pomocą liniowej kombinacji innych wierszy. Użyję przykładu numinal's linalg.solve do zademonstrowania. Oto przykład doc za:

>>> import numpy as np 
>>> a = np.array([[3,1], [1,2]]) 
>>> b = np.array([9,8]) 
>>> x = np.linalg.solve(a, b) 
>>> x 
array([ 2., 3.]) 

Teraz będę zmieniać a aby pojedynczej.

>>> a = np.array([[2,4], [1,2]]) 
>>> x = np.linalg.solve(a, b) 
... 
LinAlgError: Singular matrix 

To bardzo oczywistym przykładem, ponieważ pierwszy wiersz jest po prostu podwoić drugi rząd, ale mam nadzieję, że masz rację.

Powiązane problemy