2012-02-14 2 views
0

Je dois former un classificateur sur les données de mouvement d'un accéléromètre. Pour chaque échantillon de temps j'ai stocké les coordonnées X Y et Z. Ainsi, un seul mouvement est représenté dans mon ensemble de données comme ceci:Quel type de système de classification devrais-je utiliser?

[0.39028051 -0.5483283 10.385374]; [0.17420317 -0.2802931 10.72625]; [0.28956637 -0.13387422 11.9645]; [0.6281768 -0.14725612 13.369692]; [0.72674876 -0.115191355 14.50422]; [0.7450281 -0.079684645 15.090715]; [0.74526054 -0.44727635 15.027773]; [0.6936915 -0.9639046 14.088198]; [0.5290651 -1.1378883 12.5164585]; [0.23881127 -1.346372 10.889902]; [0.052466527 -1.2700776 9.227933]; [0.019615699 -0.8237766 7.65959]; [0.10373996 -0.29147366 6.416745]; [0.17365126 0.09419979 5.420801]; [0.18465124 0.3646446 4.5289593]; [0.22039331 0.52677184 3.8076568]; [0.33365434 0.48184758 3.4170833]; [0.40346703 0.21976978 3.472282]; 

où les valeurs entre [] représentent les composantes XYZ. Au début, je pensais qu'un modèle de Markov caché serait le mieux adapté à mon problème. Mais j'ai des problèmes pour définir les états dans mes données. Tous les exemples que je trouve ont un ensemble défini d'états finis définis (c'est-à-dire pluvieux, ensoleillé ou nuageux). Toutes les valeurs de mon jeu de données sont comprises entre -11 et +11, mais il ne s'agit évidemment pas d'entiers. Pourtant, pourrais-je utiliser cela comme des états? me donnant ainsi 11 * 11 * 11 = 1331 états? Et comment pourrais-je calculer la matrice de transition?

En outre, le nombre d'observations diffère entre les mouvements (bien qu'appartenant à la même classe). Je suis désolé j'ai cette question est trop large, un pointeur vers un tutoriel sur HMM avec ce type de données aide également beaucoup!

Merci

+1

Vous exposer une solution possible (HMM) au lieu de définir le problème. qu'avez-vous à faire avec vos données, exactement? – vulkanino

+0

ce document peut vous aider: http://webspace.ulbsibiu.ro/arpad.gellert/html/SIC_HMM.pdf – vulkanino

+0

J'ai besoin de classer les mouvements de la tête en 10 classes différentes qui sont toutes fondamentalement en mouvement de secousse ou nodal. Merci pour le pointeur! – jorrebor

Répondre

0

en pseudocode, calculer toutes les distances entre deux points:

for index=0 to coords.length() step 2 
{ 
    x1=coord[i].x 
    y1=coord[i].y 
    z1=coord[i].z 

    x2=coord[i+1].x 
    y2=coord[i+1].y 
    z2=coord[i+1].z 

    deltaX = x2-x1 
    deltaY = y2-y1 
    deltaZ = z2-z1 
    distance[i] = SquareRoot(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ) 
} 

Ensuite, vous pouvez calculer une distribution gaussienne sur les distance valeurs, ainsi que la moyenne, la médiane, la variance. Un algorithme ne devrait pas être trop compliqué à écrire, même si cela peut nécessiter quelques ajustements ici et là.

Ou, une autre méthode, dans la boucle vous pouvez facilement calculer la différence entre le courant et la distance précédente:

previousDistance = distance 
distance = SquareRoot(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ) 
diff = distance - previousDistance 

Et puis appliquez une high pass filter sur diff.