2010-10-13 65 views
7

estoy tratando de hacer una función de regresión lineal simple pero seguirá encontrando una función existenteRegresión Lineal con Python numpy

numpy.linalg.linalg.LinAlgError: Singular matrix error

(con impresiones de depuración):

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 

La salida a la La consola con mis datos de prueba es:

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

Luego se produce un error en la línea linalg.solve. Esta es una función de regresión lineal de libro de texto y no puedo entender por qué está fallando.

¿Cuál es el error de matriz singular?

+1

También podría usar 'np.polyfit (x, y, 1)'. – naught101

Respuesta

16

Como se explicó en la otra respuesta, linalg.solve espera una matriz de rango completo. Esto se debe a que trata de resolver una ecuación matricial en lugar de hacer una regresión lineal que debería funcionar para todos los rangos.

Existen algunos métodos para la regresión lineal. El más simple que sugeriría es el método estándar de mínimos cuadrados. Simplemente use numpy.linalg.lstsq en su lugar. La documentación que incluye un ejemplo es here.

+0

Muy bien, estaba pensando en lstsq después de publicar. –

8

Una matriz singular es aquella para la cual el determinante es cero. Esto indica que su matriz tiene filas que no son linealmente independientes. Por ejemplo, si una de las filas no es linealmente independiente de las otras, entonces se puede construir mediante una combinación lineal de las otras filas. Usaré el ejemplo de linalg.solve de numpy para demostrar. Aquí está el ejemplo del documento:

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

Ahora, voy a cambiar a para que sea singular.

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

Este es un ejemplo muy obvio porque la primera fila es solo el doble de la segunda fila, pero espero que entiendas el punto.

Cuestiones relacionadas