Линейная регрессия с Python NumPy - PullRequest
7 голосов
/ 13 октября 2010

Я пытаюсь создать простую функцию линейной регрессии, но продолжаю сталкиваться с

numpy.linalg.linalg.LinAlgError: Сингулярная матричная ошибка

Существующая функция (с отладочными отпечатками):

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. Это учебная функция линейной регрессии, и я не могу понять, почему она не работает.

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

Ответы [ 2 ]

17 голосов
/ 13 октября 2010

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

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

8 голосов
/ 13 октября 2010

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

>>> 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

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

...