Линейная регрессия с Python numpy

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

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

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

2 ответов


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

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


сингулярная матрица, для которой определитель равен нулю. Это означает, что ваша матрица имеет строки, которые не являются линейно независимыми. Например, если одна из строк не линейно независима от других, то она может быть построена линейной комбинацией других строк. Я буду использовать linalg и NumPy это.решите пример, чтобы продемонстрировать. Вот пример 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.])

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

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

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