对时间序列数据使用 K-NN 分类方法?

数据挖掘 神经网络 聚类 无监督学习
2022-03-11 12:49:08

我有一个数据集,其中包含水流随时间变化的时间序列数据。我有一个连接到厨房水龙头的流量计,我正在尝试对特定的用水事件进行聚类或分类。

每秒收集一次数据,在每一行中,我都会得到一个流过我的流量计的加仑量的值。

例如,我正在尝试对某人洗手、给茶壶倒茶、洗碗等进行分类……

这是我可以使用 k-NN 分类方法对这些事件进行聚类的东西吗?如果基于聚类的方法不好,那么还有什么其他分类方法对这种类型的数据有好处?

如果我进行一些实验,我可以对每个事件进行分类并将其转化为监督学习问题。但目前,没有任何水事件被分类。

我的数据集的一个非常精简的版本如下所示:

时间序列用水量

编辑

water = pd.DataFrame(shower1)
rng = pd.date_range('2016-09-01 00:00:00', '2016-09-30 23:59:58', freq='S')
water = water.reindex(rng,fill_value=0.0)
water = water['shower1']
df = pd.DataFrame({'time_stamp':rng,'water_amount':water})

starts = (df['water_amount']>0)&(df['water_amount'].shift(1)==0) #find all starts of events
n_events = sum(starts) #total number of events
df.loc[starts,'event_number'] = range(1,n_events+1) #numerate starts from 1 to n
df['event_number'] = df['event_number'].fillna(method='pad').fillna(-1) #forward fill all the values
df.loc[df['water_amount']==0,'event_number']=-1 #set all event numbers to -1 where the water amount is 0

df.groupby('event_number').agg({'time_stamp':'first',
                                    'water_amount':'sum'}) #feature matrix

在此处输入图像描述

2个回答

在事件开始和结束时(基本上只要有一系列正值)查看数据似乎很清楚。所以,我建议不要从一些复杂的模型开始,而是计算一些简单的特征(比如事件的长度、水的总量、水量/秒、到上一个事件的时间、从记录开始起以秒为单位的一天中的时间)对于每个事件,然后在该新数据上尝试一些聚类算法。k-NN 甚至可能产生一些有意义的东西。但是功能的统计摘要可能已经让您更好地了解如何进一步解决这个问题。

编辑1

import pandas as pd
import numpy as np

rng = pd.date_range('2017-01-01 14:00:00', '2017-01-01 14:01:00', freq='S')
water = [0,0,0.2,0.3,0.4,0,0,0.3,0.2,0.5]*6+[0]
df = pd.DataFrame({'time_stamp':rng,'water_amount':water,'event_number':np.zeros(len(water))})

j = 1
for k in range(len(df)):
    if df.ix[k,'water_amount']== 0:
        df.ix[k,'event_number'] = -1
    else:
        if df.ix[k-1,'water_amount'] > 0:
            df.ix[k,'event_number'] = df.loc[k-1,'event_number']
        else:
            df.ix[k,'event_number'] = j
            j = j+1


df.groupby('event_number').agg({'time_stamp':'first',
                                'water_amount':'sum'}) #feature matrix

编辑2

rng = pd.date_range('2017-01-01 14:00:00', '2017-01-01 14:01:00', freq='S')
water = [0,0,0.2,0.3,0.4,0,0,0.3,0.2,0.5]*6+[0]
df = pd.DataFrame({'time_stamp':rng,'water_amount':water})

starts = (df['water_amount']>0)&(df['water_amount'].shift(1)==0) #find all starts of events
n_events = sum(starts) #total number of events
df.loc[starts,'event_number'] = range(1,n_events+1) #numerate starts from 1 to n
df['event_number'] = df['event_number'].fillna(method='pad').fillna(-1) #forward fill all the values
df.loc[df['water_amount']==0,'event_number']=-1 #set all event numbers to -1 where the water amount is 0

df.groupby('event_number').agg({'time_stamp':'first',
                                    'water_amount':'sum'}) #feature matrix

不要忘记预处理您的数据。

比如做特征提取n

  • 总水量
  • 期间
  • 方差