Comment effectuer le regroupement K-means sur des données de séries chronologiques?

Comment puis-je faire K-means clustering de données de séries chronologiques? Je comprends comment cela fonctionne lorsque les données d'entrée sont un ensemble de points, mais je ne sais pas comment regrouper 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 de la grappe pour les données de séries chronologiques.

j'ai un ensemble de séries chronologiques étiquetées, et je veux utiliser L'algorithme de 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 nombre de séries chronologiques et M est la longueur des 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 pour que cela fonctionne pour les données de séries chronologiques? En outre, je voudrais être en mesure d'utiliser différents paramètres de distance en plus de la distance euclidienne.

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


% 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
18
demandé sur ali_m 2010-08-17 18:44:10

5 réponses

les séries chronologiques sont habituellement de grande dimension. Et vous avez besoin de la fonction de distance spécialisée pour les comparer pour la similitude. En plus, il pourrait y avoir des valeurs aberrantes.

K-means est conçu pour les espaces de faible dimension avec une distance euclidienne (significative). Elle n'est pas très robuste à l'égard des valeurs aberrantes, car elle leur impose un poids au carré.

cela ne ressemble pas à une bonne idée d'utiliser k-means sur les données de séries chronologiques. Essayez d'étudier des algorithmes de regroupement plus modernes et plus robustes. Beaucoup vous permet d'utiliser des fonctions de distance arbitraires, y compris les distances de séries chronologiques telles que DTW.

6
répondu Anony-Mousse 2012-03-22 08:00:51

Il est probablement trop tard pour une réponse, mais:

les méthodes ci-dessus utilisent R. Vous trouverez plus de méthodes en regardant, par exemple, pour "groupement incrémentiel itératif des séries chronologiques".

3
répondu Fr. 2013-07-28 11:22:15

j'ai récemment rencontré le kml package R qui revendique à mettre en œuvre des k-means pour des données longitudinales. Je ne l'ai pas essayé moi-même.

le Temps de la série de clustering - Un examen de la décennie papier par S. Aghabozorgi, A. S. Shirkhorshidi et T. Ying Wah pourrait être utile pour vous de chercher des alternatives. Un autre beau papier bien que quelque peu daté est regroupement des séries chronologiques de données d'un sondage par T. Warren Liao.

2
répondu DimP 2017-06-16 15:09:30

si vous voulez vraiment utiliser le clustering, alors dépendant de votre application vous pouvez générer un vecteur de caractéristique de faible dimension pour chaque série temporelle. Par exemple, utilisez la moyenne des séries chronologiques, l'écart-type, la fréquence dominante à partir d'une transformée de Fourier, etc. Cela conviendrait pour une utilisation avec k-means, mais si cela vous donnerait des résultats utiles dépend de votre application spécifique et le contenu de vos séries chronologiques.

1
répondu Open Door Logistics 2014-06-22 07:57:31

Je ne pense pas que k-means soit la bonne façon pour ça non plus. Comme @Anony-Mousse suggéré que vous pouvez utiliser DTW. En fait, j'ai eu le même problème sur un de mes projets et j'ai écrit ma propre classe pour qu'en Python. La logique est;

  1. créez toutes vos combinaisons de clusters. k correspond au nombre de grappes et n au nombre de séries. Le nombre d'articles retournés doivent être n! / k! / (n-k)!. Ces serait quelque chose comme potentiel des centres.
  2. Pour chaque série, calculez les distances pour chaque centre dans chaque groupe et assignez-les au minimum.
  3. pour chaque groupe, calculer la distance totale à l'intérieur de chaque groupe.
  4. Choisir le minimum.

et, l'implémentation Python est ici si vous êtes intéressé.

0
répondu Dogan Askan 2018-09-27 18:11:10