如何在时间序列数据上执行K-means聚类?

时间:2010-08-17 14:44:11

标签: matlab time-series cluster-analysis data-mining k-means

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

我有一组标记的时间序列,我想使用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

5 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

答案可能为时已晚,但是:

上述方法使用R.您可以查看更多方法,例如“Iterative Incremental Clustering of Time Series”。

答案 2 :(得分:2)

我最近遇到了kml R包,声称为纵向数据实现k-means聚类。我自己没试过。

S. Aghabozorgi,A。S. Shirkhorshidi和T. Ying Wah撰写的Time-series clustering - A decade review论文可能对您有用,可以寻找替代方案。另一篇不错的论文虽然有点过时,但是T. Warren Liao的Clustering of time series data-a survey

答案 3 :(得分:1)

如果您确实想要使用群集,那么根据您的应用程序,您可以为每个时间序列生成低维特征向量。例如,使用时间序列均值,标准偏差,傅立叶变换的主频等。这适用于k-means,但它是否会给你有用的结果取决于你的具体应用和你的时间内容系列。

答案 4 :(得分:0)

我也不认为k均值是正确的方法。正如@ Anony-Mousse建议的那样,您可以使用DTW。实际上,我的一个项目遇到了同样的问题,并且我用Python编写了自己的类。逻辑是;

  1. 创建所有群集组合。 k是簇数,n是系列数。返回的项目数应为n! / k! / (n-k)!。这些就像潜在的中心。
  2. 对于每个系列,计算每个聚类组中每个中心的距离,并将其分配给最小的聚类。
  3. 对于每个群集组,计算单个群集内的总距离。
  4. 选择最小值。

而且,如果您感兴趣的话,Python实现是here