Human Activity Recognition example¶

Aerobic actions were recorded from subjects using the Inertial Measurement Unit (IMU) on an Apple iPhone 4 smartphone. The IMU includes a 3D accelerometer, gyroscope, and magnetometer. Each sample was taken at 60Hz, and manually trimmed to 500 samples (8.33s) to eliminate starting and stopping movements. The iPhone was always clipped to the belt on the right hand side.

Each file contains 500 rows each with the following information: Acc_x, Acc_y, Acc_z, Gyr_x, Gyr_y, Gyr_z, Mag_x, Mag_y, Mag_z.

In [1]:
import numpy as np
import pandas as pd
import mogptk

MOGP prediction on the sensor values¶

We use each of the nine sensor's values as channel, leaving us with nine channels to fit using multi output Gaussian processes in order to find cross correlations between the channels.

Example 1: cycling¶

Example consisting of measurement for the 9 sensors at 60Hz, with 500 samples per channel, while the person is in a bike.

In [2]:
df = pd.read_csv('data/HAR/Smartphone_Dataset/S05/bike3.csv', header=None)

y = df.values
t = (np.arange(0, 500) / 60)
In [3]:
cols = ['Acc_x', 'Acc_y', 'Acc_z', 'Gyr_x', 'Gyr_y', 'Gyr_z', 'Mag_x', 'Mag_y', 'Mag_z']

data = mogptk.DataSet()
for i in range(9):
    data.append(mogptk.Data(t, y[:, i], name=cols[i]))

Simulate sensor failure¶

In [4]:
# randomly sample from the data
for channel in data:
    channel.remove_randomly(pct=0.7)
    
# drop chunks to simulate sensor failure
data[0].remove_range(None, 1)
data[1].remove_range(0.5, 1.2)
data[2].remove_range(7, None)
data[3].remove_range(7.5, None)
data[4].remove_range(7.5, None)
data[6].remove_range(4, 4.3)
data[7].remove_range(1, 2.3)
data[8].remove_range(4.5, 6)

data.transform(mogptk.TransformDetrend())

Create model¶

In [5]:
model = mogptk.MOSM(data, Q=5)
model.init_parameters('LS')
model.plot_spectrum();
In [6]:
model.plot_prediction(title='Untrained model | Subject 5 Bike 3');

Model training¶

In [7]:
model.train(method='Adam', lr=0.05, iters=200, verbose=True);
Starting optimization using Adam
‣ Model: MOSM
‣ Channels: 9
‣ Parameters: 234
‣ Training points: 1209
‣ Initial loss: 442.123

Start Adam:
    0/200   0:00:00  loss=     442.123
    2/200   0:00:02  loss=      379.01
    4/200   0:00:03  loss=     384.361
    6/200   0:00:05  loss=     367.518
    8/200   0:00:06  loss=     360.257
   10/200   0:00:08  loss=     344.258
   12/200   0:00:09  loss=     338.427
   14/200   0:00:11  loss=     323.757
   16/200   0:00:12  loss=     309.861
   18/200   0:00:14  loss=     294.077
   20/200   0:00:15  loss=     280.944
   22/200   0:00:17  loss=     269.175
   24/200   0:00:18  loss=     254.103
   26/200   0:00:20  loss=     241.094
   28/200   0:00:21  loss=     231.281
   30/200   0:00:23  loss=     219.997
   32/200   0:00:25  loss=     208.252
   34/200   0:00:26  loss=     201.933
   36/200   0:00:28  loss=     186.112
   38/200   0:00:29  loss=     169.628
   40/200   0:00:31  loss=     166.576
   42/200   0:00:32  loss=      149.75
   44/200   0:00:34  loss=     147.565
   46/200   0:00:36  loss=     134.833
   48/200   0:00:38  loss=     122.618
   50/200   0:00:40  loss=     110.193
   52/200   0:00:43  loss=     104.848
   54/200   0:00:45  loss=     93.5718
   56/200   0:00:48  loss=     83.0174
   58/200   0:00:50  loss=     74.2288
   60/200   0:00:53  loss=      67.459
   62/200   0:00:55  loss=     66.5032
   64/200   0:00:57  loss=     62.6432
   66/200   0:01:00  loss=     54.2436
   68/200   0:01:02  loss=     45.9054
   70/200   0:01:05  loss=     41.8418
   72/200   0:01:08  loss=     33.6792
   74/200   0:01:11  loss=     18.6512
   76/200   0:01:14  loss=     10.1633
   78/200   0:01:17  loss=     4.94473
   80/200   0:01:19  loss=   -0.882379
   82/200   0:01:22  loss=    -6.67776
   84/200   0:01:26  loss=    -21.1813
   86/200   0:01:30  loss=    -25.0966
   88/200   0:01:33  loss=    -28.2797
   90/200   0:01:37  loss=    -35.1981
   92/200   0:01:40  loss=    -43.4775
   94/200   0:01:43  loss=    -45.7602
   96/200   0:01:46  loss=     -58.817
   98/200   0:01:48  loss=    -65.1821
  100/200   0:01:50  loss=    -68.8268
  102/200   0:01:53  loss=    -75.8016
  104/200   0:01:55  loss=    -84.6976
  106/200   0:01:58  loss=    -79.9203
  108/200   0:02:00  loss=    -83.1468
  110/200   0:02:03  loss=     -88.303
  112/200   0:02:05  loss=     -93.233
  114/200   0:02:08  loss=    -95.9786
  116/200   0:02:11  loss=    -98.4935
  118/200   0:02:13  loss=    -108.479
  120/200   0:02:16  loss=    -117.728
  122/200   0:02:18  loss=    -125.481
  124/200   0:02:21  loss=    -126.683
  126/200   0:02:23  loss=    -130.857
  128/200   0:02:26  loss=    -134.056
  130/200   0:02:27  loss=    -131.258
  132/200   0:02:29  loss=    -135.613
  134/200   0:02:30  loss=    -138.234
  136/200   0:02:32  loss=    -139.509
  138/200   0:02:33  loss=    -146.752
  140/200   0:02:35  loss=    -157.728
  142/200   0:02:37  loss=     -164.22
  144/200   0:02:39  loss=    -166.543
  146/200   0:02:40  loss=    -170.679
  148/200   0:02:42  loss=    -176.969
  150/200   0:02:43  loss=    -179.914
  152/200   0:02:45  loss=    -182.906
  154/200   0:02:47  loss=    -181.715
  156/200   0:02:48  loss=    -183.525
  158/200   0:02:50  loss=    -187.121
  160/200   0:02:51  loss=     -194.12
  162/200   0:02:53  loss=    -201.869
  164/200   0:02:55  loss=     -193.35
  166/200   0:02:56  loss=    -203.927
  168/200   0:02:58  loss=    -198.486
  170/200   0:02:59  loss=    -204.898
  172/200   0:03:01  loss=    -218.376
  174/200   0:03:02  loss=    -219.457
  176/200   0:03:04  loss=     -224.86
  178/200   0:03:05  loss=    -233.127
  180/200   0:03:07  loss=    -238.435
  182/200   0:03:09  loss=    -243.807
  184/200   0:03:10  loss=    -242.602
  186/200   0:03:12  loss=    -239.622
  188/200   0:03:14  loss=    -191.805
  190/200   0:03:15  loss=    -238.172
  192/200   0:03:17  loss=    -238.934
  194/200   0:03:18  loss=    -234.749
  196/200   0:03:20  loss=    -244.658
  198/200   0:03:22  loss=    -249.504
  200/200   0:03:23  loss=    -248.431
Finished

Optimization finished in 3 minutes 23 seconds
‣ Iterations: 200
‣ Final loss: -248.431
In [8]:
model.plot_prediction(title='Trained model | Subject 5 Bike 3');

Example 2: walking¶

Example consisting of measurement for the 9 sensors at 60Hz, with 500 samples per channel, while the person is walking.

In [9]:
df = pd.read_csv('data/HAR/Smartphone_Dataset/S01/walking2.csv', header=None)

y = df.values
t = np.arange(0, 500) / 60

data = mogptk.DataSet()
for i in range(9):
    data.append(mogptk.Data(t, y[:, i], name=cols[i]))
In [10]:
# randomly sample from the data
for channel in data:
    channel.remove_randomly(pct=0.7)
    
# drop chunks to simulate sensor failure
data[0].remove_range(None, 1)
data[1].remove_range(0.5, 1.2)
data[2].remove_range(7, None)
data[3].remove_range(7.5, None)
data[4].remove_range(7.5, None)
data[6].remove_range(4, 4.3)
data[7].remove_range(1, 2.3)
data[8].remove_range(4.5, 6)

data.transform(mogptk.TransformDetrend())
In [11]:
model = mogptk.MOSM(data, Q=3)
model.init_parameters('LS')
model.train(method='Adam', lr=0.05, iters=1000, verbose=True);
Starting optimization using Adam
‣ Model: MOSM
‣ Channels: 9
‣ Parameters: 144
‣ Training points: 1207
‣ Initial loss: 462.258

Start Adam:
     0/1000   0:00:00  loss=     462.258
    10/1000   0:00:12  loss=     510.269
    20/1000   0:00:21  loss=     451.026
    30/1000   0:00:29  loss=     395.166
    40/1000   0:00:37  loss=     424.155
    50/1000   0:00:45  loss=      373.85
    60/1000   0:00:53  loss=     342.937
    70/1000   0:01:00  loss=     325.597
    80/1000   0:01:07  loss=     301.452
    90/1000   0:01:16  loss=     303.343
   100/1000   0:01:25  loss=     299.282
   110/1000   0:01:32  loss=      277.27
   120/1000   0:01:40  loss=     258.603
   130/1000   0:01:48  loss=     240.976
   140/1000   0:01:55  loss=     240.527
   150/1000   0:02:04  loss=     285.311
   160/1000   0:02:13  loss=     251.152
   170/1000   0:02:22  loss=     238.559
   180/1000   0:02:32  loss=     243.639
   190/1000   0:02:41  loss=     253.974
   200/1000   0:02:50  loss=     228.515
   210/1000   0:02:59  loss=     224.435
   220/1000   0:03:09  loss=     211.008
   230/1000   0:03:17  loss=     203.586
   240/1000   0:03:25  loss=     196.927
   250/1000   0:03:33  loss=     192.881
   260/1000   0:03:41  loss=     191.271
   270/1000   0:03:49  loss=     197.695
   280/1000   0:03:57  loss=     201.457
   290/1000   0:04:04  loss=     197.273
   300/1000   0:04:12  loss=     194.353
   310/1000   0:04:19  loss=     189.041
   320/1000   0:04:26  loss=     196.521
   330/1000   0:04:33  loss=     186.102
   340/1000   0:04:40  loss=     181.306
   350/1000   0:04:48  loss=     251.776
   360/1000   0:04:56  loss=      214.51
   370/1000   0:05:06  loss=     205.233
   380/1000   0:05:13  loss=     200.353
   390/1000   0:05:21  loss=     190.295
   400/1000   0:05:32  loss=     192.716
   410/1000   0:05:43  loss=     197.725
   420/1000   0:05:55  loss=     200.173
   430/1000   0:06:03  loss=     190.068
   440/1000   0:06:12  loss=     186.175
   450/1000   0:06:20  loss=      182.84
   460/1000   0:06:27  loss=     176.406
   470/1000   0:06:34  loss=     176.408
   480/1000   0:06:41  loss=      169.98
   490/1000   0:06:49  loss=     166.147
   500/1000   0:06:57  loss=     191.693
   510/1000   0:07:07  loss=     174.387
   520/1000   0:07:19  loss=     171.914
   530/1000   0:07:27  loss=     164.992
   540/1000   0:07:36  loss=     159.773
   550/1000   0:07:45  loss=     158.898
   560/1000   0:07:54  loss=     156.634
   570/1000   0:08:03  loss=     157.703
   580/1000   0:08:12  loss=     161.737
   590/1000   0:08:24  loss=     162.046
   600/1000   0:08:39  loss=     159.118
   610/1000   0:08:53  loss=     157.538
   620/1000   0:09:07  loss=     162.295
   630/1000   0:09:20  loss=     156.792
   640/1000   0:09:34  loss=     168.037
   650/1000   0:09:50  loss=     160.204
   660/1000   0:10:08  loss=     156.561
   670/1000   0:10:29  loss=     156.429
   680/1000   0:10:50  loss=     153.912
   690/1000   0:11:08  loss=     156.014
   700/1000   0:11:27  loss=     158.824
   710/1000   0:11:46  loss=     161.447
   720/1000   0:12:04  loss=      155.95
   730/1000   0:12:21  loss=     151.876
   740/1000   0:12:41  loss=     151.884
   750/1000   0:13:01  loss=     152.033
   760/1000   0:13:21  loss=     157.136
   770/1000   0:13:37  loss=     157.811
   780/1000   0:13:54  loss=     151.339
   790/1000   0:14:13  loss=     157.214
   800/1000   0:14:32  loss=     167.092
   810/1000   0:14:52  loss=     156.969
   820/1000   0:15:13  loss=     149.107
   830/1000   0:15:36  loss=     146.042
   840/1000   0:16:03  loss=     150.064
   850/1000   0:16:29  loss=     152.398
   860/1000   0:16:54  loss=     148.611
   870/1000   0:17:17  loss=     140.951
   880/1000   0:17:43  loss=     143.014
   890/1000   0:18:06  loss=     143.011
   900/1000   0:18:23  loss=     140.738
   910/1000   0:18:41  loss=     138.858
   920/1000   0:18:59  loss=     138.389
   930/1000   0:19:17  loss=     138.418
   940/1000   0:19:34  loss=     138.156
   950/1000   0:19:51  loss=     141.805
   960/1000   0:20:06  loss=     141.527
   970/1000   0:20:22  loss=     142.753
   980/1000   0:20:36  loss=     139.712
   990/1000   0:20:50  loss=     142.446
  1000/1000   0:21:03  loss=     144.021
Finished

Optimization finished in 21 minutes 3 seconds
‣ Iterations: 1000
‣ Final loss: 144.021
In [12]:
model.plot_prediction(title='Trained model | Subject 1 walking 2');
In [ ]: