npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

HiddenMarkovModel

v0.0.5

Published

Simple Hidden Markov Model implementation

Downloads

8

Readme

NPM version Build status Test coverage License Downloads

This module implements a Hidden Markov Model featuring methods to obtain the real generation probability and Viterbi approximations as well as methods to initialize and/or reestimate a HMM given a set of generated items with Viterbi re-estimation and linear segmentation.

Dependencies

Implementation itself depends on no additional module.

Usage

This project can be used as a NodeJS module:

var hmm = require( './hmm.js' );
var aModel = new hmm();

Initializing with explicit details

A Hidden Markov Model can be initialized giving the explicit list of states (including final state), symbols, initial probabilities, transition probabilities and emission probabilities.

aModel = new hmm(
	[ '1', '2', '3', 'F' ],
	'F', [ 'a', 'b', 'c' ], {
		'1': 1
	}, {
		'1': {
			'1': 0.2,
			'2': 0.5,
			'3': 0.3
		},
		'2': {
			'1': 0.1,
			'3': 0.9
		},
		'3': {
			'3': 0.4,
			'F': 0.6
		}
	}, {
		'1': {
			'b': 0.3,
			'c': 0.7
		},
		'2': {
			'a': 0.3,
			'b': 0.6,
			'c': 0.1
		},
		'3': {
			'a': 1,
		}
	}
);

Reestimating an existing Hidden Markov Model

If you have an existing HMM and want to reestimate it with some training samples you can do it with reestimate method:

aModel.reestimate( [ [ 'b', 'c', 'b', 'a' ], [ 'b', 'c', 'b', 'b' ], [ 'b', 'c', 'b', 'd' ] ] );

Optionally you can give an array of optimal paths as second parameter. If you don't give that array of paths the method will compute the optimal paths for each one of given items, so be sure that given items could be generated with the model.

Initializing a new Hidden Markov Model given some training samples

To initialize a new Hidden Markov Model without having a previous model you can use initialize method:

aModel.initialize( [ [ 'b', 'c', 'b', 'a' ], [ 'b', 'c', 'b', 'b' ], [ 'b', 'c', 'b', 'd' ] ], 3 );

This method will initialize the model, using linear segmentation to decide which will be the optimal state sequence for each one of the items and after that will reestimate the model.

Getting the probability that a given item is generated by the model

This implementation offers methods to get the real generation probability (using Forward algorithm), the Viterbi approximation and the most probable state sequence.

  • Real probability: Given an array of symbols, generationProbability method will return the probability that those symbols are generated in that order by the model.
  • Viterbi approximation: Given an array of symbols, viterbiApproximation method will return the probability that most probable state sequence generates given symbols in given order.
  • Most probable state sequence: Given an array of symbols, optimalStateSequence will return the most probable state sequence as an array.
var hmm = require( './hmm.js' );
var milk = new hmm();
var something = [ 'white', 'bottle' ];
milk.initialize( [ something ], 2 );
console.log( 'The probability that something white in a bottle is milk is ' +  ( milk.generationProbability( something ) * 100 ) + '%.' );

Printing the model

You can check internal details of the model with print method, which will print details on console:

> milk.print();
A	1	2	F
1	0	1	0
2	0	0	1
F	0	0	0

B	white	bottle
1	1	0
2	0	1

Initial:
1:	1
2:	0
F:	0

Final: F

Development

You'll need to install development dependencies:

npm install --only=dev

Generating documentation

Documentation can be generated running:

npm run-script doc

HTML documentation will be available in doc folder.

Building from Coffeescript source

Although this module is shipped already built you can build it again from CoffeeScript sources running:

npm run-script prepublish

Running tests

You can also run the tests and get coverage information. To run the tests on CoffeeScript source just run:

npm test

If you want to generate additional coverage information run:

npm run-script test-cov

And then you'll find coverage information in coverage folder.