L'apprentissage de la Machine en OCaml ou Haskell?
Je suis l'espoir d'utiliser Haskell ou OCaml sur un nouveau projet, car R est trop lent. J'ai besoin d'être en mesure de bénéficier de l'appui vectory machines, idéalement en séparant chaque exécution pour exécuter en parallèle. Je veux utiliser un langage fonctionnel et j'ai le sentiment que ces deux sont la meilleure mesure de la performance et élégance sont concernés (j'aime Clojure, mais il n'était pas aussi rapide dans un court laps de test). Je me penche vers OCaml, car il semble y avoir plus de soutien pour l'intégration avec d'autres langues, de sorte qu'il pourrait être un meilleur ajustement à long terme (par exemple,OCaml-R).
N'quelqu'un connais un bon tuto pour ce type d'analyse, ou un exemple de code, soit en Haskell ou OCaml?
- Juste un commentaire pour dire que vous pouvez intégrer un programme C (ou même Fortran) en R relativement facilement ce peut être une démarche plus rationnelle que l'oubli de R tout à fait 🙂
- Juste par souci d'exhaustivité, la question des langages de programmation pour l'apprentissage de la machine est l'objet d'une discussion intéressante ici.
- Vous devriez également vérifier FACTORIE, un Scala machine cadre de l'apprentissage.
- Je vous recommande de scikit-learn avec python. Il n'y a pas beaucoup de diference entre la R et scikit dans les performances des questions.
- "R" est trop lent" ... les gens devraient vérifier
pqR
etsnow
/foreach
/doParallel
.
Vous devez vous connecter pour publier un commentaire.
Hal Daume a écrit plusieurs principaux algorithmes d'apprentissage automatique au cours de son Ph. D. (maintenant, il est professeur adjoint et étoile montante de la machine de la communauté d'apprentissage)
Sur sa page web, il y a un SVM, un simple arbre de décision et d'une régression logistique tout en OCaml. Par la lecture de ces codes, vous pouvez avoir un sentiment de la façon dont la machine de modèles d'apprentissage sont mis en œuvre dans le cas d'OCaml.
Un autre bon exemple de l'écriture de base de la machine de modèles d'apprentissage est Chouette bibliothèque pour les scientifiques et les calculs numériques en OCaml.
Je tiens également à mentionner F#, une nouvelle .Net un langage semblable à OCaml. Voici un facteur de modèle des graphes écrit en F# analysant les données de jeu d'Échecs. Cette recherche a aussi un PIN publication.
Alors que FP est adapté pour la mise en œuvre de l'apprentissage de la machine et des modèles d'exploration de données. Mais ce que vous pouvez obtenir ici, la plupart n'est PAS la performance. C'est juste que FP prend en charge le calcul parallèle de mieux que de langages, comme le C# ou le Java. Mais la mise en œuvre, en parallèle, une SVM, ou arbre de décision, a très peu de liens à faire avec la langue! En parallèle parallèle. Le numérique optimisations derrière la machine de l'apprentissage et de l'exploration de données sont habituellement impératif que leur écriture pure et fonctionnelle est généralement difficile et moins efficace. La prise de ces algorithmes sophistiqués parallèle est très difficile tâche dans l'algorithme, et pas dans le niveau de langue. Si vous voulez courir le 100 SVM en parallèle, FP aide ici. Mais je ne vois pas la difficulté de l'exécution de 100 libsvm parallèle en C++, de ne pas considérer que le thread unique libsvm est plus efficace qu'un non-testé haskell svm paquet.
Alors que dois-FP langues, comme F#, OCaml, Haskell, donner?
Facile de tester votre code. FP langues ont généralement un niveau supérieur interprète, vous pouvez tester vos fonctions à la volée.
Quelques mutable unis. Cela signifie que la transmission de la même paramètre à une fonction, cette fonction donne toujours le même résultat, donc la mise au point est facile à Ips.
Code est succincte. L'inférence de Type, pattern matching, fermetures, etc. Vous vous concentrez plus sur le domaine de la logique, et moins sur la langue de la partie. Donc, lorsque vous écrivez du code, votre esprit est surtout la réflexion sur la programmation de la logique elle-même.
L'écriture de code dans les FPs, c'est amusant.
par
par
". Le seul but de parallélisme est la performance. Qu'est-ce que la performance absolue de ce parallèle mergesort en Haskell comme sur le plus multicœur de bureau disponibles aujourd'hui? Probablement 1000 x plus lent que Sedgewick du quicksort en C...Le seul problème que je vois c'est que OCaml n'est pas réellement en charge processeurs multicœurs parallélisme, tandis que GHC a un excellent maintien et performance. Si vous êtes à la recherche pour l'utilisation de plusieurs threads d'exécution, sur les appels multiples, GHC Haskell sera beaucoup plus facile.
Deuxièmement, le Haskell institution financière étrangère est de plus en plus puissants (qui est, il n'est plus avec moins de code) que OCaml, et plus de bibliothèques sont disponibles (via Hackage: http://hackage.haskell.org ) donc je ne pense pas étrangère interfaces sera un facteur décisif.
Autant que le multi-langue de l'intégration va, combinant C et Haskell est remarquablement facile, et je dis cela comme quelqu'un qui est (contrairement à enfile) pas vraiment beaucoup d'un expert qui soit. Toute autre langue qui s'intègre bien avec le C ne devrait pas être beaucoup plus compliqué; vous pouvez toujours revenir à une mince couche d'interface en C si de rien d'autre. Pour le meilleur ou pour le pire, C est toujours la lingua franca de la programmation, de sorte que Haskell est plus qu'acceptable pour la plupart des cas.
...mais. Vous dites que vous êtes motivés par les problèmes de performance, et souhaitez utiliser un "langage fonctionnel". À partir de ce je en déduire que vous n'êtes pas déjà familier avec les langues que vous vous posez sur. Parmi Haskell caractéristiques sont, par défaut, utilise non-stricte évaluation et immuable structures de données--qui sont à la fois extrêmement utile dans de nombreuses façons, mais cela signifie aussi que l'optimisation de Haskell pour la performance est souvent radicalement différente de celle des autres langues, et bien rodé instincts peuvent vous égarer dans déconcertant façons. Vous pouvez parcourir liées à la performance des sujets sur le Haskell wiki pour obtenir une sensation pour les questions.
Qui ne veut pas dire que vous ne pouvez pas faire ce que vous voulez en Haskell--certainement. À la fois de la paresse et de l'immuabilité peuvent en effet être exploitées pour d'avantages de performance (Chris Okasaki de la thèse offre quelques beaux exemples). Mais sachez qu'il va être un peu d'une courbe d'apprentissage quand il s'agit de traiter avec les performances.
Les deux Haskell et OCaml fournir la jolie avantages de l'utilisation d'un ML de la famille de la langue, mais pour la plupart des programmeurs OCaml est susceptible d'offrir une plus douce courbe d'apprentissage et de meilleurs résultats immédiats.
Il est difficile de donner une réponse définitive sur ce point. Haskell a les avantages qui Ne sont mentionnés ainsi que d'avoir un plus puissant type de système et plus propre syntaxe. OCaml sera plus facile à apprendre si vous venez à partir de presque n'importe quelle autre langue (c'est parce que Haskell est que la fonction de langages fonctionnels get), et le travail avec les mutable aléatoire de structures d'accès peut être un peu maladroit en Haskell. Vous aurez également la chance de trouver les caractéristiques de performance de votre code OCaml plus intuitive que Haskell en raison de Haskell l'évaluation différée.
Vraiment, je vous recommande d'évaluer à la fois si vous avez le temps. Voici quelques Haskell ressources:
Oh, si vous regardez plus en Haskell inscrivez-vous pour la Haskell Débutants et Haskell Café listes. La communauté est amical et désireux d'aider les nouveaux arrivants (c'est mon bias montrant?).
Foo
donneNot in scope, data constructor Foo
. Haskell a omis de déduire le type...Si la vitesse est votre préoccupation principale, puis aller pour C. Haskell est assez bonne performance sage, mais vous n'allez jamais à obtenir aussi vite que C. À ma connaissance le seul langage fonctionnel qui a amélioré C d'un indice de référence est le Régime de Staline, mais qui est très ancienne et personne ne sait vraiment comment il fonctionne.
J'ai écrit de la programmation génétique des bibliothèques où les performances est la clé et je l'ai écrit dans un style fonctionnel en C. Le style fonctionnel m'a permis de facilement paralléliser l'aide d'OMP et il évolue de façon linéaire jusqu'à 8 cœurs au sein d'un seul processus. Vous avez certainement ne pouvez pas le faire en OCaml bien que Haskell est l'amélioration de tous les temps en ce qui concerne la concurrence et parallélisme.
L'inconvénient de l'utilisation de C est qu'il m'a fallu des mois pour enfin trouver tous les bugs et arrêter le core dumps qui est extrêmement difficile en raison de la simultanéité. Haskell aurait probablement pris 90% de ces bugs sur la première compilation.
Donc, la vitesse à tout prix ? Regardant en arrière, j'avais souhaite que je l'avais utilisé Haskell comme j'ai pu le supporter d'être 2 à 3 fois plus si j'avais sauvé plus d'un mois de temps de développement.
Tandis que les dons est exact que multicœur parallélisme au niveau de thread est mieux pris en charge en Haskell, on dirait que tu pourrais vivre avec le processus de parallélisme au niveau de l' (à partir de votre phrase: idéalement en séparant chaque exécution pour exécuter en parallèle.) ce qui est pris en charge assez bien en OCaml. Keith a souligné que Haskell a un plus puissant type de système, mais il peut aussi être dit que OCaml a un plus puissant système de modules de Haskell.
Comme d'autres l'ont souligné, OCaml courbe d'apprentissage sera plus faible que Haskell; vous aurez probablement être plus productifs plus rapidement en OCaml. Cela dit, l'apprentissage OCaml est un excellent tremplin vers l'apprentissage Haskell parce que beaucoup de concepts sous-jacents sont très similaires, de sorte que vous pouvez toujours migrer vers Haskell plus tard et trouver beaucoup de choses familières là. Et comme vous l'avez souligné, il y a un OCaml-R pont.
Comme un des exemples de Haskell et Ocaml dans l'apprentissage de la machine, voir des trucs à Hal Daume et Lloyd Allison les pages d'accueil. IMO il est beaucoup plus simple à réaliser en C++comme les performances en Ocaml, qu'en Haskell. À travers, comme déjà dit, Haskell a beaucoup plus agréable de la communauté (des paquets, les outils et le soutien), syntaxe&de fonctionnalités (ex: FFI, la probabilité monades via typeclasses) et de la programmation parallèle de soutien.
Avoir remanié OCaml-R, j'ai quelques commentaires à faire sur l'intégration de OCaml et R. Il pourrait être mériteraient d'utiliser OCaml pour appeler R code, cela fonctionne, mais n'est pas encore aussi simple que cela. Afin de l'utiliser pour piloter R est mériteraient. L'intégration de la R des fonctionnalités beaucoup plus de fond est encore très lourd comme, par exemple, beaucoup reste à faire pour exporter R du type de système et de données à OCaml de façon transparente (vous avez du travail à faire). Par ailleurs, l'interaction de la R du GC et OCaml GC est un point délicat: vous gratuit de valeurs n en O(n^2), ce qui n'est pas agréable (pour résoudre ce point, vous avez besoin soit plus flexible de R API, pour autant que je comprends, ou de mettre en œuvre un GC dans la liaison elle-même comme un grand R tableau pour une bonne interaction entre le GCs).
En un mot, j'irais pour le pilote de "R de OCaml" approche.
Contributions sur le GC interaction de la couche et sur la cartographie de la R des types de données à OCaml sont la plupart de bienvenue.
Vous pouvez prendre un coup d'oeil à ceci : http://www.haskell.org/pipermail/haskell-cafe/2010-May/077243.html
Réponse tardive mais une machine d'apprentissage bibliothèque Haskell est disponible ici : https://github.com/mikeizbicki/HLearn
Cette bibliothèque met en œuvre diverses ML algorithmes qui sont conçus pour avoir une plus grande vitesse de cross-validation de l'habitude, les implémentations. Il est basé sur le document suivant Algébrique des classificateurs: une approche générique pour rapide cross-validation,
la formation en ligne, et en parallèle de la formation. Les auteurs revendique une vitesse 400x-up par rapport à la même tâche dans Weka.