load library and start h2o

library(h2o)
h2o.init()
 Connection successful!

R is connected to the H2O cluster: 
    H2O cluster uptime:         2 hours 8 minutes 
    H2O cluster version:        3.14.0.3 
    H2O cluster version age:    25 days  
    H2O cluster name:           H2O_started_from_R_r631758_lcl606 
    H2O cluster total nodes:    1 
    H2O cluster total memory:   3.32 GB 
    H2O cluster total cores:    8 
    H2O cluster allowed cores:  8 
    H2O cluster healthy:        TRUE 
    H2O Connection ip:          localhost 
    H2O Connection port:        54321 
    H2O Connection proxy:       NA 
    H2O Internal Security:      FALSE 
    H2O API Extensions:         Algos, AutoML, Core V3, Core V4 
    R Version:                  R version 3.4.2 (2017-09-28) 
h2o.removeAll()
[1] 0

import ECG data

train_ecg <- h2o.importFile( path = "http://h2o-public-test-data.s3.amazonaws.com/smalldata/anomaly/ecg_discord_train.csv", header = FALSE, sep = ",")

  |                                                                                           
  |                                                                                     |   0%
  |                                                                                           
  |=====================================================================================| 100%
test_ecg<-h2o.importFile(path="http://h2o-public-test-data.s3.amazonaws.com/smalldata/anomaly/ecg_discord_test.csv", header = FALSE, sep = ",")

  |                                                                                           
  |                                                                                     |   0%
  |                                                                                           
  |=====================================================================================| 100%

Train deep autoencoder learning model on “normal”

training data, y ignored

anomaly_model<-h2o.deeplearning(x=names(train_ecg),training_frame = train_ecg,activation="Tanh",autoencoder = TRUE,hidden=c(50,20,50),sparse=TRUE,l1=1e-4,epochs=100)

  |                                                                                           
  |                                                                                     |   0%
  |                                                                                           
  |=====================================================================================| 100%

Compute reconstruction erro with the Anomaly

detection app (MSE between output and input layers)

Pull reconstruction error data into R and plot to find outliers (last 3 heartbeats)

recon_error<-as.data.frame(recon_error)
recon_error
plot.ts(recon_error)

Note: Testing =reconstructin the test dataset

test_recon<-h2o.predict(anomaly_model,test_ecg)

  |                                                                                           
  |                                                                                     |   0%
  |                                                                                           
  |=====================================================================================| 100%
head(test_recon)
h2o.shutdown()
LS0tDQp0aXRsZTogIkVDRyBBbm9tYWx5IERldGVjdGlvbiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiNsb2FkIGxpYnJhcnkgYW5kIHN0YXJ0IGgybw0KYGBge3J9DQpsaWJyYXJ5KGgybykNCmgyby5pbml0KCkNCmgyby5yZW1vdmVBbGwoKQ0KYGBgDQoNCiNpbXBvcnQgRUNHIGRhdGENCmBgYHtyfQ0KdHJhaW5fZWNnIDwtIGgyby5pbXBvcnRGaWxlKCBwYXRoID0gImh0dHA6Ly9oMm8tcHVibGljLXRlc3QtZGF0YS5zMy5hbWF6b25hd3MuY29tL3NtYWxsZGF0YS9hbm9tYWx5L2VjZ19kaXNjb3JkX3RyYWluLmNzdiIsIGhlYWRlciA9IEZBTFNFLCBzZXAgPSAiLCIpDQp0ZXN0X2VjZzwtaDJvLmltcG9ydEZpbGUocGF0aD0iaHR0cDovL2gyby1wdWJsaWMtdGVzdC1kYXRhLnMzLmFtYXpvbmF3cy5jb20vc21hbGxkYXRhL2Fub21hbHkvZWNnX2Rpc2NvcmRfdGVzdC5jc3YiLCBoZWFkZXIgPSBGQUxTRSwgc2VwID0gIiwiKQ0KdHJhaW4uUjwtYXMuZGF0YS5mcmFtZSh0cmFpbl9lY2cpDQoNCmBgYA0KDQojIFRyYWluIGRlZXAgYXV0b2VuY29kZXIgbGVhcm5pbmcgbW9kZWwgb24gIm5vcm1hbCINCiMgdHJhaW5pbmcgZGF0YSwgeSBpZ25vcmVkDQpgYGB7cn0NCmFub21hbHlfbW9kZWw8LWgyby5kZWVwbGVhcm5pbmcoeD1uYW1lcyh0cmFpbl9lY2cpLHRyYWluaW5nX2ZyYW1lID0gdHJhaW5fZWNnLGFjdGl2YXRpb249IlRhbmgiLGF1dG9lbmNvZGVyID0gVFJVRSxoaWRkZW49Yyg1MCwyMCw1MCksc3BhcnNlPVRSVUUsbDE9MWUtNCxlcG9jaHM9MTAwKQ0KYGBgDQoNCiNDb21wdXRlIHJlY29uc3RydWN0aW9uIGVycm8gd2l0aCB0aGUgQW5vbWFseQ0KIyBkZXRlY3Rpb24gYXBwIChNU0UgYmV0d2VlbiBvdXRwdXQgYW5kIGlucHV0IGxheWVycykNCmBgYHtyfQ0KcmVjb25fZXJyb3I8LWgyby5hbm9tYWx5KGFub21hbHlfbW9kZWwsdGVzdF9lY2cpDQpgYGANCg0KI1B1bGwgcmVjb25zdHJ1Y3Rpb24gZXJyb3IgZGF0YSBpbnRvIFIgYW5kIHBsb3QgdG8gZmluZCBvdXRsaWVycyAobGFzdCAzIGhlYXJ0YmVhdHMpDQpgYGB7cn0NCnJlY29uX2Vycm9yPC1hcy5kYXRhLmZyYW1lKHJlY29uX2Vycm9yKQ0KcmVjb25fZXJyb3INCnBsb3QudHMocmVjb25fZXJyb3IpDQpgYGANCg0KI05vdGU6IFRlc3RpbmcgPXJlY29uc3RydWN0aW4gdGhlIHRlc3QgZGF0YXNldA0KYGBge3J9DQp0ZXN0X3JlY29uPC1oMm8ucHJlZGljdChhbm9tYWx5X21vZGVsLHRlc3RfZWNnKQ0KaGVhZCh0ZXN0X3JlY29uKQ0KYGBgDQoNCg0KDQoNCg0KYGBge3J9DQpoMm8uc2h1dGRvd24oKQ0KYGBgDQoNCg==