Skip to main content

Domain-agnostic curiosity engine — explore any state space and find interesting things

Project description

Mikoshi Curiosity

Mikoshi Curiosity

Explore any state space. Find what you didn't know you were looking for.

License Python


Recommendation engines predict what you'll like. Curiosity engines find what you don't know you'd like.

Mikoshi Curiosity is a domain-agnostic exploration engine that uses intrinsic motivation, state memory, and diversity pressure to discover interesting things in any state space — datasets, text corpora, graphs, parameter spaces, or APIs.

Inspired by Go-Explore and intrinsic motivation research.

Quick Start

pip install mikoshi-curiosity
# With extras:
pip install mikoshi-curiosity[data]  # pandas support
pip install mikoshi-curiosity[all]   # pandas + matplotlib

Examples

🔍 Find Anomalies in a Dataset

import pandas as pd
from mikoshi_curiosity import CuriosityEngine
from mikoshi_curiosity.contexts.dataset import DatasetSpace

df = pd.read_csv("sales_data.csv")
space = DatasetSpace(df)
engine = CuriosityEngine(space, strategy="novelty")

seed = space.get_state("0")
result = engine.explore(seed, budget=200)

print(result.summary())
for d in result.top(5):
    print(f"  [{d.score:.2f}] Row {d.state.id}: {d.reason}")
    print(f"         {d.state.features}")

📚 Explore a Text Corpus

from mikoshi_curiosity import CuriosityEngine
from mikoshi_curiosity.contexts.text import TextSpace

docs = [
    {"id": "paper1", "text": "Deep learning for image recognition..."},
    {"id": "paper2", "text": "Quantum entanglement in biological systems..."},
    # ... hundreds of papers
]

space = TextSpace(docs)
engine = CuriosityEngine(space, strategy="diversity")
result = engine.explore(space.get_state("paper1"), budget=100)

# Find bridging documents that connect different topics
for d in result.top(10):
    print(f"  {d.state.id}: {d.reason}")

🎛️ Explore a Parameter Space

from mikoshi_curiosity import CuriosityEngine
from mikoshi_curiosity.contexts.numeric import NumericSpace

def simulate(params):
    """Your simulation / evaluation function."""
    return complex_score(params["gravity"], params["friction"], params["elasticity"])

space = NumericSpace(
    dimensions={"gravity": (0, 20), "friction": (0, 1), "elasticity": (0.1, 5)},
    eval_fn=simulate,
)
engine = CuriosityEngine(space, strategy="balanced")
result = engine.explore(space.get_random(5), budget=500)

# Find interesting parameter combinations, phase transitions, sweet spots
for d in result.top(10):
    print(f"  Score: {d.score:.3f} | Params: {d.state.features}")

🕸️ Explore a Network

from mikoshi_curiosity import CuriosityEngine
from mikoshi_curiosity.contexts.graph import GraphSpace

space = GraphSpace(
    nodes=["alice", "bob", "carol", ...],
    edges=[("alice", "bob"), ("bob", "carol"), ...],
)
engine = CuriosityEngine(space, strategy="novelty")
result = engine.explore(space.get_state("alice"), budget=100)

# Discover bridge nodes, structural holes, unexpected clusters

Strategies

Strategy What it optimises Best for
novelty Distance from seen states Finding outliers, anomalies
surprise Prediction error Finding rule-breakers
diversity Distance from current discoveries Broad coverage
serendipity Novelty × relevance to profile Personalised exploration
balanced Weighted combination of all General-purpose

API Reference

Core

  • State — A point in exploration space (id, features, embedding, metadata)
  • StateSpace — Abstract space to explore (subclass for your domain)
  • CuriosityEngine — The exploration engine
  • ExplorationMemory — Go-Explore style state archive
  • PredictionModel — Online model for surprise detection
  • Discovery — A single interesting finding with score and reason
  • ExplorationResult — Container with discoveries, stats, and memory

Built-in Contexts

Context Module Input
Tabular data contexts.dataset.DatasetSpace DataFrame or CSV path
Text corpus contexts.text.TextSpace List of {id, text} dicts
Graph/network contexts.graph.GraphSpace Nodes + edges
Numeric/params contexts.numeric.NumericSpace Dimension bounds + eval function
External API contexts.api.APISpace Fetch function

Custom State Space

from mikoshi_curiosity import StateSpace, State

class MySpace(StateSpace):
    def get_neighbors(self, state, n=10):
        ...  # Return nearby states

    def get_random(self, n=10):
        ...  # Return random states

    def get_state(self, id):
        ...  # Lookup by id

    def embed(self, state):
        ...  # Return numpy vector

    def size(self):
        ...  # Approximate space size

Visualization

from mikoshi_curiosity.viz import plot_exploration, plot_discovery_scores

fig = plot_exploration(result)   # 2D PCA projection with discoveries highlighted
fig = plot_discovery_scores(result)  # Score breakdown bar chart

Requires pip install mikoshi-curiosity[viz].

Design Philosophy

  • Zero external API dependencies — core uses only NumPy
  • Domain-agnostic — works with any state space you define
  • Go-Explore inspired — maintains an archive of interesting states and explores from frontiers
  • Multiple signals — novelty, surprise, diversity, serendipity, diminishing returns
  • Online learning — prediction model updates as you explore
  • Resumable — ExplorationResult contains full memory state

Built by Mikoshi Ltd

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

mikoshi_curiosity-0.1.1.tar.gz (27.4 kB view details)

Uploaded Source

Built Distribution

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

mikoshi_curiosity-0.1.1-py3-none-any.whl (21.8 kB view details)

Uploaded Python 3

File details

Details for the file mikoshi_curiosity-0.1.1.tar.gz.

File metadata

  • Download URL: mikoshi_curiosity-0.1.1.tar.gz
  • Upload date:
  • Size: 27.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for mikoshi_curiosity-0.1.1.tar.gz
Algorithm Hash digest
SHA256 90ee8d84dc15a716ec793b33fc1fd5eacf6e4016769b06286fc2b7c42dc102f1
MD5 3987b7f74911eeca0636e3d103a41adc
BLAKE2b-256 993afa4d72299ecaa0b1c239e42a499fdfaae9e7ed7f67c62bcc4583a6cf3660

See more details on using hashes here.

File details

Details for the file mikoshi_curiosity-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for mikoshi_curiosity-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ca0b884f9182c7f2ad1b6c9bba4bcc4fb8dfd9db4270a98550f2353a823307cd
MD5 2e2c52802b76e1967ceaba8ca52d1d4b
BLAKE2b-256 442f5092db37bc980257e013d9323e99e1ffcdf2e64e33abdca3851112f6c6fc

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