Skip to main content

Lightweight Covariance Matrix Adaptation Evolution Strategy (CMA-ES) implementation for Python 3.

Project description

CMA-ES

Lightweight Covariance Matrix Adaptation Evolution Strategy (CMA-ES) [1] implementation.

visualize-six-hump-camel

Himmelblau function.

visualize-himmelblau

Rosenbrock function.

visualize-rosenbrock

Quadratic function.

visualize-quadratic

These GIF animations are generated by visualizer.py.

Installation

Supported Python versions are 3.5 or later.

$ pip install cmaes

Or you can install via conda-forge.

$ conda install -c conda-forge cmaes

Usage

This library provides two interfaces that an Optuna's sampler interface and a low-level interface. I recommend you to use this library via Optuna.

Optuna's sampler interface

Optuna [2] is an automatic hyperparameter optimization framework. A sampler based on this library is available from Optuna v1.3.0. Usage is like this:

import optuna

def objective(trial: optuna.Trial):
    x1 = trial.suggest_uniform("x1", -4, 4)
    x2 = trial.suggest_uniform("x2", -4, 4)
    return (x1 - 3) ** 2 + (10 * (x2 + 2)) ** 2

if __name__ == "__main__":
    sampler = optuna.samplers.CmaEsSampler()
    study = optuna.create_study(sampler=sampler)
    study.optimize(objective, n_trials=250)

See the documentation for more details.

Monkeypatch for faster CMA-ES sampler of Optuna v1.3.x.

If you are using Optuna v1.3.x, you can make optuna.samplers.CmaEsSampler faster.

import optuna
from cmaes.monkeypatch import patch_fast_intersection_search_space

patch_fast_intersection_search_space()

def objective(trial: optuna.Trial):
    x1 = trial.suggest_float("x1", -4, 4)
    x2 = trial.suggest_float("x2", -4, 4)
    return (x1 - 3) ** 2 + (10 * (x2 + 2)) ** 2

if __name__ == "__main__":
    sampler = optuna.samplers.CmaEsSampler()
    study = optuna.create_study(sampler=sampler)
    study.optimize(objective, n_trials=250)
For older versions (Optuna v1.2.0 or older)

If you are using older versions, please use cmaes.samlper.CMASampler.

import optuna
from cmaes.sampler import CMASampler

def objective(trial: optuna.Trial):
    x1 = trial.suggest_uniform("x1", -4, 4)
    x2 = trial.suggest_uniform("x2", -4, 4)
    return (x1 - 3) ** 2 + (10 * (x2 + 2)) ** 2

if __name__ == "__main__":
    sampler = CMASampler()
    study = optuna.create_study(sampler=sampler)
    study.optimize(objective, n_trials=250)

Note that CmaEsSampler doesn't support categorical distributions. If your search space contains a categorical distribution, please use TPESampler.

Low-level interface

This library also provides an "ask-and-tell" style interface.

import numpy as np
from cmaes import CMA

def quadratic(x1, x2):
    return (x1 - 3) ** 2 + (10 * (x2 + 2)) ** 2

if __name__ == "__main__":
    cma_es = CMA(mean=np.zeros(2), sigma=1.3)

    for generation in range(50):
        solutions = []
        for _ in range(cma_es.population_size):
            x = cma_es.ask()
            value = quadratic(x[0], x[1])
            solutions.append((x, value))
            print(f"#{generation} {value} (x1={x[0]}, x2 = {x[1]})")
        cma_es.tell(solutions)

Benchmark results

Rosenbrock function Six-Hump Camel function
rosenbrock six-hump-camel

This implementation (green) stands comparison with pycma (blue). See benchmark for details.

Links

Other libraries:

I respect all libraries involved in CMA-ES.

  • pycma : Most famous CMA-ES implementation by Nikolaus Hansen.
  • libcmaes: Multithreaded C++11 library with Python bindings.
  • cma-es : A Tensorflow v2 implementation.

References:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cmaes-0.5.1.tar.gz (14.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cmaes-0.5.1-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

File details

Details for the file cmaes-0.5.1.tar.gz.

File metadata

  • Download URL: cmaes-0.5.1.tar.gz
  • Upload date:
  • Size: 14.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.8.0 tqdm/4.45.0 CPython/3.8.2

File hashes

Hashes for cmaes-0.5.1.tar.gz
Algorithm Hash digest
SHA256 5f4b45c621f240adcc4db40d51146b5f1ec66e757cbc02b9a060d5e816bb43b6
MD5 529dad604be6bb7341da5aff990ba74f
BLAKE2b-256 6fa9c1facb7679dba76982e8e90214172f75bfaaabc7b333693e40037dd88372

See more details on using hashes here.

File details

Details for the file cmaes-0.5.1-py3-none-any.whl.

File metadata

  • Download URL: cmaes-0.5.1-py3-none-any.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.8.0 tqdm/4.45.0 CPython/3.8.2

File hashes

Hashes for cmaes-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f4642c95ef5e7f915fabece13a762999478c7e1d28fe7f0b4d26778910236d07
MD5 68a67e1b4cd078051b1c596d973cdfcc
BLAKE2b-256 0e7febba8a7950487c760c245168f7ba318b35bf0cac9c0eba30b9fb50150a20

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page