tslearn库TimeSeriesKMeans的距离度量计算逻辑是怎样的?
tslearn TimeSeriesKMeans 实现逻辑解答
时间序列输入适配逻辑
tslearn的TimeSeriesKMeans原生支持时间序列格式输入,不需要你额外做特征转换:
- 你示例中传入的
X是形状为(10, 100)的2D数组,对应10条长度为100的单变量时间序列 - 多变量时间序列传入形状为
(n_samples, n_timestamps, n_features)的3D数组即可
内部会直接基于你指定的度量规则做序列间的距离计算,不需要把时间序列压平成普通一维向量适配传统KMeans。
欧式距离的使用逻辑
你示例中使用的metric="euclidean"不需要提前生成10×10的全量样本距离矩阵,执行逻辑完全遵循标准K均值的迭代流程:
import numpy as np from tslearn.clustering import TimeSeriesKMeans X = np.random.random((10,100)) km = TimeSeriesKMeans(n_clusters=3, metric="euclidean").fit_predict(X)
这段代码的欧式距离仅用于每轮迭代中样本和当前聚类中心的距离计算,流程如下:
- 初始化阶段随机选3条样本作为初始聚类中心
- 每轮迭代仅计算10条样本分别到3个中心的欧式距离,距离计算规则和普通向量的欧式距离完全一致:对长度为T的序列
a和b,距离为sqrt(sum((a_i - b_i)^2 for i in range(T))) - 每个样本被分配到距离最近的中心对应的簇后,再基于簇内所有序列的对应时间步取均值,更新聚类中心
- 重复上述流程直到聚类中心不再变化,输出簇标签
DTW等高复杂度度量的优化策略
即便换成DTW这类复杂度更高的度量,tslearn也不会预计算全量的n×n距离矩阵,主要优化点如下:
- 迭代过程中仅计算
n_samples × n_clusters次距离,而非样本两两的n_samples^2次,样本量越大、聚类数越少,效率提升越明显 - DTW等序列度量底层用C扩展实现,同时支持LB_Keogh等下界裁剪算法,提前终止无效计算
- 支持通过
n_jobs参数配置并行计算,进一步加速距离计算过程
只有当你手动指定
metric="precomputed"时,才需要自行传入全量距离矩阵作为输入,其他内置度量均不需要该操作。
内容的提问来源于stack exchange,提问作者Sicks
相关产品推荐
相关产品推荐

