Как сделать автоматическое дифференцирование на Hmatrix?

Оооочень... как выясняется переход от поддельных матриц к hmatrix типы данных оказываются нетривиальными:)

Преамбула для справки:

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ParallelListComp #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}

import           Numeric.LinearAlgebra.HMatrix
import           Numeric.AD

reconstruct :: (Container Vector a, Num (Vector a)) 
            => [a] -> [Matrix a] -> Matrix a
reconstruct as φs = sum [ a `scale` φ | a <- as | φ <- φs ]

preserveInfo :: (Container Vector a, Num (Vector a))
     => Matrix a -> [a] -> [Matrix a] -> a
preserveInfo img as φs = sumElements (errImg * errImg)
    where errImg = img - (reconstruct as φs)

И призыв к gradientDescent функция:

gradientDescentOverAs :: forall m a. (Floating a, Ord a, Num (Vector a))
                      => Matrix a -> [Matrix a] -> [a] -> [[a]]
gradientDescentOverAs img φs as0 = gradientDescent go as0
  where go as = preserveInfo img as φs

редактировать: это не код в исходном вопросе, а как можно меньше. GHC требует некоторых ограничений на go подфункция, но ответ, предложенный в связанном вопросе, здесь не применим.

edit2, цитируя себя снизу:

Я пришел к выводу, что это не может быть сделано. Matrix требует, чтобы его элементы были в Element учебный класс. Единственные элементы там Double, Float и их Complex формы. Все они не принимаются gradientDescent,

Так что в основном это тот же вопрос, что и выше, но для hmatrix типы данных вместо моих ручных.

Edit3

Соответствующий разговор по электронной почте между Эдвардом Кметтом и Домиником Стейницем на тему: https://mail.haskell.org/pipermail/haskell-cafe/2013-April/107561.html

1 ответ

Я нашел эту серию постов в блоге очень полезной: https://idontgetoutmuch.wordpress.com/2014/09/09/fun-with-extended-kalman-filters-4/(как HMatrix со статическими размерами, так и jacobian функции из AD демонстрируются).

НТН

Другие вопросы по тегам