All Projects → fredwu → Simple_bayes

fredwu / Simple_bayes

A Naive Bayes machine learning implementation in Elixir.

Programming Languages

elixir
2628 projects

Projects that are alternatives of or similar to Simple bayes

NN-scratch
Coding up a Neural Network Classifier from Scratch
Stars: ✭ 78 (-79.09%)
Mutual labels:  classifier
labelReader
Programmatically find and read labels using Machine Learning
Stars: ✭ 44 (-88.2%)
Mutual labels:  classifier
support-tickets-classification
This case study shows how to create a model for text analysis and classification and deploy it as a web service in Azure cloud in order to automatically classify support tickets. This project is a proof of concept made by Microsoft (Commercial Software Engineering team) in collaboration with Endava http://endava.com/en
Stars: ✭ 142 (-61.93%)
Mutual labels:  classifier
Deep-Learning-Experiments-implemented-using-Google-Colab
Colab Compatible FastAI notebooks for NLP and Computer Vision Datasets
Stars: ✭ 16 (-95.71%)
Mutual labels:  classifier
dl-relu
Deep Learning using Rectified Linear Units (ReLU)
Stars: ✭ 20 (-94.64%)
Mutual labels:  classifier
text2class
Multi-class text categorization using state-of-the-art pre-trained contextualized language models, e.g. BERT
Stars: ✭ 15 (-95.98%)
Mutual labels:  classifier
chatto
Chatto is a minimal chatbot framework in Go.
Stars: ✭ 98 (-73.73%)
Mutual labels:  classifier
Java Naive Bayes Classifier
A java classifier based on the naive Bayes approach complete with Maven support and a runnable example.
Stars: ✭ 290 (-22.25%)
Mutual labels:  classifier
naive-bayes-classifier
Implementing Naive Bayes Classification algorithm into PHP to classify given text as ham or spam. This application uses MySql as database.
Stars: ✭ 21 (-94.37%)
Mutual labels:  classifier
GeneticAlgorithmForFeatureSelection
Search the best feature subset for you classification mode
Stars: ✭ 82 (-78.02%)
Mutual labels:  classifier
ML4K-AI-Extension
Use machine learning in AppInventor, with easy training using text, images, or numbers through the Machine Learning for Kids website.
Stars: ✭ 18 (-95.17%)
Mutual labels:  classifier
pghumor
Is This a Joke? Humor Detection in Spanish Tweets
Stars: ✭ 48 (-87.13%)
Mutual labels:  classifier
smalltext
Classify short texts with neural network.
Stars: ✭ 15 (-95.98%)
Mutual labels:  classifier
Water-classifier-fastai
Deploy your Flask web app classifier on Heroku which is written using fastai library.
Stars: ✭ 37 (-90.08%)
Mutual labels:  classifier
Audio-Classification-using-CNN-MLP
Multi class audio classification using Deep Learning (MLP, CNN): The objective of this project is to build a multi class classifier to identify sound of a bee, cricket or noise.
Stars: ✭ 36 (-90.35%)
Mutual labels:  classifier
tensorflow-image-classifier
Easily train an image classifier and then use it to label/tag other images
Stars: ✭ 29 (-92.23%)
Mutual labels:  classifier
simple-image-classifier
Simple image classifier microservice using tensorflow and sanic
Stars: ✭ 22 (-94.1%)
Mutual labels:  classifier
Gorganizer
Organize your folders into a beautiful classified folder structure with this perfect tool
Stars: ✭ 318 (-14.75%)
Mutual labels:  classifier
node-fasttext
Nodejs binding for fasttext representation and classification.
Stars: ✭ 39 (-89.54%)
Mutual labels:  classifier
Computer-Vision-Project
The goal of this project was to develop a Face Recognition application using a Local Binary Pattern approach and, using the same approach, develop a real time Face Recognition application.
Stars: ✭ 20 (-94.64%)
Mutual labels:  classifier

Simple Bayes Travis Coverage Hex.pm

A Naive Bayes machine learning implementation in Elixir.

In machine learning, naive Bayes classifiers are a family of simple probabilistic classifiers based on applying Bayes' theorem with strong (naive) independence assumptions between the features.

Naive Bayes has been studied extensively since the 1950s. It was introduced under a different name into the text retrieval community in the early 1960s, and remains a popular (baseline) method for text categorization, the problem of judging documents as belonging to one category or the other (such as spam or legitimate, sports or politics, etc.) with word frequencies as the features. With appropriate preprocessing, it is competitive in this domain with more advanced methods including support vector machines. It also finds application in automatic medical diagnosis.

Naive Bayes classifiers are highly scalable, requiring a number of parameters linear in the number of variables (features/predictors) in a learning problem. Maximum-likelihood training can be done by evaluating a closed-form expression, which takes linear time, rather than by expensive iterative approximation as used for many other types of classifiers. - Wikipedia

Features

  • Naive Bayes algorithm with different models
    • Multinomial
    • Binarized (boolean) multinomial
    • Bernoulli
  • Multiple storage options
    • In-memory (default)
    • File system
    • Dets (Disk-based Erlang Term Storage)
  • Ignores stop words
  • Additive smoothing
  • TF-IDF
  • Optional keywords weighting
  • Optional word stemming via Stemmer

Feature Matrix

Multinomial Binarized multinomial Bernoulli
Stop words
Additive smoothing
TF-IDF
Keywords weighting
Stemming

Usage

Install by adding :simple_bayes and optionally :stemmer (for the default stemming functionality) to deps in your mix.exs:

defp deps do
  [
    {:simple_bayes, "~> 0.12"},
    {:stemmer,      "~> 1.0"}
  ]
end

If you're on Elixir 1.3 or below, ensure :simple_bayes and optionally :stemmer are started before your application:

def application do
  [applications: [:logger, :simple_bayes, :stemmer]]
end
bayes = SimpleBayes.init()
        |> SimpleBayes.train(:apple, "red sweet")
        |> SimpleBayes.train(:apple, "green", weight: 0.5)
        |> SimpleBayes.train(:apple, "round", weight: 2)
        |> SimpleBayes.train(:banana, "sweet")
        |> SimpleBayes.train(:banana, "green", weight: 0.5)
        |> SimpleBayes.train(:banana, "yellow long", weight: 2)
        |> SimpleBayes.train(:orange, "red")
        |> SimpleBayes.train(:orange, "yellow sweet", weight: 0.5)
        |> SimpleBayes.train(:orange, "round", weight: 2)

bayes |> SimpleBayes.classify_one("Maybe green maybe red but definitely round and sweet.")
# => :apple

bayes |> SimpleBayes.classify("Maybe green maybe red but definitely round and sweet.")
# => [
#   apple:  0.18519202529366116,
#   orange: 0.14447781772131096,
#   banana: 0.10123406763124557
# ]

bayes |> SimpleBayes.classify("Maybe green maybe red but definitely round and sweet.", top: 2)
# => [
#   apple:  0.18519202529366116,
#   orange: 0.14447781772131096,
# ]

With and without word stemming (requires a stem function, we recommend Stemmer):

SimpleBayes.init()
|> SimpleBayes.train(:apple, "buying apple")
|> SimpleBayes.train(:banana, "buy banana")
|> SimpleBayes.classify("buy apple")
# => [
#   banana: 0.05719389206673358,
#   apple: 0.05719389206673358
# ]

SimpleBayes.init(stem: &Stemmer.stem/1) # or any other stemming function
|> SimpleBayes.train(:apple, "buying apple")
|> SimpleBayes.train(:banana, "buy banana")
|> SimpleBayes.classify("buy apple")
# => [
#   apple: 0.18096114003107086,
#   banana: 0.15054767928902865
# ]

Configuration (Optional)

For application wide configuration, in your application's config/config.exs:

config :simple_bayes, model: :multinomial
config :simple_bayes, storage: :memory
config :simple_bayes, default_weight: 1
config :simple_bayes, smoothing: 0
config :simple_bayes, stem: false
config :simple_bayes, top: nil
config :simple_bayes, stop_words: ~w(
  a about above after again against all am an and any are aren't as at be
  because been before being below between both but by can't cannot could
  couldn't did didn't do does doesn't doing don't down during each few for from
  further had hadn't has hasn't have haven't having he he'd he'll he's her here
  here's hers herself him himself his how how's i i'd i'll i'm i've if in into
  is isn't it it's its itself let's me more most mustn't my myself no nor not of
  off on once only or other ought our ours ourselves out over own same shan't
  she she'd she'll she's should shouldn't so some such than that that's the
  their theirs them themselves then there there's these they they'd they'll
  they're they've this those through to too under until up very was wasn't we
  we'd we'll we're we've were weren't what what's when when's where where's
  which while who who's whom why why's with won't would wouldn't you you'd
  you'll you're you've your yours yourself yourselves
)

Alternatively, you may pass in the configuration options when you initialise:

SimpleBayes.init(
  model:          :multinomial,
  storage:        :memory,
  default_weight: 1,
  smoothing:      0,
  stem:           false,
  top:            nil,
  stop_words:     []
)

Available options for :model are:

  • :multinomial (default)
  • :binarized_multinomial
  • :bernoulli

Available options for :storage are:

  • :memory (default, can also be used by any database, see below for more details)
  • :file_system
  • :dets

Storage options have extra configurations:

Memory

  • :namespace - optional, it's only useful when you want to load by the namespace

File System

  • :file_path

Dets

  • :file_path

File System vs Dets

File system encodes and decodes data using base64, whereas Dets is a native Erlang library. Performance wise file system with base64 tends to be faster with less data, and Dets faster with more data. YMMV, please do your own comparison.

Configuration Examples

# application-wide configuration:
config :simple_bayes, storage: :file_system
config :simple_bayes, file_path: "path/to/the/file.txt"

# per-initialization configuration:
SimpleBayes.init(
  storage: :file_system,
  file_path: "path/to/the/file.txt"
)

Storage Usage

opts = [
  storage:   :file_system,
  file_path: "test/temp/file_sysmte_test.txt"
]

SimpleBayes.init(opts)
|> SimpleBayes.train(:apple, "red sweet")
|> SimpleBayes.train(:apple, "green", weight: 0.5)
|> SimpleBayes.train(:apple, "round", weight: 2)
|> SimpleBayes.train(:banana, "sweet")
|> SimpleBayes.save()

SimpleBayes.load(opts)
|> SimpleBayes.train(:banana, "green", weight: 0.5)
|> SimpleBayes.train(:banana, "yellow long", weight: 2)
|> SimpleBayes.train(:orange, "red")
|> SimpleBayes.train(:orange, "yellow sweet", weight: 0.5)
|> SimpleBayes.train(:orange, "round", weight: 2)
|> SimpleBayes.save()

SimpleBayes.load(opts)
|> SimpleBayes.classify("Maybe green maybe red but definitely round and sweet")

In-memory save/2, load/1 and the encoded_data option

Calling SimpleBayes.save/2 is unnecessary for :memory storage. However, when using the in-memory storage, you are able to get the encoded data - this is useful if you would like to store the encoded data in your persistence of choice. For example:

{:ok, _pid, encoded_data} = SimpleBayes.init()
|> SimpleBayes.train(:apple, "red sweet")
|> SimpleBayes.train(:apple, "green", weight: 0.5)
|> SimpleBayes.train(:apple, "round", weight: 2)
|> SimpleBayes.train(:banana, "sweet")
|> SimpleBayes.save()

# now store `encoded_data` in your database of choice
# once `encoded_data` is fetched again from the database, you are then able to:

SimpleBayes.load(encoded_data: encoded_data)
|> SimpleBayes.train(:banana, "green", weight: 0.5)
|> SimpleBayes.train(:banana, "yellow long", weight: 2)
|> SimpleBayes.train(:orange, "red")
|> SimpleBayes.train(:orange, "yellow sweet", weight: 0.5)
|> SimpleBayes.train(:orange, "round", weight: 2)
|> SimpleBayes.classify("Maybe green maybe red but definitely round and sweet")

Changelog

Please see CHANGELOG.md.

License

Licensed under MIT.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].