2010-08-17 52 views
18

我该如何做时间序列数据的K均值聚类? 我理解这是如何工作的,当输入数据是一组点时,但我不知道如何聚类1XM的时间序列,其中M是数据长度。特别是,我不确定如何更新时间序列数据的群集平均值。如何对时间序列数据执行K均值聚类?

我有一套标记时间序列,我想用K-means算法来检查我是否会找回类似的标签。我的X矩阵将是N X M,其中N是时间序列的数量,M是上面提到的数据长度。

有谁知道如何做到这一点?例如,我如何修改this k-means MATLAB code以便它适用于时间序列数据?另外,我希望能够使用除欧几里德距离以外的不同距离度量。

为了更好地说明了我的怀疑,这里是我修改的时间序列数据的代码:


% 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 

回答

6

时间序列通常是高维。你需要专门的距离函数来比较它们的相似性。另外,可能会出现异常值。

k-means设计用于具有(有意义的)欧氏距离的低维空间。它对于异常值并不是很强大,因为它会对它们施加平方重量。

对我来说听起来不是一个好主意,我可以在时间序列数据上使用k-means。试着研究更现代的,强大的聚类算法。许多人可以使用任意距离函数,包括时间序列距离,如DTW。

+0

可否请您提出一些强大的聚类算法。什么是DTW?谢谢。 – samkhan13 2013-06-09 18:50:54

+1

抓住时间序列的任何书,它会教你DTW。或谷歌的“时间序列DTW”。这是最先进的。至于聚类,请在Wikipedia上查找DBSCAN和OPTICS。它们可以与DTW一起使用,k-means不能。 – 2013-06-09 22:19:10

+0

谢谢这有助于:) – samkhan13 2013-06-10 05:44:02

1

如果您确实想要使用聚类,那么依赖于您的应用程序,您可以为每个时间序列生成一个低维特征向量。例如,使用时间序列平均值,标准差,傅里叶变换的主频率等。这适合与k-means一起使用,但它是否会为您提供有用的结果取决于您的具体应用和您的时间内容系列。