首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >博客 | 手把手带你实现 室内用户移动预测(附python代码)

博客 | 手把手带你实现 室内用户移动预测(附python代码)

作者头像
AI研习社
发布于 2019-05-08 09:51:50
发布于 2019-05-08 09:51:50
50800
代码可运行
举报
文章被收录于专栏:AI研习社AI研习社
运行总次数:0
代码可运行

本文原载于微信公众号:磐创AI(ID:xunixs),欢迎关注磐创AI微信公众号及AI研习社博客专栏。 作者:小韩

介绍

大多数的时间序列数据主要用于交易生成预测。无论是预测产品的需求量还是销售量,航空公司的乘客数量还是特定股票的收盘价,我们都可以利用时间序列技术来预测需求。

随着生成的数据量呈指数级增长,尝试新思想和算法的机会也随之增加。使用复杂的时间序列数据集仍然是一个待开发的领域。

这篇文章的目的就是介绍时间序列分类的新概念。我们将首先了解该概念的含义和在行业中的应用。我们不会只停留在理论部分,还会通过处理时间序列数据集并执行分类解决实际问题。一边做一边学有助于以实际的操作来理解概念。

目录:

  • 时间序列分类简介 1. ECG / EEG信号分类 2. 图像分类 3. 运动传感器数据分类
  • 描述问题场景
  • 查看数据集
  • 预处理
  • 建立分类模型

时间序列分类简介

时间序列分类实际上已经存在了一段时间。但到目前为止,它主要用于实验室研究,而不是行业应用。目前有很多正在进行的研究,新创建的数据集,许多新的算法。当我第一次接触到到时间序列分类概念时,最初的想法是:我们怎样对时间序列进行分类以及时间序列分类数据是什么样的?我相信你一定也想知道。

可以想象,时间序列分类数据与常规分类问题不同,因为它的属性是有序序列。让我们来看看一些时间序列分类用例,了解它们之间的差异。

1. ECG / EEG信号分类

心电图(ECG, electrocardiogram),用于记录心脏的电活动,并广泛用于诊断各种心脏问题。使用外部电极捕获这些ECG信号。

例如,考虑以下信号样本,它代表一个心跳的电活动。左侧图像表示正常心跳,而相邻的图像表示心肌梗塞。

从电极捕获的数据将是时间序列的形式,并且信号可以分类为不同的类别。我们还可以对记录大脑电活动的脑电信号进行分类。

2. 图像分类

图像也可以是时间顺序相关的。考虑以下的情况:

根据天气条件,土壤肥力,水的可用性和其他外部因素,作物在特定的田地中生长。在该区域上持续每天拍摄图片,持续5年,并标记在该区域上种植作物的名称。该数据集中的图像是在固定的时间间隔拍摄的,并且具有特定的顺序,这可能是对图像进行分类的重要因素。

3. 运动传感器数据分类

传感器生成高频数据,可以识别其范围内物体的移动。通过设置多个无线传感器并观察传感器中信号强度的变化,我们可以识别物体的运动方向。

你还知道哪些时间序列分类的应用吗?欢迎大家在文末留言。

描述问题场景

我们将专注于 “室内用户运动预测” 的问题。在该问题中,多个运动传感器被放置在不同的房间中,目标是从这些运动传感器捕获的频率数据中识别个体是否在房间之间移动。

两个房间一共有四个运动传感器(A1,A2,A3,A4)。请看下面的图像,其中说明了传感器在每个房间中的位置。一共设置了 3 对类似的房间(group1,group2,group3)。

一个人可以沿着上图所示的六个预定义路径中的任意一个移动。路径2, 3, 4或 6 是在房间内移动,路径 1 或 5 在房间之间移动。

传感器的读数可以识别人在某个时间点的位置。当人在房间内或在房间内移动时,传感器中的读数会发生变化。改变化可用于标识人员的路径。

现在问题已经表述清楚了,是时候开始编码了!在下一节中,我们会查看该问题的数据集,有助于使该问题更加清晰。数据集:室内用户移动预测。

查看数据集

数据集一共包含316个文件:

  • 314 个 MovementAAL csv 文件,包含环境中的运动传感器的读数。
  • 一个 Target csv 文件,包含每个 MovementAAL 文件的目标变量。
  • 一个 Group Data csv 文件,用于标识 MovementAAL 文件属于哪一个组。
  • Path csv 文件包含目标采取的路径。

首先看一下数据集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1import pandas as pd
2import numpy as np
3%matplotlib inline
4import matplotlib.pyplot as plt
5from os import listdir
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1from keras.preprocessing import sequence
2import tensorflow as tf
3from keras.models import Sequential
4from keras.layers import Dense
5from keras.layers import LSTM
6
7from keras.optimizers import Adam
8from keras.models import load_model
9from keras.callbacks import ModelCheckpoint

在加载所有文件之前先快速浏览一下要处理的数据。读取移动数据的前两个文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1df1 = pd.read_csv('/MovementAAL/dataset/MovementAAL_RSS_1.csv')
2df2 = pd.read_csv('/MovementAAL/dataset/MovementAAL_RSS_2.csv')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1df1.head()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1df2.head()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1df1.shape, df2.shape
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1((27, 4), (26, 4))

这些文件包含了四个传感器的标准化数据 —— A1,A2,A3,A4。csv 文件的长度(行数)不同,是因为对应的持续时间不同。为方便起见,我们假设每秒都会收集到传感器数据。第一次变化持续时间为27秒(27行),而另一次变化为26秒(26行)。

在建立模型之前,我们必须处理这种不同的长度。以下的代码用于读取和存储传感器的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1path = 'MovementAAL/dataset/MovementAAL_RSS_'
2sequences = list()
3for i in range(1,315):
4    file_path = path + str(i) + '.csv'
5    print(file_path)
6    df = pd.read_csv(file_path, header=0)
7    values = df.values
8    sequences.append(values)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1targets = pd.read_csv('MovementAAL/dataset/MovementAAL_target.csv')
2targets = targets.values[:,1]

现在有一个名为 'sequences' 的列表,包含了运动传感器的数据和目标——csv文件的标签。sequences[0] 中的数据就是第一个csv文件中获取传感器的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1sequences[0]

如上所述,数据集是在三对不同的房间中收集的,所以有三组数据。正好可以将数据集划分为训练集,测试集和验证集。现在加载 DatasetGroup csv 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1groups = pd.read_csv('MovementAAL/groups/MovementAAL_DatasetGroup.csv', header=0)
2groups = groups.values[:,1]

前两组的数据用于训练 ,第三组用于测试。

预处理

由于时间序列数据的长度不同,我们不能直接在数据集上建立模型。那么怎样确定合适的长度呢?我们可以通过多种方发处理。这里有一些简单的想法(欢迎在评论区提出批评和建议):

  • 用零填充较短的序列使所有序列的长度相等。这种方式下,我们向模型提供了不正确的数据
  • 找到序列的最大长度,使用它最后一行中的数据填充
  • 确定数据集中序列的最小长度,将其他所有的序列截断为该长度。这将损失大量的数据
  • 取所有长度的平均值,截断较长的序列,填充较短的序列

获取最小,最大和平均序列长度:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1len_sequences = []
2for one_seq in sequences:
3    len_sequences.append(len(one_seq))
4pd.Series(len_sequences).describe()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1count    314.000000
2mean      42.028662
3std       16.185303
4min       19.000000
525%       26.000000
650%       41.000000
775%       56.000000
8max      129.000000
9dtype: float64

大多数文件的长度在 40 到 60 之间。只有 3 个文件的长度超过 100。因此,采用最小或最大的长度没有太大意义。第 90 个四分位数是 60,可以将它作为所有序列的长度。代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1### 用最长序列的最后一行的数据填充较短的序列
 2to_pad = 129
 3new_seq = []
 4for one_seq in sequences:
 5    len_one_seq = len(one_seq)
 6    last_val = one_seq[-1]
 7    n = to_pad - len_one_seq
 8
 9    to_concat = np.repeat(one_seq[-1], n).reshape(4, n).transpose()
10    new_one_seq = np.concatenate([one_seq, to_concat])
11    new_seq.append(new_one_seq)
12final_seq = np.stack(new_seq)
13
14# 截断较长的序列
15from keras.preprocessing import sequence
16seq_len = 60
17final_seq=sequence.pad_sequences(final_seq, maxlen=seq_len, padding='post', dtype='float', truncating='post')

然后根据分组将数据集分开,准备训练集,验证集和测试集:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1train = [final_seq[i] for i in range(len(groups)) if (groups[i]==2)]
2validation = [final_seq[i] for i in range(len(groups)) if groups[i]==1]
3test = [final_seq[i] for i in range(len(groups)) if groups[i]==3]
4
5train_target = [targets[i] for i in range(len(groups)) if (groups[i]==2)]
6validation_target = [targets[i] for i in range(len(groups)) if groups[i]==1]
7test_target = [targets[i] for i in range(len(groups)) if groups[i]==3]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1train = np.array(train)
 2validation = np.array(validation)
 3test = np.array(test)
 4
 5train_target = np.array(train_target)
 6train_target = (train_target+1)/2
 7
 8validation_target = np.array(validation_target)
 9validation_target = (validation_target+1)/2
10
11test_target = np.array(test_target)
12test_target = (test_target+1)/2

建立分类模型

我们已经准备了用于 LSTM(长短期记忆)模型的数据,处理了不同长度的序列并创建了训练集,验证集和测试集。接下来就要建立一个单层 LSTM 网络。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1model = Sequential()
2model.add(LSTM(256, input_shape=(seq_len, 4)))
3model.add(Dense(1, activation='sigmoid'))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1model.summary()

训练模型并验证准确率:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1adam = Adam(lr=0.001)
2chk = ModelCheckpoint('best_model.pkl', monitor='val_acc', save_best_only=True, mode='max', verbose=1)
3model.compile(loss='binary_crossentropy', optimizer=adam, metrics=['accuracy'])
4model.fit(train, train_target, epochs=200, batch_size=128, callbacks=[chk], validation_data=(validation,validation_target))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1# 加载模型,用测试集验证准确性
2model = load_model('best_model.pkl')
3
4from sklearn.metrics import accuracy_score
5test_preds = model.predict_classes(test)
6accuracy_score(test_target, test_preds)

最后准确度得分为0.78846153846153844。这是一个相当良好的开端,但我们还可以通过使用超参数,改变学习速率或迭代次数改善 LSTM 模型的性能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
考研数学综合题9
分析:利用等式构造高阶函数的导数值,再利用泰勒展开进行函数的近似简化,利用定义构造极限求出
用户9628320
2022/11/23
3300
考研竞赛每日一练 day 10 一道考察极限基本解法的综合题
进行化简,可知对原式可以用重要极限,而后,对于后面的极限,可以考虑加项减项进行拆分,再用等价无穷小或者泰勒展开即可。
用户9628320
2022/11/23
2830
考研竞赛每日一练 day 14 一道利用递推关系进行证明的极限题
一道利用递推关系进行证明的极限题 证明: \lim\limits_{n\rightarrow \infty}[\dfrac{3\cdot 7\dotsb(4n-1)}{5\cdot 9\dotsb(4n+1)}]^2=\displaystyle 3\dfrac{\int_{0}^{\frac{\pi}{2}}\sin^{\frac{3}{2}}xdx}{\int_{0}^{\frac{\pi}{2}}\sin^{\frac{1}{2}}xdx} 【解析】:设 I_{y}=\displaystyle \in
用户9628320
2022/11/23
4310
考研竞赛每日一练 day 18 利用洛必达分部求解以及泰勒展开两种方法求解一道等价无穷小的极限好题
【分析】:思路一:直接根据等价无穷列出极限,利用洛必达法则再分部求解;思路二:题目给出的是五阶等价,可以考虑利用泰勒展开,再按照系数的关系列出方程,求解即可。
用户9628320
2022/11/23
3990
考研竞赛每日一练 day 4 一道极限题目的计算
一道极限题目的计算 求极限 \displaystyle \lim\limits_{x \rightarrow 0}\left(\frac{\displaystyle\int_{0}^{x}e^{-t}\cos tdt}{\ln^2(1+x)}-\frac{1}{x}\right) 【解析】:设原式为 ,则有 \begin{align*}\displaystyle I&=\lim\limits_{x \rightarrow 0}\dfrac{\displaystyle x\int_{0}^{x}e^{-t
用户9628320
2022/11/23
2810
考研竞赛每日一练 day 41 利用中值定理以及数列极限的证明处理一道函数极限的综合题
分析:(1)可以利用构造函数的方法,再利用罗尔定理和零点定理构造条件证出等式;(2)可以利用利用单调有界准则证明极限存在。
用户9628320
2022/11/23
2630
考研竞赛每日一练 day 40 一道级数收敛的综合问题
一道级数收敛的综合问题 已知 \displaystyle\dfrac{a^{'}_{n}(x)}{\cos x}=\sum_{k=1}^{n}(k+1)\sin^{k}x , x\in[0,\dfrac{\pi}{2}) , a_{n}(0)=0 . (1)证明数列 \{a_{n}(1)\} 收敛;(2)若级数 \displaystyle\sum_{n=1}^{\infty}(-1)^{n}\dfrac{1}{n^{p}a_{n}(1)} 条件收敛,求常数 p 的取值范围. 解:(1)根据题意,变形得 \d
用户9628320
2022/11/23
3160
考研竞赛每日一练 day 13 回归基础的几道极限小题
回归基础的几道极限小题 1.求极限 \lim\limits_{x\rightarrow 0}\dfrac{\sqrt{1+x^2}-\sqrt{1+2\sin^2x}}{\tan^2x} 2.求 \lim\limits_{x\rightarrow 0}\dfrac{1}{x^3}[(\dfrac{2+\cos x}{3})^x-1] 3.求 \lim\limits_{x\rightarrow 0}(\dfrac{4+2e^{\frac{2}{x}}}{2+3e^{\frac{2}{x}}}+\dfrac
用户9628320
2022/11/23
3120
考研竞赛每日一练 day 38 关于函数的渐近线和极值问题的两道考研题
分析:此题给出的函数是隐函数,直接求函数渐近线是求不出来的,所以可以先设函数的渐近线方程,再利用条件去求未知参数。
用户9628320
2022/11/23
6860
考研竞赛每日一练 day 17 道有关反三角函数的极限三种求解方法
【分析】:此此题可以考虑三种思路,(1)利用拉格朗日中值定理进行计算,(2)利用反三角函数的差的展开公式对原式进行变形,再利用等价无穷小得出,(3)利用洛必达法加上泰勒展开求解。
用户9628320
2022/11/23
6480
大学生数学竞赛非数专题四(2)
专题四 多元积分学 (2) 4.2 交换二重积分的次序 4.5 (北京市1994年竞赛题) 设 f(x,y) 是定义在区域 0 \leq x \leq 1,0 \leq y \leq 1 上的二元函数, f(0,0)=0 ,且在 (0,0) 处 f(x,y) 可微,求极限 \lim\limits_{x\rightarrow 0^{+}} \dfrac{\displaystyle\int_{0}^{x^2}dt\int_{x}^{\sqrt{t}}f(t,u)du}{1-e^{-\frac{x^2}{4
用户9628320
2022/11/23
3610
考研竞赛每日一练 day 8 一道利用极限定义以及泰勒展开加级数判别法证明级数收敛性的问题
【分析】:第一问,首先考虑导数的定义,证明级数是正项级数,再利用题中的极限条件,构造级数的比较法来证明;第二问通过一般项,利用二阶导数的定义,再利用泰勒展开公式,同理构造一个等价的级数,间接利用来证明。
用户9628320
2022/11/23
4560
考研竞赛每日一练 day 36 利用三角函数周期性以及夹逼定理处理一道极限好题
利用三角函数周期性以及夹逼定理处理一道极限好题 求极限 \displaystyle \lim\limits_{x\rightarrow +\infty}\dfrac{ \int_{0}^{x}|\arcsin(\sin t)|dt}{x} . 解析:考虑变限积分 \displaystyle \int_{0}^{x}|\arcsin(\sin t)|dx ,由于反正弦函数的周期性, |\arcsin{\sin (t+\pi)}|=|\arcsin(-\sin t)|=|\arcsin(\sin t)| 因此
用户9628320
2022/11/23
4610
考研竞赛每日一练 day 12 两道带有参数的极限计算求解题
【分析】:首先根据极限形式,判断为无穷大减去无穷大,可利用倒代换,将极限变成0比0型,再利用极限存在的性质,进行计算。
用户9628320
2022/11/23
4920
大学生数学竞赛非数专题二(6)
好了,题目就到这里了,注意洛必达应用的条件,以及e的重要极限,注意积累。有问题留言.
用户9628320
2022/11/23
3190
考研竞赛每日一练 day 7 一道考察极限加幂级数收敛域以及幂级数的性质的综合题
收敛,且极限存在,再根据幂级数的收敛半径与收敛域的关系,利用已经得到的数列极限去算收敛半径,得出收敛域,但是在端点处单独讨论。
用户9628320
2022/11/23
3160
考研竞赛每日一练 day 3 一道定积分定义计算问题
一道定积分定义计算问题(汤帅10套强化模拟卷) 计算: \displaystyle\lim\limits_{n \rightarrow \infty}\sum_{i=1}^{n}\dfrac{i}{n^2}(1+\cos \dfrac{i\pi}{n})^2 【考点】:定积分定义,定积分的换元法,以及三角函数定积分计算公式 【解析】:由定积分的定义知,记原式为 , \begin{align*}\displaystyle I&=\int_{0}^{1}x(1+\cos x\pi)^2dx=\frac{1}
用户9628320
2022/11/23
5250
考研竞赛每日一练 day 34 中值定理中参数的计算(本质中值转化为极限的计算)
本题在考研以及竞赛中是非常老的题型,综合运用中值定理以及极限的计算来进行考察,注意式子的变形。
用户9628320
2022/11/23
5540
武忠祥老师每日一题|第224 - 239题
先考虑一下 交换积分次序 的手段,能否解决这个问题(答案是显然的,因为积分域是一个三角形)
一只野生彩色铅笔
2022/09/20
8570
武忠祥老师每日一题|第320 - 335题
代入 初值: -1 = f(0) = -1 + C C = 0 f(x) = x - 1
一只野生彩色铅笔
2022/09/20
2.2K0
推荐阅读
考研数学综合题9
3300
考研竞赛每日一练 day 10 一道考察极限基本解法的综合题
2830
考研竞赛每日一练 day 14 一道利用递推关系进行证明的极限题
4310
考研竞赛每日一练 day 18 利用洛必达分部求解以及泰勒展开两种方法求解一道等价无穷小的极限好题
3990
考研竞赛每日一练 day 4 一道极限题目的计算
2810
考研竞赛每日一练 day 41 利用中值定理以及数列极限的证明处理一道函数极限的综合题
2630
考研竞赛每日一练 day 40 一道级数收敛的综合问题
3160
考研竞赛每日一练 day 13 回归基础的几道极限小题
3120
考研竞赛每日一练 day 38 关于函数的渐近线和极值问题的两道考研题
6860
考研竞赛每日一练 day 17 道有关反三角函数的极限三种求解方法
6480
大学生数学竞赛非数专题四(2)
3610
考研竞赛每日一练 day 8 一道利用极限定义以及泰勒展开加级数判别法证明级数收敛性的问题
4560
考研竞赛每日一练 day 36 利用三角函数周期性以及夹逼定理处理一道极限好题
4610
考研竞赛每日一练 day 12 两道带有参数的极限计算求解题
4920
大学生数学竞赛非数专题二(6)
3190
考研竞赛每日一练 day 7 一道考察极限加幂级数收敛域以及幂级数的性质的综合题
3160
考研竞赛每日一练 day 3 一道定积分定义计算问题
5250
考研竞赛每日一练 day 34 中值定理中参数的计算(本质中值转化为极限的计算)
5540
武忠祥老师每日一题|第224 - 239题
8570
武忠祥老师每日一题|第320 - 335题
2.2K0
相关推荐
考研数学综合题9
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验