2010-10-13 8 views
7

Я пытаюсь сделать простую линейную функцию регрессии, но по-прежнему сталкиваются с существующей функцииЛинейная регрессия с Python Numpy

numpy.linalg.linalg.LinAlgError: Singular matrix error

(отладочные отпечатками):

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 

Выходной сигнал на консоль с моими тестовыми данными:

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

Тогда это ошибки на линии linalg.solve. Это функция линейной регрессии учебника, и я не могу понять, почему она терпит неудачу.

Что такое сингулярная матричная ошибка?

+1

Вы также можете использовать 'np.polyfit (x, y, 1)'. – naught101

ответ

16

Как поясняется в другом ответе linalg.solve ожидает полная матрица ранга. Это происходит потому, что он пытается решить матричное уравнение, а не линейную регрессию, которая должна работать для всех рангов.

Существует несколько методов линейной регрессии. Самый простой, который я бы предложил, - это стандартный метод наименьших квадратов. Вместо этого используйте numpy.linalg.lstsq. Документация включает пример: here.

+0

Правильно, я думал о lstsq после публикации. –

8

Сингулярная матрица - это единица, для которой детерминант равен нулю. Это означает, что ваша матрица имеет строки, которые не являются линейно независимыми. Например, если одна из строк не является линейно независимой от других, то она может быть построена линейной комбинацией других строк. Я продемонстрирую пример linalg.solve от numpy. Вот пример ДИЗКНЫЙ:

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

Теперь я изменю a, чтобы сделать его единственным число.

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

Это очень очевидный пример, потому что первая строка всего лишь удваивает вторую строку, но, надеюсь, вы получите эту точку.

Смежные вопросы