【发布时间】:2015-05-06 09:05:48
【问题描述】:
Sooooo ...事实证明,从 fake matrices 到 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
Edward Kmett 和 Dominic Steinitz 之间的相关电子邮件对话:https://mail.haskell.org/pipermail/haskell-cafe/2013-April/107561.html
【问题讨论】:
标签: haskell automatic-differentiation hmatrix