Latest 0.6.1
Homepage https://github.com/sadawi/MarkovKit
License MIT
Platforms ios 8.0, requires ARC
Authors

Version
License
Platform

Some simple tools for working with probabilities and Markov models in Swift.

  • ProbabilityVector: A mapping of items to probabilities (summing to 1)
  • ProbabilityMatrix: A transition table mapping input states to output states
  • MarkovModel: A ProbabilityMatrix where the input and output states are the same. Can generate chains.
  • HiddenMarkovModel: Implementation of the Viterbi algorithm for obtaining a likely sequence of hidden states from a sequence of observations

Installation

In your Podfile:

pod 'MarkovKit', '~> 0.6.0'

Probability Vectors

Thanks to DictionaryLiteralConvertible, it’s simple to initialize a vector:

let vector: ProbabilityVector<String> = ["red": 0.25, "blue": 0.5, "green": 0.25]
let item = vector.randomItem()  // should return "blue" about 50% of the time

Probability Matrices

A probability matrix is a mapping of input states to probability vectors describing possible output states. Again, they can be initialized easily with dictionary literals:

let matrix: ProbabilityMatrix<Int, String> = [
    1: ["output1": 1]
    2: ["output2": 0.5, "output3": 0.5]
]

Markov Chains

let model: MarkovModel<String> = [
    "x": ["y": 1],
    "y": ["x": 1],
]
let chain = model.generateChain(from: "x", maximumLength: 5)
// always returns ["x", "y", "x", "y", "x"]

To start a chain without an initial state, initial probabilities must be given:

model.initialProbabilities = ["x": 1]
let newChain = model.generateChain(maximumLength: 5)

Hidden Markov Models

let states = ["healthy", "sick"]
let initialProbabilities:ProbabilityVector<String> = ["healthy": 0.6, "sick": 0.4]

let transitionProbabilities:MarkovModel<String> = [
    "healthy":  ["healthy": 0.7, "sick": 0.3],
    "sick":     ["healthy": 0.4, "sick": 0.6],
]

// Note that the emission type isn't necessarily the same as the state type.
let emissionProbabilities: ProbabilityMatrix<String, String> = [
    "healthy":  ["normal": 0.5, "cold": 0.4, "dizzy": 0.1],
    "sick":     ["normal": 0.1, "cold": 0.3, "dizzy": 0.6],
]

let hmm = HiddenMarkovModel(states:states, 
    initialProbabilities: initialProbabilities, 
    transitionProbabilities: transitionProbabilities, 
    emissionProbabilities: emissionProbabilities)

let observations = ["normal", "cold", "dizzy"]
let prediction = hmm.calculateStates(observations)

// ["healthy", "healthy", "sick"]

Latest podspec

{
    "name": "MarkovKit",
    "version": "0.6.1",
    "summary": "Tools for working with Markov models",
    "homepage": "https://github.com/sadawi/MarkovKit",
    "license": "MIT",
    "authors": {
        "Sam Williams": "[email protected]"
    },
    "source": {
        "git": "https://github.com/sadawi/MarkovKit.git",
        "tag": "0.6.1"
    },
    "platforms": {
        "ios": "8.0"
    },
    "requires_arc": true,
    "source_files": "MarkovKit/**/*"
}

Pin It on Pinterest

Share This