xlabel suptitle ejemplo matlab time-series cluster-analysis data-mining k-means

suptitle - xlabel matlab



¿Cómo puedo realizar una agrupación K-significa en datos de series de tiempo? (5)

¿Cómo puedo hacer K-significa agrupación de datos de series de tiempo? Entiendo cómo funciona esto cuando los datos de entrada son un conjunto de puntos, pero no sé cómo agrupar una serie de tiempo con 1XM, donde M es la longitud de los datos. En particular, no estoy seguro de cómo actualizar la media del clúster para los datos de series de tiempo.

Tengo un conjunto de series de tiempo etiquetadas, y quiero usar el algoritmo K-means para verificar si recuperaré una etiqueta similar o no. Mi matriz X será NXM, donde N es el número de series de tiempo y M es la longitud de los datos como se mencionó anteriormente.

¿Alguien sabe como hacer esto? Por ejemplo, ¿cómo podría modificar este código MATLAB de k-medias para que funcione con datos de series de tiempo? Además, me gustaría poder usar diferentes métricas de distancia además de la distancia euclidiana.

Para ilustrar mejor mis dudas, aquí está el código que modifiqué para los datos de series de tiempo:

% 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


Las series de tiempo suelen ser de alta dimensión. Y necesitas una función de distancia especializada para compararlos por similitud. Además, puede haber valores atípicos.

k-means está diseñado para espacios de baja dimensión con una distancia euclidiana (significativa). No es muy robusto hacia los valores atípicos, ya que les da un peso cuadrado.

No me parece una buena idea usar k-means en datos de series de tiempo. Intente buscar algoritmos de agrupamiento más modernos y robustos. Muchos le permitirán usar funciones de distancia arbitrarias, incluidas distancias de series de tiempo como DTW.




Si realmente desea utilizar la agrupación en clúster, entonces, dependiendo de su aplicación, podría generar un vector de características de baja dimensión para cada serie temporal. Por ejemplo, use la media de series de tiempo, la desviación estándar, la frecuencia dominante de una transformada de Fourier, etc. Esto sería adecuado para usar con k-means, pero si le proporcionará resultados útiles depende de su aplicación específica y del contenido de su tiempo. serie.


Tampoco creo que k-means sea la manera correcta de hacerlo. Como @ Anony-Mousse sugirió que puede utilizar DTW . De hecho, tuve el mismo problema para uno de mis proyectos y escribí mi propia clase para eso en Python. La lógica es;

  1. Crea tus combinaciones de todos los clústeres. k es para el conteo de conglomerados y n es para el número de series. El número de artículos devueltos debe ser n! / k! / (nk)! n! / k! / (nk)! . Estos serían algo así como centros potenciales.
  2. Para cada serie, calcule las distancias para cada centro en cada grupo de grupos y asígnelo al mínimo.
  3. Para cada grupo de grupos, calcule la distancia total dentro de grupos individuales.
  4. Elige el mínimo.

Y, la implementación de Python está here si está interesado.