Skip to main content

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

Metadata

Release files for mikoshi-curiosity 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mikoshi-curiosity 0.1.3
File Size Uploaded Provenance
mikoshi_curiosity-0.1.3.tar.gz 27.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for mikoshi-curiosity 0.1.3
File Interpreter ABI Platform
mikoshi_curiosity-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 49.5 kB

Release files / mikoshi_curiosity-0.1.3.tar.gz

Download URL mikoshi_curiosity-0.1.3.tar.gz
Size 27.5 kB
Tags Source
SHA-256 checksum
How to use checksums
6d4031bdbd7fcd489ab099fab42101040f91204069289f1f4c0c1ccaee9b3910
BLAKE2b-256 checksum
How to use checksums
eb0228c6471cf7fa20928dd1ee467404cc5fdd7bcea15ae8044fd36d3bca6504
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Release files / mikoshi_curiosity-0.1.3-py3-none-any.whl

Download URL mikoshi_curiosity-0.1.3-py3-none-any.whl
Size 22.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
275e529d4f4826f51b47cc2980bca957f50b29da142ab4272ef06c9db7d9a51c
BLAKE2b-256 checksum
How to use checksums
def0335fa6f21753989d3f316f761174eb87a249615fb1de8575d9fbf5c6a64a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Security for mikoshi-curiosity 0.1.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page