пример регрессии симпй, решить после частной производной - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь решить проблему матричного исчисления с помощью sympy и застреваю в решателе после дифференцирования по вектору.

В качестве короткого примера возьмем обычную регрессию наименьших квадратов.Например, сумма квадратов разностей между целью y и прогнозом y_hat.Где прогноз y_hat = X.T * w является линейной комбинацией и, следовательно, умножением матрицы на вектор.

Поэтому мы хотим минимизировать ошибку LMS по отношению к вектору веса w.

От руки мы можем получить, что из:

Err(w) = norm(y - X.T * w)^2

следует после дифференцирования, установкав ноль и решение для w

w_opt = (X*X.T)^-1 * X * y

Как мы можем получить w_opt, используя sympy?

Мой довольно наивный подход был:

from sympy import *
# setup matrix and vectors
X = MatrixSymbol('X',3,5)
y = MatrixSymbol('y',5,1)
w = MatrixSymbol('w',3,1)

# define error function
E = (y - X.T*w).T * (y - X.T*w) 
# derivate
Edw = [E.diff(wi) for wi in w]
# solve for w
solve(Edw,w)

В solve(Edw,w) однако яполучить атрибут атрибута: у объекта 'Mul' нет атрибута 'shape'

Я также пытался установить E.as_explicit() перед дифференцированием.Это, однако, приводит к ошибке атрибута: объект 'str' не имеет атрибута 'is_Piecewise'

Я знаю, вычисляя вручную, что после деривации результат должен быть -2*X*y + 2*X*X.T*w.Вывод в Edw указан, но не выполнен.Как я могу проверить этот шаг между?Моим первым предположением был метод .doit(), который, к сожалению, не определен в этом случае.

...