Tout d'abord, permettez-moi de dire que je suis un peu hors de ma profondeur ici, donc si cette question doit être reformulée ou fermée en double, veuillez me le faire savoir. Il se peut simplement que je n'ai pas le vocabulaire approprié pour exprimer ma question.
Je travaille sur une tâche de traitement d'image dans laquelle j'identifie les caractéristiques d'une image, puis je les classe en fonction de leurs propriétés, y compris la forme, la taille, l'obscurité, etc. Je pourrais améliorer les méthodes que j'utilise pour la classification des fonctionnalités.
À l'heure actuelle, je fixe des seuils pour chacun des paramètres mesurés, puis je classe les entités selon une logique simple en fonction des seuils que l'entité a franchis. Par exemple (les propriétés et les regroupements réels sont plus complexes, mais j'essaie de simplifier des parties non pertinentes de mon projet pour cette question), disons que je regroupe les fonctionnalités dans les groupes "Big and Dark", "Big and Light" et petit". Ensuite, une fonction sera dans "Big and Dark" si (taille ( )> sizeThreshold) et (obscurité ( )> obscuritéThreshold).
L'objectif est que la classification soit en accord avec la classification effectuée par un humain de niveau expert, donc je peux définir les seuils pour produire la meilleure correspondance entre les regroupements effectués par l'homme et l'ordinateur sur un ensemble de tests, puis espérer que la classification fonctionne bien avec de nouvelles données.
Cela fonctionne déjà assez bien, mais je vois un mode de défaillance particulier qui, je pense, peut être corrigé. Disons que la fonction appartient à «Big and Dark». L'humain l'a classé de cette façon parce que, alors qu'il était à peine assez grand, il faisait très très sombre, ce qui compensait quelque peu le manque de «grandeur». Mon algorithme ne parviendrait pas à classer cette fonctionnalité correctement, car la classification est basée sur une logique binaire rigide et nécessite que tous les seuils soient franchis.
Je voudrais améliorer cet échec en faisant en sorte que mon algorithme imite mieux le processus guidé par l'homme, dans lequel une déficience d'un paramètre peut être compensée par une abondance d'un autre. Pour ce faire, je voudrais prendre chacune des propriétés de base de mes fonctionnalités et les convertir en une sorte de score qui serait un prédicteur du groupe auquel appartient la fonctionnalité. J'ai pensé à de nombreuses façons de le faire, mais ce sont principalement des idées ad hoc, basées sur mes antécédents en calcul vectoriel et en physique. Par exemple, j'ai envisagé de traiter chaque entité comme un vecteur dans l'espace ND des propriétés de l'entité et de calculer la projection de chaque entité le long de certains vecteurs, chacun mesurant le degré auquel une entité appartient au groupe.
Je suis sûr qu'il existe une technique plus rigoureuse et mieux établie pour faire ce genre de chose, mais mes antécédents sont relativement faibles en analyse statistique, donc je cherche un coup de pouce dans la bonne direction. Même le nom d'une technique ou un lien vers un manuel serait utile.
TL; DR: Quelles techniques sont utiles pour classer des objets en fonction d'un grand nombre de paramètres descriptifs?
la source
Réponses:
Il semble que tout classificateur linéaire fera ce dont vous avez besoin. Supposons que vous ayez entités et que la valeur de l'entité soit . Un classificateur linéaire calculera alors un score (où est le décalage). Alors, si (où est un certain seuil), alors l'entité appartient à une classe (un groupe), et siN i fi
Il existe de nombreux classificateurs linéaires disponibles sur le marché qui peuvent le faire, y compris SVM, LDA (analyse discriminante linéaire), les réseaux de neurones linéaires et bien d'autres. Je commencerais par exécuter SVM linéaire car il fonctionne bien dans de nombreux cas et peut tolérer des données d'entraînement limitées. Il existe également de nombreux packages dans de nombreux environnements (comme Matlab et R), vous pouvez donc facilement l'essayer. L'inconvénient de SVM est qu'il peut être lourd en termes de calcul, donc si vous avez besoin d'apprendre beaucoup de classes, il pourrait être moins approprié.
Si vous souhaitez conserver une partie du comportement de seuil que vous avez actuellement, vous pouvez passer les valeurs d'entité via un sigmoïde avec le seuil au bon endroit. Par exemple, pour une fonctionnalité pour laquelle vous utilisez actuellement un seuil de , commencez par calculer puis apprenez un classificateur linéaire en utilisant plutôt que ' s. De cette façon, le comportement de compensation ne se produira qu'à proximité du seuil, et les choses trop éloignées du seuil ne pourront pas être compensées (ce qui est parfois souhaitable).i ti
Une autre chose que vous pourriez essayer est d'utiliser des classificateurs probabilistes comme Naive Bayes ou TAN. Naive Bayes est presque comme un classificateur linéaire, sauf qu'il calcule Il reste donc une somme de poids. Ces poids dépendent des valeurs d' , mais pas par multiplication comme dans un classificateur linéaire habituel. Dans ce cas, le score est la probabilité logarithmique et les poids sont les contributions des caractéristiques individuelles à cette probabilité logarithmique. L'inconvénient de l'utiliser dans votre cas est que vous aurez besoin de plusieurs bacs pour les valeurs de vos fonctionnalités, puis l'apprentissage peut devenir difficile. Il existe des moyens de contourner cela (par exemple, en utilisant des antérieurs), mais comme vous n'avez aucune expérience avec cela, cela pourrait être plus difficile.
En ce qui concerne la terminologie: ce que vous appelez «ensemble de tests» est généralement appelé «ensemble de formation» dans ce contexte, et ce que vous appelez «nouvelles données» est appelé «ensemble de tests».
Pour un livre, j'avais lu "Reconnaissance de formes" de Duda, Hart et Stork. Le premier chapitre est une très bonne introduction pour les débutants.
la source