This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def sample(args): | |
| z_mean, z_log_var = args | |
| batch = K.shape(z_mean)[0] | |
| dim = K.int_shape(z_mean)[1] | |
| epsilon = K.random_normal(shape=(batch, dim)) | |
| return z_mean + K.exp(0.5 * z_log_var) * epsilon | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # decoder model | |
| latent_inputs = Input(shape=(latent_dim,), name='z_sampling') | |
| x = Dense(intermediate_dim, activation='relu')(latent_inputs) | |
| outputs = Dense(original_dim, activation='sigmoid')(x) | |
| # Instantiate the decoder model: | |
| decoder = Model(latent_inputs, outputs, name='decoder') | |
| decoder.summary() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # full VAE model | |
| outputs = decoder(encoder(inputs)) | |
| vae_model = Model(inputs, outputs, name='vae_mlp') | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # the KL loss function: | |
| def vae_loss(x, x_decoded_mean): | |
| # compute the average MSE error, then scale it up, ie. simply sum on all axes | |
| reconstruction_loss = K.sum(K.square(x - x_decoded_mean)) | |
| # compute the KL loss | |
| kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.square(K.exp(z_log_var)), axis=-1) | |
| # return the average loss over all | |
| total_loss = K.mean(reconstruction_loss + kl_loss) | |
| return total_loss |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| opt = optimizers.Adam(learning_rate=0.0001, clipvalue=0.5) | |
| vae_model.compile(optimizer=opt, loss=vae_loss) | |
| vae_model.summary() | |
| # Finally, we train the model: | |
| results = vae_model.fit(X_train, X_train, | |
| shuffle=True, | |
| epochs=32, | |
| batch_size=256) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| X_train_pred = vae_model.predict(X_train) | |
| error_thresh = np.quantile(mae_vector, 0.99) | |
| mae_vector = get_error_term(X_train_pred, X_train, _rmse=False) | |
| X_test_pred = vae_model.predict(X_test) | |
| mae_vector_test = get_error_term(X_pred, X_test, _rmse=False) | |
| anomalies = (mae_vector_test > error_thresh) | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def perm(orig_str, new_str=""): | |
| if(len(new_str) == len(orig_str)): | |
| print(new_str) | |
| else: | |
| for char in orig_str: | |
| if(char not in new_str): | |
| perm(orig_str, new_str + char) | |
| # another version | |
| def perm(orig_str, new_str=""): |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import ml.dmlc.xgboost4j.LabeledPoint | |
| import ml.dmlc.xgboost4j.scala.{Booster, DMatrix, XGBoost} | |
| // Load model from binary file | |
| object Classifier { | |
| var model: Option[Booster] = None | |
| def Init(modelFile:String): Unit = { | |
| if (model.isEmpty) { | |
| model = Some(XGBoost.loadModel(modelFile)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| private def getInputVector(rawVector:Seq[Float]): DMatrix = { | |
| val nRows = 1 | |
| val nCols = rawVector.length | |
| val missingVal = Float.NaN | |
| new DMatrix(rawVector.toArray[Float], nRows, nCols, missingVal) | |
| } | |
| def predict(recordID:String, features:Seq[Float]): (String, Float) = { | |
| val xgbInput = getInputVector(features) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def getStreamTopology(inputTopic:String):Topology = { | |
| val builder = new StreamsBuilder() | |
| val reqStream = builder.stream[String, PredictRequest](inputTopic) | |
| reqStream | |
| .map( (_, request) => { | |
| Classifier.predict(request.recordID, request.featuresVector) | |
| }) | |
| .split() |