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