2010-10-13 23 views
7

che sto cercando di fare una semplice funzione di regressione lineare ma continuano a incontrare una funzione esistenteregressione lineare con Python NumPy

numpy.linalg.linalg.LinAlgError: Singular matrix error

(con stampe di debug):

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 

L'uscita al console con i miei dati di test è:

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

Quindi errori nella riga linalg.solve. Questa è una funzione di regressione lineare da manuale e non riesco a capire perché non funziona.

Qual è l'errore della matrice singolare?

+1

Si potrebbe anche usare 'np.polyfit (x, y, 1)'. – naught101

risposta

16

Come spiegato nell'altra risposta, linalg.solve prevede una matrice di classificazione completa. Questo perché cerca di risolvere un'equazione di matrice piuttosto che una regressione lineare che dovrebbe funzionare per tutti i gradi.

Esistono alcuni metodi per la regressione lineare. Il più semplice che suggerirei è il metodo dei minimi quadrati standard. Basta usare numpy.linalg.lstsq invece. La documentazione che include un esempio è here.

+0

Giusto, stavo pensando a lstsq dopo che l'ho postato. –

8

Una matrice singolare è quella per cui il determinante è zero. Questo indica che la tua matrice ha righe che non sono linearmente indipendenti. Ad esempio, se una delle righe non è linearmente indipendente dalle altre, può essere costruita da una combinazione lineare delle altre righe. Userò l'esempio linalg.solve di numpy per dimostrarlo. Ecco l'esempio del doc:

>>> 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.]) 

Ora, cambierò a per renderla singolare.

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

questo è un esempio molto evidente perché la prima fila è solo il doppio della seconda fila, ma si spera che si ottiene il punto.

Problemi correlati