Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add 'htm.java' detector #237

Merged
merged 24 commits into from Nov 29, 2016
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
7e4a236
Add 'htm.java' detector
lscheinkman Apr 1, 2016
45c264c
Simplify network removing unnecessary layers
lscheinkman Apr 2, 2016
001b3eb
Use new 'tm_cpp' parameters
lscheinkman Jun 3, 2016
48388db
Add extra logging and debugging options
lscheinkman Jun 5, 2016
ff474a1
Merge remote-tracking branch 'upstream/master' into htm.java
lscheinkman Jul 18, 2016
1008111
Update to new Persistence API (PublisherSupplier)
lscheinkman Jul 19, 2016
c3577bd
Merge branch 'htm.java' of https://github.com/lscheinkman/NAB into ls…
mrcslws Sep 27, 2016
4fff66a
Latest htmjava detector from @cogmission
mrcslws Sep 28, 2016
cc2855e
Use correct input dimensions and potentialRadius
mrcslws Sep 28, 2016
9a10324
Add htmjava results
mrcslws Sep 28, 2016
a6c2602
Link to htmjava github issue
mrcslws Sep 28, 2016
08d0935
Merge remote-tracking branch 'upstream/master' into htm.java
lscheinkman Sep 29, 2016
38d7c0a
Update README
lscheinkman Sep 29, 2016
7e52016
Unpublish HTM Java results
lscheinkman Sep 29, 2016
eb6fc08
Slight cleanup: scores same as numentaTM
Sep 29, 2016
db91358
Revert "Unpublish HTM Java results"
lscheinkman Sep 29, 2016
0aed2f3
Change build to use new HTM.Java release, and remove explicit potenti…
Oct 1, 2016
7b594cf
Merge branch 'htm.java' of https://github.com/lscheinkman/NAB into ht…
Oct 1, 2016
ddf61ee
merge with upstream, resubmit scoring
Oct 1, 2016
bf2de21
Add former results dir back in with modified files
Oct 2, 2016
2af503f
Restore other results
lscheinkman Oct 16, 2016
98003f8
Merge remote-tracking branch 'upstream/master' into htm.java
lscheinkman Nov 28, 2016
8b5f0d4
Adds spatial detection that improves HTM scores. See PR #284
lscheinkman Nov 29, 2016
08fc1aa
Sort table via “standard profile” scores
lscheinkman Nov 29, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -5,6 +5,7 @@
data_test/
deprecated/
nab.egg-info/
.idea/

# Generated files

Expand Down
5 changes: 3 additions & 2 deletions README.md
Expand Up @@ -85,13 +85,15 @@ run without likelihood, set the variable `self.useLikelihood` in
[numenta_detector.py](https://github.com/numenta/NAB/blob/master/nab/detectors/numenta/numenta_detector.py)
to `False`.
* [nab-comportex](https://github.com/floybix/nab-comportex) is a twist on HTM anomaly detection using [Comportex](https://github.com/htm-community/comportex), a community-driven HTM implementation in Clojure. Please see [Felix Andrew's blog post](http://floybix.github.io/2016/07/01/attempting-nab) on experiments with this algorithm.
* [HTM Java](https://github.com/numenta/htm.java) is a Community-Driven Java port of HTM.


| Detector |Standard Profile | Reward Low FP | Reward Low FN |
|---------------|---------|------------------|---------------|---------------|
| Numenta HTM* | 65.3 | 58.6 | 69.4 |
| [nab-comportex](https://github.com/floybix/nab-comportex)† | 64.6 | 58.8 | 69.6 |
| [NumentaTM HTM](https://github.com/numenta/NAB/blob/master/nab/detectors/numenta/numentaTM_detector.py)* | 61.2 | 52.4 | 66.1 |
| [HTM Java](https://github.com/numenta/NAB/blob/master/nab/detectors/htmjava) | 57.54 | 49.71 | 62.33 |
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Guys,

Can we please get HTM.Java's results = NuPIC before we post? Please take this down? There's no reason why HTM.Java's results have to be less than NuPIC, so why would we post these without optimizing it?

I don't have anything against the rest of the merge, I just would like to not include results until we optimize the performance so that it equals (or is very close or above even) NuPIC?

For instance, the scores I get with my HTMModel are even better than these, so I would rather not put these up until @lscheinkman or someone can optimize them? (I will help too) - I just would like to merge without the results part for now?

Here's a Gist link containing my HTMModel, and thresholds.json file for your convenience to help with optimizing... And these were my scores using this:

 "htmjava": {
        "reward_low_FN_rate": 63.07649796008621,
        "reward_low_FP_rate": 49.971153542524476,
        "standard": 58.40785038840517
    },

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cogmission Feel free to push your HTMModel changes and results to this PR. You should have access to it.
I will not merge until you are satisfied with the results.
BTW, HTM Java implementation should be compared with NumentaTM HTM results which are pretty close right now.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. I've unpublished the current HTM Java results from the PR.
IMHO, we should not merge to master until we get results we can publish.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So who is going to own the work on the optimization? That is Numenta's "wheelhouse" not mine? Like I said, I will assist...

| Numenta HTM*, no likelihood | 52.52 | 41.09 | 58.25 |

\* The results correspond to NuPIC and nupic.core SHAs 42f701d and c030b84
Expand Down Expand Up @@ -198,7 +200,6 @@ the specific version of NuPIC (and associated nupic.core) that is noted in the
cd /path/to/nupic.core/
git checkout -b nab {TAG NAME}


##### Run full NAB

cd /path/to/nab
Expand All @@ -219,7 +220,7 @@ subset of the NAB data files or on your own set of data files. You can do that
by creating a custom `combined_windows.json` file that only contains labels for
the files you want to run. This new file should be in exactly the same format as
`combined_windows.json` except it would only contain windows for the files you
are interested in.
are interested in.

**Example**: an example file containing two files is in
`labels/combined_windows_tiny.json`. The following command shows you how to run
Expand Down
30 changes: 22 additions & 8 deletions config/thresholds.json
Expand Up @@ -41,18 +41,18 @@
"threshold": 0.9947875976562506
}
},
"relativeEntropy": {
"htmjava": {
"reward_low_FN_rate": {
"score": -27.2288224715,
"threshold": 0.5
"score": -15.092683287919897,
"threshold": 0.501556396484375
},
"reward_low_FP_rate": {
"score": -5.57182391716,
"threshold": 0.5
"score": -0.668792875255821,
"threshold": 0.5416503906250002
},
"standard": {
"score": 10.7711775285,
"threshold": 0.5
"score": 17.499891977504333,
"threshold": 0.514062309265137
}
},
"null": {
Expand Down Expand Up @@ -111,6 +111,20 @@
"threshold": 0.9984497070312507
}
},
"relativeEntropy": {
"reward_low_FN_rate": {
"score": -27.2288224715,
"threshold": 0.5
},
"reward_low_FP_rate": {
"score": -5.57182391716,
"threshold": 0.5
},
"standard": {
"score": 10.7711775285,
"threshold": 0.5
}
},
"skyline": {
"reward_low_FN_rate": {
"score": -77.20605964639174,
Expand Down Expand Up @@ -153,4 +167,4 @@
"threshold": 1.0
}
}
}
}
7 changes: 7 additions & 0 deletions nab/detectors/htmjava/.gitignore
@@ -0,0 +1,7 @@
.gradle
build
/bin/
.classpath
.project
.settings
.idea
17 changes: 17 additions & 0 deletions nab/detectors/htmjava/README.md
@@ -0,0 +1,17 @@
## [HTM Java](https://github.com/numenta/htm.java) NAB detector

##### Run [htm.java](https://github.com/numenta/htm.java) with NAB

First make sure you have __java 8__ installed

java -version

Build __htm.java__ NAB detector:

cd nab/detectors/htmjava
./gradlew clean build

Run __htm.java__ NAB detector:

cd /path/to/nab
python run.py -d htmjava --detect --score --normalize
Empty file.
43 changes: 43 additions & 0 deletions nab/detectors/htmjava/build.gradle
@@ -0,0 +1,43 @@
apply plugin: 'java'

sourceCompatibility = 1.8
targetCompatibility = 1.8
archivesBaseName = 'htm.java-nab'


repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
maven {
url 'http://metaware.us/maven3'
}
}

dependencies {
compile group: 'org.numenta', name: 'htm.java', version: '0.6.9-SNAPSHOT'
compile group: 'com.google.guava', name: 'guava', version: '19.0'
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.10'
compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.10'
compile group: 'net.sf.jopt-simple', name: 'jopt-simple', version: '4.6'
}

jar {
manifest {
attributes 'Implementation-Title': 'NAB detector for htm.java',
'Implementation-Version': '0.0.1',
'Main-Class': 'nab.detectors.htmjava.HTMModel',
'Class-Path': configurations.runtime.files.collect {"$it.name"}.join(' ')
}
}

clean {
delete fileTree(dir: '../../../' , include: 'htmjava.log')
}

task copyToLib(type: Copy) {
into "$buildDir/libs"
from configurations.runtime
}
assemble.dependsOn(copyToLib)
Binary file not shown.
@@ -0,0 +1,6 @@
#Sun Mar 27 18:56:14 PDT 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip
164 changes: 164 additions & 0 deletions nab/detectors/htmjava/gradlew
@@ -0,0 +1,164 @@
#!/usr/bin/env bash

##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
echo "$*"
}

die ( ) {
echo
echo "$*"
echo
exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac

# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`

# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option

if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"