numpy 基于tslearn的动态时间规整分类

agxfikkp  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(120)

我在用tslearn库实现DTW分类时遇到了一些问题。特别是在训练模型时。
我有多个可变长度和多维的时间序列数据。在第一步,我所做的是将多个文件上传到一个 Dataframe 列表中进行可视化。然后,我将这些 Dataframe 列表过滤掉所有列,转换为numpy数组。拆分为train和test,然后尝试使用dtw作为距离度量来训练模型。
我不确定我错过了什么,因为我遇到了ValueError:使用序列设置数组元素。
我试图将我的numpy数组变平并将其输入模型,我试图重新塑造它(-1,1),我试图将dtype更改为float,但没有任何结果(似乎我错过了什么)
下面是我分享的代码片段:

这些是来自列表中时间序列的多个 Dataframe ,我将其进一步简化为仅使用整个列表中的一列

from tslearn.neighbors import KNeighborsTimeSeriesClassifier
from tslearn.metrics import dtw
import pandas as pd
import numpy as np          
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split

print(timeseries())
     OUTPUT : /
    time          IR         TC  \
         0      0.006361   111.089076  36.395268   
         1      0.012713   108.589543  36.389164   
         2      0.018961   107.910312  36.387853   
         3      0.025192   107.363165  36.389093   
         4      0.031445    106.785048  36.381344   
         ...         ...    ...      ...      ...    
         
         
                         p         TS    IRtime  
         0        4.318834  44.917064  09:15:15  
         1        4.522443  45.028859  09:15:15  
         2        4.485727  45.021396  09:15:15  
         3        4.518629  45.351248  09:15:15  
         4        4.513145  45.645672  09:15:15  
         ...           ...        ...       ...  
        
        [9589 rows x 10 columns],
                    time          IR         TC  \
         0      0.006373      75.354227  38.953333   
         1      0.012679      74.493989  38.968091   
         2      0.018946      76.143107  38.969021   
         3      0.025177      77.940211  38.962893   
         4      0.031404      79.705939  38.965134   
         ...         ...    ...      ...      ...    
         
                         p         TS    IRtime  
         0        4.519344  33.986072  09:16:23  
         1        4.551769  34.114317  09:16:23  
         2        4.522443  34.183959  09:16:23  
         3        4.535080  34.111575  09:16:23  
         4        4.532219  34.109334  09:16:23  
         ...           ...        ...       ...  
        
         
         [8376 rows x 10 columns],

ts = timeseries()
[i.drop(columns=['time','IRtime','value','value.1','value.2','value.3','IR','TS','p'],inplace = True) for i in ts]
X = []
for i in ts:
    i = i.values
    X.append(i.flatten())
y = labels()['target'].values 
X = np.array(X)
y = np.array(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(X_train) 
 O> [array([36.39526801, 36.38916449, 36.38785319, ..., 39.40492146,
        39.40108292, 40.43806081]),
 array([38.95333278, 38.96809089, 38.96902072, ..., 40.1875067 ,
        40.1795912 , 40.18588545]),
 array([39.6719503 , 39.67082973, 39.66928001, ..., 40.43901449,
        40.43760782, 40.43856149]),
 array([39.82344148, 39.81049535, 39.80937479, ..., 40.63313492,
        40.64379223, 40.62316902]),
 array([40.0663662 , 40.07699967, 40.06004811, ..., 40.88702689,
        40.89880477, 40.89603912]),

# My X_train and X_test looks exactly the same 
 print(y_train)

O>array([0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1,
       1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1]

knn = KNeighborsTimeSeriesClassifier(n_neighbors=2,metric =dtw)
knn.fit(X_train, y_train)

Error : 
TypeError: only size-1 arrays can be converted to Python scalars

The above exception was the direct cause of the following exception:

ValueError: setting an array element with a sequence.

我的问题如下:
问题1.如何解决此问题?
问题2:他们的任何其他库是否执行以下计算距离矩阵并对其进行分类的操作?(我也尝试使用dtai来查找距离矩阵,但不明白如何在分类中使用该矩阵,因为我在尝试拟合模型时遇到了同样的问题)
Q3.我想在动态时间扭曲中实现多维(多特征),即IR,TC,TS一起,并进行分类。有什么方法可以让它工作吗?

zaqlnxep

zaqlnxep1#

关于Q1,使用tslearnto_time_series_dataset实用函数可能是值得的,以便将数据集转换为KNeighborsTimeSeriesClassifier的适当格式。
关于Q2和Q3,我最近发布了我的包Sequentia的一个稳定版本,它提供了使用动态时间规整和隐马尔可夫模型的序列分类器。而DTW-kNN分类器支持具有不同持续时间的多变量序列。kNN分类器通过计算训练序列和被分类的新序列之间的DTW距离的距离矩阵来工作,然后使用该距离矩阵运行kNN算法。这些预测可以被多次处理,并使用来自dtaidistance的快速纯C编译函数进行DTW计算。
下面是一个基本示例,它将DTW-kNN分类器拟合到类0/1中具有不同长度的二维序列上。fit/predict函数希望输入是连接到一个数组中的所有序列,并且长度应单独提供。

import numpy as np
from sequentia.models import KNNClassifier

# Sequences
X = np.array([
    # Sequence 1 - Length 3
    [1.2 , 7.91],
    [1.34, 6.6 ],
    [0.92, 8.08],
    # Sequence 2 - Length 5
    [2.11, 6.97],
    [1.83, 7.06],
    [1.54, 5.98],
    [0.86, 6.37],
    [1.21, 6.6 ]
])

# Sequence lengths
lengths = np.array([3, 5])

# Sequence classes
y = np.array([0, 1])

# Create and fit a classifier
clf = KNNClassifier(k=1, use_c=True, n_jobs=-1).fit(X, y, lengths)

# Predict classes for sequences
y_pred = clf.predict(X, lengths)

# Calculate accuracy
acc = clf.score(X, y, lengths)

相关问题