20

如何对时间序列数据进行 K 均值聚类?我理解当输入数据是一组点时这是如何工作的,但我不知道如何用 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
4

5 回答 5

9

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

k-means 是为具有(有意义的)欧几里得距离的低维空间设计的。它对异常值不是很健壮,因为它对它们施加了平方权重。

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

于 2012-03-22T08:00:51.733 回答
4

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

上面的方法使用 R。你会发现更多的方法,例如“时间序列的迭代增量聚类”。

于 2013-07-28T11:22:15.103 回答
2

我最近遇到了kmlR 包,它声称对纵向数据实施 k-means 聚类。我自己还没有尝试过。

此外,时间序列聚类 - S. Aghabozorgi、AS Shirkhorshidi 和 T. Ying Wah 的十年回顾论文可能对您寻找替代方案有用。另一篇不错的论文虽然有些过时,但是时间序列数据的聚类——T . Warren Liao 的一项调查。

于 2017-06-16T15:09:30.987 回答
1

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

于 2014-06-22T07:57:31.323 回答
0

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

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

而且,如果您有兴趣,这里有 Python 实现。

于 2018-09-27T17:44:03.157 回答