This repo provides a single function which is the implementation of the border and core detection as studied in our paper:
The border and core detection function has a prototype as follows.
def classify_border_and_core_points(X, y=None, p=2, close=100, percentile=60):
"""
Classify points as 'border' or 'core' based on distance percentile, using efficient distance computation.
Parameters:
X : np.ndarray
The dataset (n_samples, n_features).
y : np.ndarray, optional
The class labels for the dataset (n_samples,). If None, the function treats all data as one class.
p : int
The norm to use for distance calculation (default is Euclidean norm, p=2).
close : int
The number of closest points to consider for the distance calculation (default=100).
percentile : float
The threshold percentile for defining border points (default=60).
Returns:
result : dict or tuple
If y is provided, returns a dictionary with class labels as keys and (border_points, core_points) as values.
If y is None, returns a tuple (border_points, core_points).
"""
Installation
The code can be installed as a python package from PyPI.
pip install adaptive_resampling
Or it can be install from the github repo directly as a package.
pip install git+https://github.com/ykahalan/adaptive_resampling.git
Example usage
For detecting core and border points of a single class.
# Import the functions from the installed library
from adaptive_resampling import classify_border_and_core_points
# Generate random data points for the example (1000 points in 2D space)
import numpy as np
X = np.random.rand(1000, 2)
# Classify points into border and core points
border_points, core_points = classify_border_and_core_points(X, p=2, close=100, percentile=60)
print(f"Number of border points: {border_points.shape[0]}")
print(f"Number of core points: {core_points.shape[0]}")
For detecting core and border points of each class.
# Import the functions from the installed library
from adaptive_resampling import classify_border_and_core_points
# Generate random data points for the example (1000 points in 2D space, with 3 classes)
import numpy as np
np.random.seed(42)
X = np.random.rand(1000, 2)
y = np.random.randint(0, 3, size=1000) # 3 classes (0, 1, 2)
# Classify border and core points for each class
class_border_core = classify_border_and_core_points(X, y, p=2, close=100, percentile=60)
for cls, (border, core) in class_border_core.items():
print(f"Class {cls}:")
print(f" Number of border points: {border.shape[0]}")
print(f" Number of core points: {core.shape[0]}")
For oversampling on the border and undersampling on the core as intended in the paper.
# Import necessary libraries
import numpy as np
from adaptive_resampling import classify_border_and_core_points
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from collections import Counter
# Generate synthetic data (1000 samples, 2 features, 3 classes)
np.random.seed(42)
X = np.random.rand(1000, 2)
y = np.random.randint(0, 3, size=1000) # Classes: 0, 1, 2
# Classify border and core points for each class
class_border_core = classify_border_and_core_points(X, y, p=2, close=100, percentile=60)
# Separate border and core points
border_points = []
border_labels = []
core_points = []
core_labels = []
for cls, (border, core) in class_border_core.items():
border_points.append(border)
border_labels.append(np.full(border.shape[0], cls)) # Store labels for border points
core_points.append(core)
core_labels.append(np.full(core.shape[0], cls)) # Store labels for core points
# Combine all border points and labels
X_border_all = np.vstack(border_points)
y_border_all = np.hstack(border_labels)
# Combine all core points and labels
X_core_all = np.vstack(core_points)
y_core_all = np.hstack(core_labels)
# Apply SMOTE to all border points across all classes
if len(np.unique(y_border_all)) > 1: # Ensure multiple classes exist
smote = SMOTE(sampling_strategy='auto', random_state=42)
X_border_resampled, y_border_resampled = smote.fit_resample(X_border_all, y_border_all)
else:
X_border_resampled, y_border_resampled = X_border_all, y_border_all # Use original if SMOTE isn't possible
# Apply Random Undersampling (RUS) to all core points across all classes
if len(np.unique(y_core_all)) > 1: # Ensure multiple classes exist
rus = RandomUnderSampler(sampling_strategy='auto', random_state=42)
X_core_resampled, y_core_resampled = rus.fit_resample(X_core_all, y_core_all)
else:
X_core_resampled, y_core_resampled = X_core_all, y_core_all # Use original if RUS isn't possible
# Combine resampled border and core points
X_resampled = np.vstack((X_border_resampled, X_core_resampled))
y_resampled = np.hstack((y_border_resampled, y_core_resampled))
# Display the class distribution before and after resampling
print(f"Original class distribution: {Counter(y)}")
print(f"Resampled class distribution: {Counter(y_resampled)}")
Metadata
Release files for adaptive-resampling 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| adaptive_resampling-0.1.1.tar.gz | 4.5 kB | Without provenance | Details for adaptive_resampling-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| adaptive_resampling-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for adaptive_resampling-0.1.1-py3-none-any.whl |
Total release size: 9.6 kB
Release files / adaptive_resampling-0.1.1.tar.gz
| Download URL | adaptive_resampling-0.1.1.tar.gz |
|---|---|
| Size | 4.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c0d40ae5519c8a921901f4812c7f20c21f2cd8a5296d32c969d5d26423cfd5b1
|
|
BLAKE2b-256 checksum How to use checksums |
33ac3ec3ee40efc72b88f4180c88173748feb5fad8d840f3c09a7e0b57b04d87
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.0.0 CPython/3.12.3
|
Release files / adaptive_resampling-0.1.1-py3-none-any.whl
| Download URL | adaptive_resampling-0.1.1-py3-none-any.whl |
|---|---|
| Size | 5.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b036fd5d07cac052d925f88578d3dcefe2f634ced67b9cbd3259a49d39882d19
|
|
BLAKE2b-256 checksum How to use checksums |
609864214164032ac64fdbe941261e4d7283a49525c413288e028d26f4fbf7e5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.0.0 CPython/3.12.3
|
Security for adaptive-resampling 0.1.1
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.