L'image ci-dessous montre 7 points autour de l'origine. L'un d'eux a été sélectionné par un humain sur la base des règles et de l'expérience et est coloré en rouge (celui dans le quadrant inférieur gauche).
Nous avons maintenant plus de 1000 de ces ensembles de points et pour chaque ensemble, un humain a sélectionné un seul point. Ces conditions s'appliquent à tous les ensembles:
- Chaque ensemble a environ 3 à 10 points
- Il n'y a pas de valeurs aberrantes
- Les points peuvent avoir des valeurs positives et négatives
- Aucune erreur n'a été commise lors de la sélection d'un point
Ma question est: existe-t-il un algorithme d'apprentissage automatique pour apprendre de ces ensembles et des sélections faites par l'homme afin qu'il puisse automatiquement décider quel point sélectionner lorsqu'un nouvel ensemble de points est donné? Ce nouvel ensemble remplit bien sûr les 3 premières conditions d'en haut.
2 dernières remarques:
- L'exemple que j'ai donné n'est qu'un exemple construit de manière aléatoire par moi pour soutenir l'idée de points dans un plan autour de l'origine avec un point sélectionné. Dans la vraie vie, il pourrait y avoir plus de structure mais pour l'instant je suis curieux et je voudrais savoir ce qui est possible pour ce cas.
- Des variations seraient-elles possibles? Disons qu'il s'agit d'environ 2 points sélectionnés ou que vous avez des cercles avec un rayon donné au lieu de points.
machine-learning
Elmex80s
la source
la source
Réponses:
C'est un problème fascinant! Deux choses le rendent particulièrement difficile:
age
etheight
(en centimètres). Chaque échantillon a une entrée pour chacun, et(age, height) = (22, 180)
n'est bien sûr pas le même que(age, height) = (180, 22)
. Ni l'un ni l'autre n'est vrai dans votre problème. Un ensemble de points a entre 3 et 10 points, et l'ordre dans lequel nous entrons les points ne devrait pas faire de différence lors de la comparaison de deux ensembles de points.Permettez-moi de décrire un algorithme qui traite des deux défis. La précision de prédiction n'est pas très bonne; mais peut-être voyez-vous un moyen de l’améliorer. Et au moins, il prédit quelque chose , non?
1. Simulation d'échantillons
Pour pouvoir tester l'algorithme, j'ai écrit des fonctions qui génèrent des échantillons et des labels.
Génération d'échantillons: Chaque échantillon contient entre 3 et 10 points. Le nombre de points est aléatoire, tiré d'une distribution uniforme. Chaque point est de la forme
(x_coordinate, y_coordinate)
. Les coordonnées sont à nouveau aléatoires, tirées d'une distribution normale.Génération d'étiquettes: À titre d'exemple de jouet, supposons que la règle pour choisir un point est: Choisissez toujours le point le plus proche
(0, 0)
, où «le plus proche» doit être compris en termes de norme euclidienne.Nous pouvons maintenant créer nos trains et ensembles de test:
2. Comparaison des ensembles de points via la distance de Hausdorff
Abordons le premier problème: comment comparer différents ensembles de points? Le nombre de points dans les jeux de points est différent. N'oubliez pas non plus que l'ordre dans lequel nous notons les points n'a pas d'importance: la comparaison avec l'ensemble de points
[(0,0), (1,1), (2,2)]
devrait donner le même résultat que la comparaison avec l'ensemble de points[(2,2), (0,0), (1,1)]
. Mon approche consiste à comparer des ensembles de points via leur distance de Hausdorff :3. Prédire via k voisins les plus proches et faire la moyenne
Nous avons maintenant une notion de distance entre les ensembles de points. Cela permet d'utiliser la classification k-voisins les plus proches: étant donné un ensemble de points de test, nous trouvons les
k
ensembles de points dans notre échantillon d'apprentissage qui ont la plus petite distance de Hausdorff par rapport à l'ensemble de points de test, et obtenons leurs étiquettes. Vient maintenant le deuxième problème: comment transformer cesk
étiquettes en prédiction pour l'ensemble de points de test? J'ai adopté l'approche la plus simple: faire la moyenne des étiquettes et prédire le point de l'ensemble de points de test le plus proche de la moyenne.4. Test
Tout est en place pour tester les performances de notre algorithme.
Pour la fonction de décision donnée et
num_neighbors = 70
, nous obtenons une précision de prédiction de 84%. Ce n'est pas terriblement bon, et c'est bien sûr spécifique à notre fonction de décision, qui semble assez facile à prévoir.Pour voir cela, définissez une fonction de décision différente:
L'utilisation de cette fonction via
dec_fun = decision_function_maxaverage
réduit la précision de la prédiction à 45%. Cela montre à quel point il est important de réfléchir aux règles de décision qui génèrent vos étiquettes. Si vous avez une idée pourquoi les gens choisissent certains points, cela vous aidera à trouver le meilleur algorithme.Quelques façons d'améliorer cet algorithme: (1) Utiliser une fonction de distance différente au lieu de la distance de Hausdorff, (2) utiliser quelque chose de plus sophistiqué que les voisins les plus proches, (3) améliorer la façon dont les étiquettes d'apprentissage sélectionnées sont transformées en prédiction.
la source
Voici quelques façons d'utiliser les réseaux de neurones pour résoudre ce problème:
Avec un simple réseau de neurones Feedforward:
Avec un réseau neuronal convolutif:
Le CNN peut être plus performant car vos données sont intrinsèquement spatiales. Cependant, vous devez décider quoi faire si deux points ou plus se chevauchent. La solution la plus simple consiste à en choisir un au hasard, ce qui pourrait être OK en fonction de votre tâche spécifique.
Avec un réseau neuronal récurrent:
Oui, c'est aussi simple que cela avec les RNN! Ils gèrent bien les entrées de longueur variable, mais ils n'ont toujours pas les avantages des CNN pour gérer les données spatiales.
Mises en garde:
Si vous utilisez un FNN ou un RNN, il y a aussi la question de savoir comment vous commandez vos données d'entrée. S'il n'y a pas d'ordre inhérent dans vos données réelles, nous ne voulons pas que notre réseau fasse des prédictions différentes pour les mêmes données encodées dans des ordres différents. Une façon de gérer cela consiste à augmenter les données : dupliquez plusieurs fois chaque exemple de formation avec différents ordres d'entrée, afin que votre réseau puisse apprendre les symétries appropriées.
Si vous n'avez que le temps d'essayer une approche, je choisirais le CNN. Les CNN sont conçus pour bien fonctionner avec les données spatiales, et il n'y a aucun problème avec les ordres d'entrée.
la source
(0,0), (1,1), (2,2)
aura un effet différent de l'alimenter d'un ensemble de points(1,1), (2,2), (0,0)
.