如何在hmatrix上自动区分?

fho*_*fho 5 haskell automatic-differentiation hmatrix

Sooooo ......因为事实证明从伪矩阵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)
Run Code Online (Sandbox Code Playgroud)

并调用该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
Run Code Online (Sandbox Code Playgroud)

编辑:这不是原始问题中的代码,但尽可能地降低.GHC需要go对子功能有一些限制,但链接问题中提出的答案在这里不适用.

edit2,从下面引用自己:

我开始相信它无法完成.Matrix要求它的元素在Element课堂上.唯一的元素Double,Float以及它们的Complex形式.所有这些都不被接受gradientDescent.

所以基本上这与上面链接的问题相同,但对于hmatrix数据类型而不是我的手动数据类型.

EDIT3

Edward Kmett和Dominic Steinitz之间关于这个主题的相关电子邮件对话:https://mail.haskell.org/pipermail/haskell-cafe/2013-April/107561.html

ocr*_*amz 1

我发现这一系列的博客文章非常有帮助: https://idontgetoutmuch.wordpress.com/2014/09/09/fun-with-extended-kalman-filters-4/ (具有静态大小保证的 HMatrix 和jacobian函数来自 AD 的演示)。

华泰