2015-05-06 10 views
5

Sooooo ... come si scopre che va da fake matrices a hmatrix tipi di dati si rivela essere non banale :)Come fare la differenziazione automatica su hmatrix?

Preambolo per riferimento:

{-# 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) 

E la chiamata alla funzione 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 

modifica: questo non è il codice della domanda originale, ma ridotto al minimo il più possibile. GHC richiede alcuni vincoli sulla sottofunzione go, ma la risposta proposta nella domanda collegata non si applica qui.

edit2, io citando dal basso:

vengo a credere che non può essere fatto. Matrix richiede che gli elementi siano nella classe Element. Gli unici elementi sono Double, Float e i loro moduli Complex. Tutti questi non sono accettati da gradientDescent.

Fondamentalmente questa è la stessa domanda di quella collegata sopra, ma per i tipi di dati hmatrix invece dei miei handrollati.

Edit3

Rilevante, conversazione e-mail tra Edward Kmett e Dominic Steinitz sul tema: https://mail.haskell.org/pipermail/haskell-cafe/2013-April/107561.html

risposta

1

Ho trovato questa serie di post di blog per essere molto utile: https://idontgetoutmuch.wordpress.com/2014/09/09/fun-with-extended-kalman-filters-4/ (entrambi HMatrix con statico le garanzie dimensionali e la funzione jacobian da AD sono dimostrate).

HTH

+0

Oooh ... sì ... che uno strisciato più volte nella mia coda di lettura ... non ha mai avuto la persistenza di lavorare anche se però. Indovina ora è il momento. – fho

+0

Prego;) – ocramz

+0

Ho provato a superarlo ieri sera ... ora ricordo perché non l'ho mai superato ... è roba densa per qualcuno senza un background in machine learning (che dovrei avere ... ma ancora). – fho

Problemi correlati