agentsclimarketplace

Run1 dbscan custom metric clustering

Skill cxcscmu/SkillLearnBench/skills/b3-teacher-feedback-claude-sonnet-4-6/dbscan-parameter-tuning/run1_dbscan-custom-metric-clustering

How to run DBSCAN with a custom anisotropic distance metric using sklearn, including defining callable metrics and computing cluster centroids from labeled output.From its SKILL.md

Install
npx -y skills add cxcscmu/SkillLearnBench --skill run1_dbscan-custom-metric-clustering

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

SKILL.md

2.1 KB, 481 tokens by cl100k_base, as published. Nobody here has run it

DBSCAN with Custom Distance Metric

Overview

sklearn.cluster.DBSCAN accepts a metric parameter that can be a callable. This enables custom distance functions beyond standard Euclidean distance.

Custom Anisotropic Metric

The shape-weighted distance is:

d(a, b) = sqrt((w * Δx)² + ((2 - w) * Δy)²)

Where w = shape_weight. When w=1, this is standard Euclidean distance.

Implementation

import numpy as np
from sklearn.cluster import DBSCAN

def make_metric(shape_weight):
    w = shape_weight
    def metric(a, b):
        dx = a[0] - b[0]
        dy = a[1] - b[1]
        return np.sqrt((w * dx)**2 + ((2 - w) * dy)**2)
    return metric

def run_dbscan(points, epsilon, min_samples, shape_weight):
    """
    points: np.ndarray of shape (N, 2), columns [x, y]
    Returns: cluster labels array (length N), -1 = noise
    """
    if len(points) == 0:
        return np.array([])
    
    metric = make_metric(shape_weight)
    db = DBSCAN(eps=epsilon, min_samples=min_samples, metric=metric)
    labels = db.fit_predict(points)
    return labels

def compute_centroids(points, labels):
    """
    Compute centroids for each cluster (excluding noise label -1).
    Returns: list of (cx, cy) tuples
    """
    centroids = []
    unique_labels = set(labels) - {-1}
    for label in unique_labels:
        mask = labels == label
        centroid = points[mask].mean(axis=0)
        centroids.append(centroid)
    return centroids  # list of np.array([cx, cy])

Key Notes

  • metric='precomputed' with a distance matrix is an alternative but slower for large grids
  • Using a callable metric disables the ball-tree/kd-tree optimization; DBSCAN uses brute force — acceptable for moderate N
  • Noise points (label -1) are excluded from centroid computation
  • If all points are noise or input is empty, centroids is an empty list

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.