繁体   English   中英

hmatrix向量和矩阵的Haskell数据类型

[英]Haskell data type for hmatrix Vector and Matrix

我只是从Haskell开始,我已经阅读了LYAH的定义数据类型部分,并正在尝试实现信念传播的Sum-Product算法。 一项基本任务是定义概率图形模型。

如下所示,我试图通过打结来表示一个图,其中每个节点代表一个高斯分布,并且与邻居具有恒定的权重链接(现在)。 但是,在尝试定义均值和协方差类型时,我在指定矩阵和向量类型(即浮点型或双精度型)的类型时遇到了一些困难。

module Graph(Graph) where

import Numeric.LinearAlgebra

data Mean = Mean Vector
data Covariance = Covariance Matrix
data Gaussian = Gaussian Mean Covariance

data Node = Node [Node] Gaussian
data Graph = Graph [Node]

在此简单示例中,将Mean定义为Double类型的向量并将Covariance定义为Double类型的矩阵的语法是什么。 此外,如何将其概括为MeanCovariance可以是Float或Double类型?

我目前从GHCi获得以下内容

Graph.hs:5:18: error:
    • Expecting one more argument to ‘Vector’
      Expected a type, but ‘Vector’ has kind ‘* -> *’
    • In the type ‘Vector’
      In the definition of data constructor ‘Mean’
      In the data declaration for ‘Mean’
Failed, modules loaded: none.

我正在按此处所述使用hmatrix软件包

VectorMatrix是在标量类型上参数化的(因此,您不仅可以具有浮点“实数”矩阵,而且可以具有整数,复数矩阵等)。 这就是GHC通过'Vector' has kind '* -> *'告诉您的'Vector' has kind '* -> *' :就其本身而言, Vector不是类型(类型具有kind * ,即Type )。 相反,它是一种类型的功能的映射类型种*到类型种* Double这样的标量已经是普通类型,因此您可以将Vector应用于它们。

GHCi> :kind Vector
Vector :: * -> *
GHCi> :k Double
Double :: *
GHCi> :k Vector Double
Vector Double :: *

因此,您需要

newtype Mean = Mean (Vector Double)
newtype Covariance = Covariance (Matrix Double)

newtype与此处的data具有相同的作用,但是效率更高,因为不需要额外的框/指针)。

或者,您可以使用更有意义类型的向量空间,例如

import Math.LinearMap.Category

newtype Mean v = Mean v
newtype Covariance v = Covariance (v +> DualVector v)

这样做的好处是可以在编译时检查尺寸,从而避免了讨厌的运行时错误(并且原则上还可以提高性能,尽管坦率地说, linearmap-category库尚未进行任何优化)。

然后,您还要在向量空间上设置其他类型的参数:

data Gaußian v = Gaußian (Mean v) (Covariance v)
data Node v = Node [Node v] (Gaussian v)
data Graph v = Graph [Node v]

某种程度上与您的问题无关:这种打结的感觉确实很优雅,但这并不是表示图形的真正合适方法,因为无法对节点进行身份检查。 对于所有可区分的方式,图中的任何循环都会导致一个无限的结构。 在实践中,您不会无所事事地给节点(例如Int标签)并为边缘保留单独的结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM