如何对hmatrix进行自动微分?

2023-11-26

Sooooo ...事实证明从假矩阵 to 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

edit:这不是原始问题中的代码,而是尽可能地简化。 GHC 要求对go子功能,但链接问题中提出的答案不适用于此处。

edit2,从下面引用我自己的话:

我开始相信这是不可能的。Matrix要求它的元素位于Element班级。唯一的元素有Double, Float和他们的Complex形式。所有这些都不被接受gradientDescent.

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

edit3

爱德华·克梅特和多米尼克·斯坦尼茨之间关于该主题的相关电子邮件对话:https://mail.haskell.org/pipermail/haskell-cafe/2013-April/107561.html


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

HTH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对hmatrix进行自动微分? 的相关文章

随机推荐