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.
Probablemente sea demasiado tarde para una respuesta, pero:
- k-means se puede utilizar para agrupar datos longitudinales
- Anony-Mousse tiene razón, la distancia DWT es el camino a seguir para series de tiempo
Los métodos anteriores utilizan R. Encontrará más métodos buscando, por ejemplo, " agrupación iterativa incremental de series de tiempo ".
Recientemente he encontrado el paquete kml
R que pretende implementar el clustering de k-means para datos longitudinales. No lo he probado yo mismo.
También el agrupamiento de series de tiempo: un artículo de revisión de una década por S. Aghabozorgi, AS Shirkhorshidi y T. Ying Wah puede ser útil para buscar alternativas. Otro buen artículo, aunque algo anticuado, es la agrupación de datos de series de tiempo, una encuesta realizada por T. Warren Liao.
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;
- 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. - Para cada serie, calcule las distancias para cada centro en cada grupo de grupos y asígnelo al mínimo.
- Para cada grupo de grupos, calcule la distancia total dentro de grupos individuales.
- Elige el mínimo.
Y, la implementación de Python está here si está interesado.