Question

TL; DR: Étant donné un grand ensemble de données d'image (environ 36 Gio de pixels bruts) des données non marquées, comment puis-je regrouper les images (sur la base des valeurs de pixels) sans connaître le nombre de grappes K pour commencer?

Je travaille actuellement sur un projet d'apprentissage non supervisé aux images du cluster; penser que le regroupement MNIST avec 16x16x3 valeurs de pixels RVB, seulement que j'ai environ 48 millions d'exemplaires que je dois cluster. Sans connaître leur identité, je ne sais que certains des images sont définitivement liés parce qu'ils proviennent de la même source, mais - disons - je ne savent pas approprié K pour « juste » exécuter K-means sur l'ensemble encore.

Je pensais à faire un certain regroupement manuel intégration 2D à l'aide t-SNE, puis manuellement dans l'espace intégré (une tâche plus simple que de le faire manuellement dans 16x16x3-d), mais toutes les implémentations t-SNE je pourrais trouver obligé de charger le les données dans la mémoire. J'ai aussi pensé à la première course t-SNE, puis K-means sur les données intégrées t-SNE, mais si vous regardez les résultats des t-SNE de MNIST, il est évident que ces groupes pourraient et seront probablement déformées et biaisée de manière non linéaire. Donc, même si je devais connaître un K, les groupes seraient probablement divisés. En utilisant des distances de Mahalanobis pour K-means pourrait être une chose intéressante, mais comme je ne sais pas covariances pour commencer, qui semble être une impasse aussi bien.

Actuellement, je suis en train si je peux courir la compression PCA sur les exemples au moins gagner un peu en arrière de la mémoire pour les t-SNE, mais qui pourrait ou pourrait ne pas ... ne peut pas dire pour l'instant.

Quelqu'un peut-il me donner un pointeur dans la bonne direction pour le faire ( idéalement , mais certainement pas nécessaire dans un Python, tensorflow ou Apache faisceau / contexte Dataflow)? Je travaillais sur le portage d'un streaming / boule K-means il y a un moment qui a le propriété agréable de créer de nouveaux groupes « à la demande », mais avant que je commence la mise en œuvre que de nouveau en Python / tensorflow / Dataflow, j'espérais que quelqu'un puisse me donner quelques idées où commencer ou ce qu'il faut éviter.

Était-ce utile?

La solution

Je ne pense pas tout travail des techniques de regroupement « juste » à une telle échelle. La plus évolutive est soi-disant k-means (il suffit de ne pas utiliser Spark / Mahout, ils sont vraiment mauvais) et dbscan (il y a quelques bonnes versions distribuées disponibles).

Mais vous sera face à de nombreux autres défis en plus parce que l'échelle cluster est difficile . Il est pas comme s'il est juste assez pour exécuter l'algorithme puis vous avez des clusters. Clustering est une technique explorative. Il n'y a pas le regroupement « correct ». Mais plutôt vous devrez exécuter le regroupement encore et encore, et regardez chaque groupe . Parce qu'il pas un seul réglage des paramètres qui obtient tout droit. Au lieu de cela, les clusters différents peuvent apparaître seulement à différents paramètres.

Mais le principal défi dans votre cas sera probablement la fonction de la distance. À l'exception des paramètres idéalisés comme MNIST, la distance euclidienne ne fonctionnera pas du tout. Ni quoi que ce soit de la volonté de travailler sur les pixels bruts. Donc, vous devez d'abord faire l'extraction de caractéristiques, définir alors une fonction de similarité.

En ce qui concerne le regroupement, travail avec un échantillon . Cluster de l'échantillon, identifier des groupes intéressants, puis penser à une façon de généraliser l'étiquette à votre ensemble de données. Par exemple par le classement (vos points de données marqués sont votre jeu de formation, prédire les étiquettes des points de non marqués).

Autres conseils

Si vous essayez de faire la réduction de dimensionnalité, vous devez utiliser Mahout- il est préférable en classe, et le seul projet open source afaik d'offrir des versions vraiment distribués de PCA / SVD.

http: // cornac .apache.org / docs / 0.13.1-snapshot / algorithmes / linéaire algèbre / d-spca.html

http: // cornac .apache.org / docs / 0.13.1-snapshot / algorithmes / linéaire algèbre / d-ssvd.html

Mahout a également la mise en œuvre dbscan, travaux en cours dans le cadre d'un projet Google Summer of Code, utile de garder un oeil sur.

Je devine que la remarque « Mahout est mauvais » de Anony (Je suis d'accord Spark est) est pertinente à la version MapReduce dépréciée de Mahout (comme la nouvelle version n'a pas K moyens mis en œuvre hors de la boîte encore, bien qu'il y ait une discussion sur la liste de diffusion sur la façon de le faire assez facilement).

Licencié sous: CC-BY-SA avec attribution
scroll top