使用TimeSeriesKMeans时间序列模型生成聚类归属向量的方法咨询
实现方法
预处理逻辑修正
你现有代码的预处理环节存在逻辑错误:按公司分组完成后,直接将my_dict覆盖为全数据集的滚动均值,丢失了按公司拆分的独立时间序列结构,需要先修正该部分才能正确完成聚类和向量生成。
完整实现代码
import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler, OneHotEncoder from tslearn.clustering import TimeSeriesKMeans from sklearn.model_selection import train_test_split # 读取数据集,仅保留需要字段 df = pd.read_csv("all_stocks_5yr.csv", usecols=["date", "Name", "close"]) # 数据透视:行对应公司,列对应日期,值为收盘价,删除存在缺失值的公司 pivot_df = df.pivot(index="Name", columns="date", values="close").dropna(axis=0) # 10日移动平均平滑处理 rolling_df = pivot_df.rolling(window=10, min_periods=1, axis=1).mean() # 数值归一化 sc = MinMaxScaler(feature_range=(0, 1)) scaled_data = sc.fit_transform(rolling_df) # 拆分训练测试集 train, test = train_test_split(scaled_data, test_size=0.2, random_state=12345) # 训练时间序列KMeans模型 n_clusters = 3 model = TimeSeriesKMeans(n_clusters=n_clusters, metric="dtw", max_iter=5) model.fit(train) # 生成全量样本的聚类标签 all_sample_labels = model.predict(scaled_data) # 转换为维度和聚类数一致的归属向量(独热编码形式) enc = OneHotEncoder(sparse_output=False) cluster_belong_vector = enc.fit_transform(all_sample_labels.reshape(-1, 1)) # 可按需将向量和公司名称绑定 company_cluster_map = pd.DataFrame( cluster_belong_vector, index=pivot_df.index, columns=[f"cluster_{i}" for i in range(n_clusters)] )
结果说明
- 最终输出的
cluster_belong_vector就是你需要的聚类归属向量,其维度为(样本数, 聚类数),每行对应一个公司的时间序列,对应聚类簇的位置值为1,其余位置为0,完全符合维度要求。 - 如果需要单独获取训练集/测试集的归属向量,只需将
scaled_data替换为train或test传入predict方法即可。
内容的提问来源于stack exchange,提问作者eneko valero
相关产品推荐
相关产品推荐

