Skip to content

Instantly share code, notes, and snippets.

@marty1885
Last active August 5, 2019 16:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marty1885/e7f5eacb17a1c328cf0f4ae2ed9ea648 to your computer and use it in GitHub Desktop.
Save marty1885/e7f5eacb17a1c328cf0f4ae2ed9ea648 to your computer and use it in GitHub Desktop.
Etaler_API_example.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Etaler API Notebook\n",
"Well.. This is a prototype notebook/toturial heavily borrowing from [NuPIC-Algorithm-API-Example](https://github.com/psdyer/NuPIC-Algorithm-API-Example/blob/master/algorithm_api_example.ipynb) demonstrating how Etaler works and hopefully shows the difference between Etaler and NuPIC. Also includes some of my comments about why Etaler/the API is designed that way.\n",
"\n",
"The code here is written to work with Etaler 0.1.1, which includes a lot more feature and bug fixes so v0.1 won't do and later release will also not work due to API changes. You also have to run this notebook under [ROOT](https://root.cern.ch) with C++17 enabled. You'll have to build ROOT yourself unless you're running Arch Linux based distro, which have C++17 enabled in the ROOT package in the official distro by default.\n",
"\n",
"Etaler is **NOT** NuPIC. They have very different design philosophies and goals. Don't expect too much resemblance.\n",
"\n",
"Also, this notebook is written to run with ROOT. Which, have a few extension to C++ to make it script friendly.\n",
"\n",
"1. when assigning to an undeclared variable. An `auto` in inserted.\n",
" * `x = 1;`. If x is not declared, ROOT turns it into `auto x = 1;`\n",
" * This helps with running a chunk of code several times.\n",
" * As running `int x = 1;` multiple times will cause a redefinition error\n",
"2. semi-column is not necessarily needed.\n",
" * When no semi-column exists at the end of an expression. ROOT prints the result of the expression.\n",
"3. Automatically includes everything in STL and ROOT, and imports the `std` namespace\n",
"\n",
"**Important note** I have found some bug in Etaler since writing this notebook, **DO NOT** use this notebook as a reference."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"// We need xtensor, which is an equlivent of numpy in C++\n",
"#include <xtensor/xarray.hpp>\n",
"#include <xtensor/xview.hpp>\n",
"#include <xtensor/xmath.hpp>\n",
"\n",
"// Load Etaler, please modidy this to point to your Etaler.so file on your system\n",
"#pragma cling load(\"/usr/local/lib/libEtaler.so\")\n",
"\n",
"// And include the headers\n",
"#include <Etaler/Etaler.hpp>\n",
"#include <Etaler/Algorithms/TemporalMemory.hpp>\n",
"#include <Etaler/Algorithms/SpatialPooler.hpp>\n",
"#include <Etaler/Algorithms/SDRClassifer.hpp>\n",
"#include <Etaler/Algorithms/Anomaly.hpp>\n",
"#include <Etaler/Encoders/Category.hpp>\n",
"#include <Etaler/Encoders/GridCell1d.hpp>\n",
"#include <Etaler/Encoders/GridCell2d.hpp>\n",
"using namespace et;\n",
"\n",
"// Set ROOT global style settings\n",
"new TCanvas(); //Make a dummy canvas to force ROOT setup stuff\n",
"gStyle->SetOptStat(0);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Encoding data\n",
"Unlike NuPIC, Etaler only implements a few fundamental encoders while user is responsible to chain them together. As I found that providing advanced encoders like DateTimeEncoder, GeoEncoder results in way to many parameter when constructing the object. This way the API is cleaner and there is less code to maintain.\n",
"\n",
"Etaler supports your standard ScalerEncoder and CategoryEncoder. And Etaler provides GridCell1d and GridCell2d encoders for encoding arbitrary 1d and 2d values.\n",
"\n",
"The following HTMSchool video series should help you grasp what encoders are and what are gird cells.\n",
"\n",
"Episode 1: [Bit Arrays](https://www.youtube.com/watch?v=XMB0ri4qgwc) <br>\n",
"Episode 5: [Scalar Encoding](https://www.youtube.com/watch?v=V3Yqtpytif0) <br>\n",
"Episode 14: [Grid Cells](https://www.youtube.com/watch?v=mP7neeymcUY)\n",
"\n",
"**For NuPIC users:** In Etaler, encoding is done by calling a function. Unlike how you need to instantiate encoders in NuPIC."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}\n"
]
}
],
"source": [
"// For example, we want to encode the value 50 using the 1D Grid Cell encoder\n",
"t = encoder::gridCell1d(50);\n",
"cout << t << endl;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Did you see the scattered 1s? Those are our encoded value. Let's try another way to visualize the SDR"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"//Let's make a function to help up to plot the SDR\n",
"plot_sdr = function([](string name, Tensor t)\n",
"{\n",
" auto c1 = new TCanvas(name.c_str(), \"canvas\", 1200, 360);\n",
" auto xs = xt::eval(xt::linspace<float>(0, t.size(), t.size()));\n",
" auto ys = t.cast(DType::Float).toHost<float>();\n",
" auto g1 = new TGraph(t.size(), xs.data(), ys.data());\n",
" auto color = TColor::GetColor(\"#1f77b4\");\n",
" g1->SetLineColor(color);\n",
" g1->SetTitle(\"plot of SDR\");\n",
" g1->SetLineWidth(2);\n",
" g1->Draw();\n",
" c1->Draw();\n",
" //No need to delete the pointers, ROOT handles that for us\n",
"});"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_sdr(\"plot1\", t);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Yeah... It's a bit long and verbose. But what are you expecting anyway. It's C++. It is already amazing C++ can run on a notebook. Moving on."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Encoding multiple values\n",
"Being able to encode a value into SDR is good and all. But we need to be able to handle multiple variables at the same time! Easy, just concatenate them together!"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}\n"
]
}
],
"source": [
"t = encoder::gridCell1d(50);\n",
"q = encoder::category(2, /*num_categories=*/4, /*bits_per_category=*/30);\n",
"combined_sdr = concat({t, q});\n",
"cout << combined_sdr << endl;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"See? Encoding is a lot easier that it is in NuPIC, where you need to a) create numpy arrays, and b) call the encoder to encode stuff.\n",
"\n",
"We can now plot the SDR again. Now you see the continuous sections of on bits created by the category encoder."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_sdr(\"plot2\", combined_sdr);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before going to the next section. Let's make a simple function to encode data for us."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"encode = function([](float value, size_t category)\n",
"{\n",
" return concat({encoder::gridCell1d(value), encoder::category(category, 4, 30)});\n",
"});"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Spatial Pooling\n",
"\n",
"Now we have been able to convert values into SDRs, we can now pass those SDRs into a SpatiaPooler to reduce redundant information. A SpatialPooler essentially is a dimension reduction/clustering algorithm. You might want to see these HTM School episodes.\n",
"\n",
"Episode 2: [SDR Capacity & Comparison](https://www.youtube.com/watch?v=ZDgCdWTuIzc) <br>\n",
"Episode 3: [SDR Overlap Sets and Subsampling](https://www.youtube.com/watch?v=vU2OZdgBXAQ) <br>\n",
"Episode 4: [SDR Sets & Unions](https://www.youtube.com/watch?v=8WIzIBaLXIs) <br>\n",
"Episode 7: [Spatial Pooling: Input Space & Connections](https://www.youtube.com/watch?v=R5UoFNtv5AU) <br>\n",
"Episode 8: [Spatial Pooling: Learning](https://www.youtube.com/watch?v=rHvjykCIrZM) <br>\n",
"Episode 9: [Boosting](https://www.youtube.com/watch?v=MSwoNAODrgk) <br>\n",
"Episode 10: [Topology](https://www.youtube.com/watch?v=HTW2Q_UrkAw)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You already watched them? Great! Now we need to create an instance of a SpatialPooler. There are may variables one can set to alter the SpatialPooler's behavior. But for simplicity, we'll be using the defaults for now and only chaining what we have to."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, \n",
" { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \n",
" { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \n",
" { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, \n",
" { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0}}\n"
]
}
],
"source": [
"x = encode(0, 0);\n",
"\n",
"//The spatial pooler takes in a SDR and generates a 16x16 SDR as output.\n",
"sp = SpatialPooler(x.shape(), {16, 16});\n",
"sp.setGlobalDensity(0.04);\n",
"y = sp.compute(x);\n",
"cout << y << std::endl;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Instead of looking at the bit arrays, let's create a nice 2-D visualization to view the encoder output and the SDR."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"plot_sp = function([](string name, Tensor t, SpatialPooler& sp)\n",
"{\n",
" auto y = sp.compute(t);\n",
" intmax_t im_t_len = intmax_t(ceil(sqrt(t.size())));\n",
" \n",
" auto c = new TCanvas(name.c_str(), \"canvas\", 1200, 700);\n",
" c->Divide(2, 1);\n",
" \n",
" auto h1 = new TH2F((name+\"h1\").c_str(), \"plot of input\", im_t_len, -1, 1, im_t_len, -1, 1);\n",
" auto t_content = t.toHost<uint8_t>();\n",
" for(size_t i=0;i<t_content.size();i++)\n",
" h1->Fill(to_string(i%im_t_len).c_str(), to_string(i/im_t_len).c_str(), (float)t_content[i]+0.0001);\n",
" c->cd(1);\n",
" h1->Draw(\"col\");\n",
" \n",
" auto h2 = new TH2F((name+\"h2\").c_str(), \"plot of output\", 16, -1, 1, 16, -1, 1);\n",
" auto y_content = y.toHost<uint8_t>();\n",
" for(size_t i=0;i<y_content.size();i++)\n",
" h2->Fill(to_string(i%16).c_str(), to_string(i/16).c_str(), (float)y_content[i]+0.0001);\n",
" c->cd(2);\n",
" h2->Draw(\"col\");\n",
" \n",
" c->Draw();\n",
"});"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_sp(\"plot3\", encode(0, 0), sp);"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_sp(\"plot4\", encode(0.1, 0), sp);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nice! You can see how the encoding changes a bit when the input changes. And how the output of the Spatial Pooler changes as the encoding changes."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Temporal Memory\n",
"\n",
"The TemporalMemory algorithm is a sequence memory. It tries to learn whatever you feed it and attempts to predict what you'll be sending in the next time step. You'll want to see these HTM school episodes first.\n",
"\n",
"Episode 11: [Temporal Memory Part 1](https://www.youtube.com/watch?v=UBzemKcUoOk) \n",
"Episode 12: [Temporal Memory Part 2](https://www.youtube.com/watch?v=1OhY_u3NjdM)\n",
"\n",
"### Vocabularies\n",
"\n",
"Before we start with the Temporal Memory algorithm. You might have notice that I use a different vocabulary than the NuPIC notebook uses. This is because I come from a Computer Science background and wants to generalize concepts as much as possible. The main differences are (hopefully I got them all):\n",
"\n",
"#### SDR\n",
"\n",
"SDR (Sparse Distributed Representation) in the original NuPIC notebook meant a sparse binary array. Which I do agree. But instead of calling the result of encoder(s) encoding and what the SpatialPooler spits out a SDR. I tend to call every binary array a SDR, as long as they are sparse.\n",
"\n",
"As I found seprating them is really confusing for beginners. There is absolutely no reason why yon can't shuffle the results of an encoder directly into a TM.\n",
"\n",
"#### Cells and Columns\n",
"\n",
"To me, Cells meant the actual neuron we are simulating. And column (called mini-columns sometimes) strictly meant the entire column of cells in a TemporalMemory layer. (ie. Cells are the fundamental unit of operation and columns are fromed from cells. They are in two different dimensions)\n",
"\n",
"So, unlike in NuPIC, I don't say \"the columns in SpatialPooler\" as in Etaler's implementation. No columns are used in a Spatial Pooler. There are cells in a SpatialPooler and they might be on of off.\n",
"\n",
"#### Columns and cortical columns\n",
"We won't talk about cortical columns much in this notebook. But I guess it'll be best to address it early. Cortical columns refer to a group of cells aligned vertically in the Neocortex that can be penetrated by a probe. See the [Wikipedia article](https://en.wikipedia.org/wiki/Cortical_column) for details. And columns here refer to columns existing in the Temporal Memory layer.\n",
"\n",
"Buuuut. But how could I know when someone is taking about cortical columns and Temporal Memory columns? Well, it depends on the context. But in most cases, they are talking about Temporal Memory columns.\n",
"\n",
"#### (Stolen from NuPIC notebook) A Very Important Thing You Should Know About SP's and TM's Learning Simultaneously\n",
"In short, if the SP is still learning, the TM will be trying to learn on (possibly) inconsistent representations (depending on how your SP is set up). To see why this might give you trouble, consider an example where you can't read and I'm helping you memorize a written speech.\n",
"\n",
"I (the SP) am translating the written words (the encoding) into speech (SDRs) for you (the TM) to memorize. The speech is long, so we'll have to do many repetitions. If, during one of the repetitions, I suddenly start using a different language for some of the words, you're going to be confused; those words weren't part of the speech. Well, they are, but I just chose to translate them differently. In other words, the input encodings haven't changed, but the SP changed the SDRs to represent them, and the TM has never seen these SDRs before.\n",
"\n",
"In summary, it is probably preferable to let the SP learn on the data domain for a while to let it settle on how it will represent the input data. Once that's achieved, you can turn off its learning and start training the TM."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"tem = TemporalMemory(/*input_shape=*/Shape{48}, /*cells_per_column=*/16);\n",
"// Unfortunatelly I can't use the normal `tm` name here as tm is a member of the std namespace."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Anyway, Etaler implements the old Temporal Memory algorithm back from 2011, according to the [HTM whitepaper](https://numenta.org/resources/HTM_CorticalLearningAlgorithms.pdf). So the TM here has less feature then the one in NuPIC has. But it also have less problem learning some sequences due to modifications."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Running the TM\n",
"\n",
"Given an input SDR `x`, we can call `tem.compute(x, last_active)` which will return a pair of tensors. The first being a map of the TemporalMemory's predictive cells, and the second being the active cells. And we can train the TM using `tem.learn(active, last_active)`.\n",
"\n",
"Now let's consider a very simple example. Making the TM to learn the sequence {0, 1, 2, 0, 1}."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKwAAASUCAIAAADF7ALeAAAABmJLR0QAAAAAAAD5Q7t/AAAgAElEQVR4nOzdwU1j2aKGUfxk6Q57SAg1gRSqjIRuDERAFqhdIgsyqByQ6iBCgBEZMH3Dmpw34DUXdbca5Guzwd9aI+TyUf8YJOvTPqYX8zwfAAAA0PA/owcAAADwfkQgAABAiAgEAAAIEYEAAAAhIhAAACBEBAIAAISIQAAAgBARCAAAECICAQAAQkQgAABAiAgEAAAIEYEAAAAhIhAAACBEBAIAAISIQAA4ODg4mKZpmqbRKwBg50QgAPtsmqb1ev3Gp03TtFqtdr4JAIZazPM8egMA7Mpqtbq5ufn58+c/191qtXo6Bnz+AgD21XL0AADYob+e7z033ssHb25unh90HgjAfhOBAIS8/ODfG+8UBYA94zOBALRMf3j54Ldv357/1TEgAPvNZwIB2HOLxetvdi9PBX0mEID9JgIBAABC3A4KAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQshw9gINfv34bPQF4xfHp1egJALAPHm7P5nkevaLOSSAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCFvM8j95Qt1gsRk8AAIB3IkCGE4EAAAAhbgcFAAAIEYEAAAAhIhAAACBEBAIAAISIQAAAgBARCAAAECICAQAAQkQgAABAiAgEAAAIEYEAAAAhIhAAACBEBAIAAISIQAAAgBARCAAAECICAQAAQkQgAABAiAgEAAAIEYEAAAAhIhAAACBEBAIAAISIQAAAgBARCAAAECICAQAAQkQgAABAiAgEAAAIEYEAAAAhIhAAACBEBAIAAISIQAAAgBARCAAAECICAQAAQkQgAABAiAgEAAAIEYEAAAAhIhAAACBEBAIAAISIQAAAgBARCAAAECICAQAAQkQgAABAiAgEAAAIEYEAAAAhIhAAACBEBAIAAISIQAAAgBARCAAAECICAeA/pmkaPQEAdksEArDnpmlar9dvfObJycmO5wDAYCIQgD23Xq+/f//+liM+x4AAFCzmeR69AQB2aJqmPx0GPsfearX605MXC++MAOy55egBAPCunprw+es33ikKAHtDBAKQ8w8ngQCw99z0AsD+e/tN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AECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAgRgQAAACEiEAAAIEQEAgAAhIhAAACAEBEIAAAQIgIBAABCRCAAAECICAQAAAhZzPM8ekPdYrEYPQEAAN6JABlOBAIAAIS4HRQAACBEBAIAAISIQAAAgBARCAAAECICAQAAQkQgAABAiAgEAAAIEYEAAAAhIhAAACBEBAIAAISIQAAAgBARCAAAECICAQAAQkQgAABAiAgEAAAIEYEAAAAhIhAAACBEBAIAAISIQAAAgBARCAAAECICAQAAQkQgAABAiAgEAAAIEYEAAAAhIhAAACBEBAIAAISI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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"last_active = zeros({48, 16}, DType::Bool); // A veriable to store the intermid state\n",
"last_pred = zeros({48, 16}, DType::Bool);\n",
"\n",
"c2 = new TCanvas(\"c2\", \"canvas\", 1200, 1200);\n",
"c2->Divide(1, 5);\n",
"for(int i=0;i<5;i++) {\n",
" Tensor x = encoder::category(i%3, 3, 16);\n",
" auto [pred, active] = tem.compute(x, last_pred); //Ask the TM to make predictions\n",
" \n",
" auto pred_vec = pred.toHost<uint8_t>();\n",
" auto active_vec = active.toHost<uint8_t>();\n",
" auto title = \"t = \" + to_string(i);\n",
" auto g1 = new TH2F((\"tm_plot_\"+to_string(i)).c_str(), title.c_str(), 48, 0, 1, 16, 0, 1);\n",
" for(int j=0;j<48*16;j++) {\n",
" float value = 0.00001;\n",
" if(active_vec[j])\n",
" value = 1;\n",
" else if(pred_vec[j])\n",
" value = 0.5;\n",
" \n",
" g1->Fill(to_string(j/16).c_str(), to_string(j%16).c_str(), value);\n",
" }\n",
"\n",
" c2->cd(i+1);\n",
" g1->Draw(\"col A\");\n",
" \n",
" tem.learn(active, last_active);\n",
" last_active = active;\n",
" last_pred = pred;\n",
"}\n",
"\n",
"c2->Draw();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(If you are using the default ROOT pallet) the green-colored cells are the cells are in a predictive state, and the yellow ones are in an active state.\n",
"\n",
"As you see, the TemporalMemory algorithm started out not being able to predict what the sequence is, then it gradually learns what could be happening in the future."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Classifying SDRs and Getting Predictions\n",
"\n",
"So now you have the three main component of HTM. Encoder, SpatialPooler and TemporalMemory. But how could we make sense of those SDRs? I mean, we can do so easily if there is only one encoder and one TemporalMemory involved. How about the cose where multiple encoders and a SpatialPooler is involved? Well.. there's no biologically way to extract the meaning of SDRs now. (or [is it?](https://discourse.numenta.org/t/experimenting-with-stacking-spatial-poolers))\n",
"\n",
"The solution provided in Etaler is to use a SDRClassifer. Unlike NuPIC, where SDRClassifer is actually a Neural Network. Etaler implements the old CLA Classifer. Which calculates the overlap score of the training data and the given SDR, then returns whatever have the best match.\n",
"\n",
"TBH, I don't use the functionality much. But [in some cases](https://discourse.numenta.org/t/handling-extremely-unbalienced-dataset-using-sdr-nearest-neighbor/5104) SpatialPooler + SDR(CLA)Classifer outperforms other ML algorithms when dealing with extremely unbalanced datasets."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The pattern encode(0.1, 0) looks like pattern encode(0, 0)\n"
]
}
],
"source": [
"classifer = SDRClassifer(/*input_shape=*/{16, 16}, /*num_classes=*/4);\n",
"\n",
"//Train the classifer with 4 different patterns\n",
"for(int i=0 ;i<4;i++)\n",
" classifer.addPattern(sp.compute(encode(i, i)), i);\n",
"\n",
"size_t best_match = classifer.compute(sp.compute(encode(0.1, 0)));\n",
"std::cout << \"The pattern encode(0.1, 0) looks like pattern encode(\"\n",
" << best_match << \", \" << best_match << \")\" << std::endl;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Detecting Anomalies\n",
"\n",
"Let's consider 1-step predictions. When the TM makes a prediction, it does so by marking a set of cells it predicts will become active on the next step in the sequence. When the next time step comes, the actual input comes into the TM, we compare what the actual input against what the TM is predicting. The percentage of active columns that were not predicted by the TM is defined as the **anomaly score**. An anomaly score of 0.0 means no anomaly is suspected, and a score of 1.0 means an anomaly is definitely suspected.\n",
"\n",
"Consider a TM that takes 50 input bits. Say the TM made completely incorrect predictions; that is, it got none of the active columns correct. Then the percentage of active columns not predicted is 50/50 = 1.0. That works. And if the TM makes a completely correct prediction, the percentage of active columns not predicted is 0/50 = 0.0. That also works. So the number of correct predictions varies inversely with the anomaly score (as it should).\n",
"\n",
"**Note:** There's an more advanced method called **anomaly likelihood** in NuPIC. But Etaler don't have it implemented as this notebook is written. So we won't discuss that."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"// Like the SDRClassifier, let's run a test on some made-up data\n",
"// We'll make a nice repeating pattern, then throw in a spatial anomaly,\n",
"// then throw in a temporaly anomaly before reverting to the normal pattern\n",
"\n",
"// Make a sine wave with two anomalies\n",
"_pi = 3.14159;\n",
"p = xt::eval(xt::arange<float>(0,100*2*_pi,2*_pi/20));\n",
"swave = xt::xarray<float>(xt::sin(p));\n",
"xt::view(swave, 1110) = 1; // spatial anomaly\n",
"xt::view(swave, xt::range(1280,1700)) = xt::sin(xt::view(p, xt::range(1280,1700))*3); // temporal anomaly\n",
"\n",
"// Plot the sine wave\n",
"color = TColor::GetColor(\"#1f77b4\");\n",
"c3 = new TCanvas(\"c3\", \"canvas\", 2000, 1200);\n",
"c3->Divide(1, 2);\n",
"\n",
"g1 = new TGraph(p.size(), p.data(), swave.data());\n",
"g1->SetLineColor(color);\n",
"g1->SetLineWidth(3);\n",
"g1->SetTitle(\"sine wave\");\n",
"\n",
"g2 = new TGraph(750, p.data()+1000, swave.data()+1000); //Zoom into the part with anomalies\n",
"g2->SetLineColor(color);\n",
"g2->SetLineWidth(3);\n",
"g2->SetTitle(\"Zoom into anomalies\");\n",
"\n",
"c3->cd(1);\n",
"c3->Pad()->SetLeftMargin(0.01);\n",
"c3->Pad()->SetRightMargin(0);\n",
"g1->Draw();\n",
"c3->cd(2);\n",
"c3->Pad()->SetLeftMargin(0.01);\n",
"c3->Pad()->SetRightMargin(0);\n",
"g2->Draw();\n",
"c3->Draw();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now where the anomaly is should be obvious. Now let's try to detect those anomalies!"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"input_shape = encoder::gridCell1d(0).shape();\n",
"num_columns = 16;\n",
"tem = TemporalMemory(input_shape, num_columns);\n",
"\n",
"last_active = zeros(input_shape + num_columns, DType::Bool);\n",
"last_predict = zeros(input_shape + num_columns, DType::Bool);\n",
"\n",
"anom_scores = vector<float>();\n",
"\n",
"// Perform anomaly detection over the entire array\n",
"for(auto value : swave) {\n",
" Tensor x = encoder::gridCell1d(value);\n",
" auto [pred, active] = tem.compute(x, last_predict);\n",
" \n",
" float anomaly_score = anomaly(last_predict.sum(1, DType::Bool), x);\n",
" last_predict = pred;\n",
" \n",
" tem.learn(active, last_active);\n",
" last_active = active;\n",
" \n",
" anom_scores.push_back(anomaly_score);\n",
"}\n",
"\n",
"// Plot our results\n",
"c4 = new TCanvas(\"c4\", \"canvas\", 2000, 600);\n",
"c4->Pad()->SetLeftMargin(0.01);\n",
"c4->Pad()->SetRightMargin(0);\n",
"\n",
"orange = TColor::GetColor(\"#ff7f0e\");\n",
"g3 = new TGraph(p.size(), p.data(), anom_scores.data());\n",
"g3->SetLineColor(orange);\n",
"g3->SetLineWidth(3);\n",
"g3->SetTitle(\"\");\n",
"\n",
"g1->Draw();\n",
"g3->Draw(\"same\");\n",
"\n",
"l1 = new TLegend(1,0.7,0.82,0.9);\n",
"l1->SetHeader(\"Legend\",\"C\"); \n",
"l1->AddEntry(g1,\"input signal\",\"l\");\n",
"l1->AddEntry(g3,\"anomaly score\",\"l\");\n",
"l1->Draw();\n",
"c4->Draw();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And... wow, the performance is amazing!\n",
"\n",
"After the initial learning phase, where the TM is familiarizing itself with the signal, TM maintains a very low anomaly score. Then we see a sudden spike around our first anomaly, where we force the value to be an 1. Then HTM sees normal sine waves, maintaining low scores. Afterwards, when we hit the second anomaly, the anomaly score rises up again then falles as HTM learns the new pattern, Then We see another spike when we transistion back from the new pattern back to the old one."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Putting It All Together\n",
"\n",
"Now we'll combine all the parts into one example. We'll use the community's favorite Hot Gym example!\n",
"\n",
"### Encoding\n",
"\n",
"The Hot Gym dataset consists of two columns. `timestamp` and `kw_energy_consumption`. Encoding `kw_energy_consumption` is easy, we can just send it trough a 1D grid cell encoder and we are clear. `timestamp` is a problem though. a) Etaler's doesn't come with a date time encoder and b) C++ only comes with date time functionality after C++20 (Which is not avaliable in 2019). Fortunately there are solutions for both problems! a) we can build our own date-time encoder and b) ROOT comes with date time utilities, we don't need C++20!\n",
"\n",
"### Spatial Pooler and Temporal Memory\n",
"\n",
"In this case, I'm going to turn on boosting and leave it on. This is the easiest to implement and the most biological setup. Hopefully it doesn't cause too much problem for the TM.\n",
"\n",
"### Anomaly Detection\n",
"The goal is to find the anomalies within the dataset. I'll be calculating the anomaly score of a given prediction, see weather if it is larger then a threshold. If so, mark it as an anomaly.\n",
"\n",
"### Loading the dataset\n",
"Unfortunately I tried both ROOT and xtensor's CSV perse, they both crash on the Hot Gym dataset. And the data isn't super consistent that the first two lines after the column names are not actual data. We'll have to parse the data our self. "
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"// A convetion function to parse time\n",
"parse_time = function([](string ts) -> TDatime\n",
"{\n",
" std::tm tm = {};\n",
"\n",
" strptime(ts.c_str(), \"%m/%d/%y %H:%M\", &tm);\n",
" char buffer[100];\n",
" strftime(buffer,sizeof(buffer),\"%Y-%m-%d %H:%M:%S\", &tm);\n",
" return TDatime(buffer);\n",
"});\n",
"\n",
"//And a split function since C++ doesn't give you one by default\n",
"split = function([](const std::string& str, char delim = ',')\n",
"{\n",
" std::size_t current, previous = 0;\n",
" vector<string> cont;\n",
" current = str.find(delim);\n",
" while (current != std::string::npos) {\n",
" cont.push_back(str.substr(previous, current - previous));\n",
" previous = current + 1;\n",
" current = str.find(delim, previous);\n",
" }\n",
" cont.push_back(str.substr(previous, current - previous));\n",
" return cont;\n",
"});\n",
"\n",
"\n",
"// Let's load the dataset fist\n",
"in = ifstream(\"rec-center-hourly.csv\");\n",
"\n",
"// Parse and store the dataset\n",
"timestamps = vector<TDatime>();\n",
"consumptions = vector<float>();\n",
"\n",
"csv_line = string();\n",
"while(getline(in, csv_line)) {\n",
" auto parts = split(csv_line, ',');\n",
" if(parts.size() == 0) continue;\n",
" \n",
" auto timestamp = parts[0];\n",
" auto consumption = parts[1];\n",
" \n",
" if(isalpha(timestamp[0])) continue; //Ignore non-data lines\n",
" \n",
" timestamps.push_back(parse_time(timestamp));\n",
" consumptions.push_back(stof(consumption));\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Great! We have the data parsed. Now let's see what we working with."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"c5 = new TCanvas(\"c5\", \"canvas\", 1200, 320);\n",
"\n",
"xs = xt::eval(xt::linspace<float>(0, consumptions.size(), consumptions.size()));\n",
"g4 = new TGraph(xs.size(), xs.data(), consumptions.data());\n",
"g4->SetLineWidth(2);\n",
"g4->SetLineColor(color);\n",
"g4->SetTitle(\"consumption\");\n",
"\n",
"c5->Pad()->SetLeftMargin(0.02);\n",
"c5->Pad()->SetRightMargin(0);\n",
"g4->Draw();\n",
"c5->Draw();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Seems we have parsed all the data. Let's make our self a date-time encoder. This will be different to what NuPIC has, but should work."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"encode_datetime = function([](TDatime t){\n",
" auto day = encoder::category(t.GetDayOfWeek()-1, 7, 6);\n",
" auto weekend = encoder::category(t.GetDayOfWeek() >= 6, 2, 8);\n",
" \n",
" // We can force a gridCell encoder to bt cyclic by limiting it's scaling ranges\n",
" float hour = t.GetHour(); //Since it is a hourly data\n",
" auto time_of_day = encoder::gridCell1d(hour, 6, 1, 6, /*scale=*/{1.f/24, 1.f/24.001});\n",
" \n",
" return cat({day, weekend, time_of_day});\n",
"});"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And now we can make an encoder to deal with the HotGym dataset."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"encode_hotgym = function([](TDatime t, float consumption) {\n",
" auto datetime = encode_datetime(t);\n",
" auto con = encoder::gridCell1d(consumption, 16, 1, 8, {5, 10});\n",
" return cat({datetime, con});\n",
"});"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's setup the network and see how well it works!"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"// Model paraleters\n",
"num_columns = 64; // We need more columns than NuPIC since Etaler don't have Segments.\n",
"sp_out_shape = Shape{1024};\n",
"input_shape = encode_hotgym(TDatime(\"2011-11-11 11:11:11\"), 0).shape();\n",
"\n",
"sp = SpatialPooler(input_shape, sp_out_shape);\n",
"tem = TemporalMemory(sp_out_shape, num_columns);\n",
"\n",
"last_active = zeros(sp_out_shape + num_columns, DType::Bool);\n",
"last_predict = zeros(sp_out_shape + num_columns, DType::Bool);\n",
"\n",
"anom_scores = vector<float>();\n",
"\n",
"// Perform anomaly detection\n",
"\n",
"for(size_t i=0;i<consumptions.size();i++) {\n",
" auto timestamp = timestamps[i];\n",
" auto consumption = consumptions[i];\n",
" \n",
" //Encode the data\n",
" Tensor x = encode_hotgym(timestamp, consumption);\n",
" \n",
" // Run the SP and TM\n",
" Tensor sp_out = sp.compute(x);\n",
" auto [pred, active] = tem.compute(sp_out, last_predict);\n",
" \n",
" float anomaly_score = anomaly(last_predict.sum(1, DType::Bool), sp_out);\n",
" last_predict = pred;\n",
" \n",
" // Apply learning\n",
" sp.learn(x, sp_out);\n",
" tem.learn(active, last_active);\n",
" last_active = active;\n",
" \n",
" anom_scores.push_back(anomaly_score);\n",
"}\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"// Plot the results\n",
"c6 = new TCanvas(\"c6\", \"canvas\", 2000, 800);\n",
"c6->Divide(1, 2);\n",
"\n",
"xs = xt::eval(xt::linspace<float>(0, anom_scores.size(), anom_scores.size()));\n",
"g5 = new TGraph(xs.size(), xs.data(), anom_scores.data());\n",
"g5->SetLineColor(orange);\n",
"g5->SetLineWidth(3);\n",
"g5->SetTitle(\"Anomaly Score\");\n",
"\n",
"c6->cd(1);\n",
"c6->Pad()->SetLeftMargin(0.02);\n",
"c6->Pad()->SetRightMargin(0);\n",
"g4->Draw();\n",
"\n",
"c6->cd(2);\n",
"c6->Pad()->SetLeftMargin(0.02);\n",
"c6->Pad()->SetRightMargin(0);\n",
"g5->Draw();\n",
"\n",
"c6->Draw();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Unfortunately Etaler doesn't support anomaly likelihood now and we can't decode the predictions like NuPIC can. So the resulting score is quite noisy. But seems we have found quite some anomalies. Well, let's see what's going on!\n",
"\n",
"Let us have a look at where are the anomalies are."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"// Find the indices of anomalies\n",
"anom_indices = vector<size_t>();\n",
"for(int i=300;i<anom_scores.size();i++) { //Ignoring the initial learning phase\n",
" if(anom_scores[i] > 0.8) {\n",
" anom_indices.push_back(i);\n",
" i += 50; // Debounce, so we don't see a bunch of anomalies clustering together\n",
" }\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"c7 = new TCanvas(\"c7\", \"canvas\", 2000, 400);\n",
"c7->Pad()->SetLeftMargin(0.01);\n",
"c7->Pad()->SetRightMargin(0);\n",
"\n",
"min_val = *min_element(consumptions.begin(), consumptions.end());\n",
"max_val = *max_element(consumptions.begin(), consumptions.end());\n",
"\n",
"g4->Draw();\n",
"lines = vector<shared_ptr<TLine>>();\n",
"for(size_t i=0;i<anom_indices.size();i++) {\n",
" auto index = anom_indices[i];\n",
" auto l = make_shared<TLine>(index, min_val, index, max_val);\n",
" l->SetLineColor(TColor::GetColor(\"#ff0000\"));\n",
" l->SetLineWidth(2);\n",
" l->Draw();\n",
" lines.push_back(l);\n",
"}\n",
"\n",
"l2 = new TLegend(1,0.6,0.85,0.9);\n",
"l2->SetHeader(\"Legend\",\"C\"); \n",
"l2->AddEntry(g1,\"consumption\",\"l\");\n",
"if(lines.size() > 0) \n",
" l2->AddEntry(lines[0].get(),\"anomalies\",\"l\");\n",
"l2->Draw();\n",
"\n",
"c7->Draw();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hmm... Seems our HTM netowrk have picked up the changes at the end of the dataset! And it does look like the pattern is changing there. Good job HTM!\n",
"\n",
"Let's zoom into the detected anomalies."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"zoom = function([&](int index, int w=150){\n",
" intmax_t left = std::max(index-w, 0);\n",
" intmax_t length = std::min(left+2*w, (intmax_t)consumptions.size()) - left;\n",
" \n",
" auto g = new TGraph(length, xs.data()+left, consumptions.data()+left);\n",
" g->SetTitle((\"anomaly centered at index \" + to_string(index)).c_str());\n",
" g->SetLineColor(color);\n",
" g->SetLineWidth(2);\n",
" g->Draw();\n",
" \n",
" // Draw a Line at where the anomaly is\n",
" auto min_val = *min_element(consumptions.data()+left, consumptions.data()+left+length);\n",
" auto max_val = *max_element(consumptions.data()+left, consumptions.data()+left+length);\n",
" auto l = new TLine(index, min_val, index, max_val);\n",
" l->SetLineColor(TColor::GetColor(\"#2ca02c\"));\n",
" l->SetLineWidth(2);\n",
" l->Draw();\n",
"});\n",
"\n",
"c8 = new TCanvas(\"c8\", \"canvas\", 1200, 320*anom_indices.size());\n",
"c8->Divide(1, anom_indices.size());\n",
"\n",
"for(size_t i=0;i<anom_indices.size();i++) {\n",
" c8->cd(i+1);\n",
" c8->Pad()->SetLeftMargin(0.02);\n",
" c8->Pad()->SetRightMargin(0);\n",
" \n",
" zoom(anom_indices[i], 150);\n",
"}\n",
"\n",
"c8->Draw();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hopefully this notebook explains how Etaler works and the difference between NuPIC and Etaler.\n",
"\n",
"See ya!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "ROOT C++",
"language": "c++",
"name": "root"
},
"language_info": {
"codemirror_mode": "text/x-c++src",
"file_extension": ".C",
"mimetype": " text/x-c++src",
"name": "c++"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@alior101
Copy link

alior101 commented Aug 4, 2019

Awesome work Martin! Can't wait to start playing with it :)

@cyberslam
Copy link

Hi Martin,
I had trouble signing in CERN to use ROOT, using
my Google account. Didn't try Colab since you said it won't
work with ROOT.

         I also try in my MATE terminal (Ubuntu 18.04) using 

your suggested command but got error:

sfl@T500:~$ root --notebook

Command 'root' not found, did you mean:

command 'toot' from snap toot (0.21.0)
command 'roo' from snap roo (2.0.3)
command 'rootv' from deb xawtv
command 'rott' from deb rott
command 'proot' from deb proot

See 'snap info ' for additional versions.

sfl@T500:~$

       Anyway, I read thru your "Etaler_API_example.ipynb" and indeed

it is impressive!!! You are a brilliant programmer and I can hardly
wait for the Python Wrapper for your c++ notebook. :))

      I noticed there were some discrepancies between Etaler's

graph outputs as compared with nupic. Etaler has too many
changes from nupic that it will be difficult for you to troubleshoot what
caused the changes. You should just overlay both Etaler's and
Nupic outputs together in one graph if you can: starting from the decoder
front end, and see how it affects the final outputs.

      Thanks Martin.

Samuel

@marty1885
Copy link
Author

marty1885 commented Aug 5, 2019

your suggested command but got error:

ROOT is not installed by default on Ubuntu based systems. Nor is it is the official repository. I installed it via Arch Linux's repo (I run Arch)

sudo pamcan -S root

You'll have to build ROOT yourself if you are on Ubuntu/Debian. @alior101, have you got a minute? I'm not sure how to build ROOT on Ubuntu/Debian.

@marty1885
Copy link
Author

marty1885 commented Aug 5, 2019

Etaler has too many changes from nupic that it will be difficult for you to troubleshoot what caused the changes.

There are some changes I know is causing the differences.

First, Etaler implements the original TM algorithm back from 2011 and updating to the new connect-to-all method. While NuPIC uses the updated TM algorithm from 2016 (but still staying on the old connect-once method). Secondly, I didn't set the hyper parameters in Etaler to what NuPIC has. Third, NuPIC uses anomaly likelihood while Etaler uses the raw anomaly score (as I haven't implement that yet)

@alior101
Copy link

alior101 commented Aug 5, 2019 via email

@cyberslam
Copy link

cyberslam commented Aug 5, 2019 via email

@marty1885
Copy link
Author

marty1885 commented Aug 5, 2019

@cyberslam You might want to check your email settings and edit your post. The format os way off and other data is leaking trough.

@cyberslam
Copy link

cyberslam commented Aug 5, 2019 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment