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

Jaz*_*Jaz 19 matlab cluster-analysis time-series data-mining k-means

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

我有一组标记时间序列的,我想用K-means算法来检查我是否会得到一个类似的标签或没有.我的X矩阵将是NXM,其中N是时间序列的数量,M是如上所述的数据长度.

有谁知道如何做到这一点?例如,我如何修改这个k-means MATLAB代码,以便它适用于时间序列数据?此外,我希望能够使用欧几里德距离以外的不同距离指标.

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


% 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
Run Code Online (Sandbox Code Playgroud)

Ano*_*sse 7

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

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

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

  • 随便找一本关于时间序列的书,它都会教你 DTW。或者谷歌搜索“时间序列 DTW”。这是最先进的。至于聚类,请在维基百科上查找 DBSCAN 和 OPTICS。它们可以与 DTW 一起使用,但 k-means 不能。 (2认同)