Я пытаюсь решить проблему матричного исчисления с помощью 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()
, который, к сожалению, не определен в этом случае.