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 classeElement
. Gli unici elementi sonoDouble
,Float
e i loro moduliComplex
. Tutti questi non sono accettati dagradientDescent
.
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
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
Prego;) – ocramz
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