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.
import numpy as np
import pandas as pd
import mogptk
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 consisting of measurement for the 9 sensors at 60Hz, with 500 samples per channel, while the person is in a bike.
df = pd.read_csv('data/HAR/Smartphone_Dataset/S05/bike3.csv', header=None)
y = df.values
t = (np.arange(0, 500) / 60)
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]))
# 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())
model = mogptk.MOSM(data, Q=5)
model.init_parameters('LS')
model.plot_spectrum();
model.plot_prediction(title='Untrained model | Subject 5 Bike 3');
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
model.plot_prediction(title='Trained model | Subject 5 Bike 3');
Example consisting of measurement for the 9 sensors at 60Hz, with 500 samples per channel, while the person is walking.
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]))
# 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())
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
model.plot_prediction(title='Trained model | Subject 1 walking 2');