Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何在hmatrix上进行自动微分?_Haskell_Automatic Differentiation_Hmatrix - Fatal编程技术网

Haskell 如何在hmatrix上进行自动微分?

Haskell 如何在hmatrix上进行自动微分?,haskell,automatic-differentiation,hmatrix,Haskell,Automatic Differentiation,Hmatrix,好极了。。。事实证明,从tohmatrix数据类型非常重要:) 序言供参考: {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ParallelListComp #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE FlexibleContexts #-} import Numeric.LinearAlgebra.HMatrix

好极了。。。事实证明,从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)
编辑:这不是原始问题中的代码,而是尽可能简化的代码。GHC要求对
go
子功能进行一些限制,但链接问题中提出的答案不适用于此处

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


我开始相信这是办不到的<代码>矩阵要求其元素位于
元素
类中。仅有的元素有
Double
Float
及其
复合形式。
梯度下降
不接受所有这些

因此,基本上这与上面链接的问题相同,但是对于
hmatrix
数据类型,而不是我手工编写的数据类型

edit3


Edward Kmett和Dominic Steinitz之间关于以下主题的相关电子邮件对话:

我发现这一系列博客文章非常有用: (演示了具有静态大小保证的HMatrix和AD的
雅可比函数)


哦。。。是的。。。那个人在我的阅读队列中爬了好几次。。。尽管如此,我从未有过工作的毅力。我想现在是时候了。昨天晚上我试着解决它。。。现在我想起来为什么我从来没有经历过。。。对于一个没有机器学习背景的人来说,这是一个很难理解的东西(我应该有……但仍然如此)。也许你可以从上面的例子中总结出最小的(非)工作示例,去掉希腊字母,给函数取一些更具表现力的名称?另外,在adEq5H的定义中去掉
go
的签名怎么样?还有,为什么你们对方程有两种定义?我恐怕不能接受这个答案。Dominic正在使用(实验性)静态接口来
hmatrix
。我也想这么做,但它甚至没有提供一个
scale
功能关于你的问题:我可以再把它归结一些。我喜欢希腊字母。函数名是垃圾,但两者(希腊字母和函数名)都指的是我试图实现的一篇论文。我无法去掉
go
…的签名。。。在相关问题中,这是绝对必要的。和
eqsH
。。。哎呀。。。其中一个是导数,我开始相信这是不可能的<代码>矩阵
要求其元素位于
元素
类中。仅有的元素有
Double
Float
及其
复合形式。
梯度下降
不接受所有这些。
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