2010-08-17 27 views
18

Comment puis-je faire un clustering K-means de données de séries chronologiques? Je comprends comment cela fonctionne quand les données d'entrée sont un ensemble de points, mais je ne sais pas comment classer une série temporelle avec 1XM, où M est la longueur des données. En particulier, je ne suis pas sûr de savoir comment mettre à jour la moyenne du cluster pour les données de séries temporelles.Comment puis-je effectuer un clustering K-means sur des données de séries chronologiques?

J'ai un ensemble de séries chronologiques étiquetées, et je veux utiliser l'algorithme K-means pour vérifier si je vais récupérer une étiquette similaire ou non. Ma matrice X sera N X M, où N est le nombre de séries temporelles et M est la longueur de données comme mentionné ci-dessus.

Est-ce que quelqu'un sait comment faire cela? Par exemple, comment pourrais-je modifier this k-means MATLAB code afin qu'il fonctionne pour les données de séries chronologiques? En outre, j'aimerais pouvoir utiliser différentes métriques de distance en plus de la distance euclidienne.

Pour mieux illustrer mes doutes, voici le code I modifié pour les données de séries chronologiques:


% Check if second input is centroids 
if ~isscalar(k) 
    c=k; 
    k=size(c,1); 
else 
    c=X(ceil(rand(k,1)*n),:); % assign centroid randomly at start 
end 

% allocating variables 
g0=ones(n,1); 
gIdx=zeros(n,1); 
D=zeros(n,k); 

% Main loop converge if previous partition is the same as current 
while any(g0~=gIdx) 
%  disp(sum(g0~=gIdx)) 
    g0=gIdx; 
    % Loop for each centroid 
    for t=1:k 
     % d=zeros(n,1); 
     % Loop for each dimension 
     for s=1:n 
      D(s,t) = sqrt(sum((X(s,:)-c(t,:)).^2)); 
     end 
    end 
    % Partition data to closest centroids 
    [z,gIdx]=min(D,[],2); 
    % Update centroids using means of partitions 
    for t=1:k 

     % Is this how we calculate new mean of the time series? 
     c(t,:)=mean(X(gIdx==t,:)); 

    end 
end 

Répondre

6

séries chronologiques sont généralement de grande dimension. Et vous avez besoin de la fonction de distance spécialisée pour les comparer pour la similarité. De plus, il pourrait y avoir des valeurs aberrantes. K-means est conçu pour des espaces de faible dimension avec une distance euclidienne (significative). Il n'est pas très robuste vis-à-vis des valeurs aberrantes, car il leur donne un poids carré.

Cela ne me semble pas être une bonne idée d'utiliser k-means sur des données de séries chronologiques. Essayez d'explorer des algorithmes de clustering plus modernes et plus robustes. Beaucoup vous permettront d'utiliser des fonctions de distance arbitraires, y compris des distances de séries temporelles telles que DTW.

+0

pourriez-vous s'il vous plaît suggérer certains des algorithmes de clustering robustes. et qu'est-ce que DTW? Merci. – samkhan13

+1

Prenez n'importe quel livre sur les séries temporelles, et il vous apprendra DTW. Ou google pour "série chronologique DTW". C'est l'état de l'art. En ce qui concerne le clustering, consultez DBSCAN et OPTICS sur Wikipedia. Ils peuvent être utilisés avec DTW, k-means ne peut pas. –

+0

merci cela aide :) – samkhan13

1

Si vous vouliez vraiment utiliser le clustering, vous pourriez générer un vecteur de caractéristiques de faible dimension pour chaque série temporelle en fonction de votre application. Par exemple, utilisez la moyenne des séries temporelles, l'écart-type, la fréquence dominante d'une transformée de Fourier, etc. Cela convient à une utilisation avec k-means, mais il dépend de votre application spécifique et du contenu de votre temps. séries.

1

J'ai récemment rencontré le paquet kml R qui prétend implémenter le clustering k-means pour les données longitudinales. Je ne l'ai pas essayé moi-même.

L'article Time-series clustering - A decade review de S. Aghabozorgi, A. S. Shirkhorshidi et T. Ying Wah pourrait vous être utile pour trouver des alternatives. Un autre bon papier bien que quelque peu daté est Clustering of time series data-a survey par T. Warren Liao.