Metadata-Version: 2.4
Name: kd-ar-stream
Version: 1.0.7
Summary: KD-AR Stream: Real-Time Data Stream Clustering with Adaptive Radius
Home-page: https://github.com/senolali/kd-ar-stream
Author: Ali Şenol
Author-email: alisenol@tarsus.edu.tr
License: MIT
Project-URL: Homepage, https://github.com/senolali/kd-ar-stream
Project-URL: Documentation, https://github.com/senolali/kd-ar-stream
Project-URL: Source, https://github.com/senolali/kd-ar-stream
Project-URL: Issues, https://github.com/senolali/kd-ar-stream
Project-URL: Paper, https://doi.org/10.17341/gazimmfd.467226
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy>=1.24.0
Requires-Dist: scipy>=1.11.0
Requires-Dist: matplotlib>=3.7.0
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license
Dynamic: license-file
Dynamic: project-url
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

[![PyPI version](https://badge.fury.io/py/mcmstclustering.svg)](https://badge.fury.io/py/mcmstclustering)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python 3.7+](https://img.shields.io/badge/python-3.7+-blue.svg)](https://www.python.org/downloads/)


## KD-AR Stream

KD-AR Stream is a Python package for **real-time data stream clustering** using
Kd-tree and adaptive radius based methods.

## Features

- Adaptive clustering in streaming data
- Cluster merging and splitting
- Supports amount-based and time-based sliding windows
- Minimal modern plotting for visualization



## Installation

```bash
pip install kd-ar-stream

```

## Parameters
If you want to use amount-based sliding window assign WindowType.AMOUNT_BASED
If you want to use time based sliding window, assign WindowType.TIME_BASED
N: int  -> Minimum number of points to form a cluster
r: float  -> Initial cluster radius
r_threshold: float  -> Radius increase/decrease threshold
r_max: float  -> Maximum cluster radius
window_type: WindowType -> {WindowType.AMOUNT_BASED,WindowType.TIME_BASED 
window_size: int  -> For amount-based: number of points in window
verbose: bool {True, False}
	

## Usage

```bash

import numpy as np
from sklearn.metrics.cluster import adjusted_rand_score
from sklearn.preprocessing import MinMaxScaler
from kd_ar_stream import KDARStream, KDARStreamConfig, WindowType, load_exclastar

# Load data 
X, y_true = load_exclastar()

# Normalize
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
np.random.seed(42)

#Parameters N, r, r_threshold, r_max, and window_size are parameters of KD-AR Stream
#If you want to use amount-based sliding window assign WindowType.AMOUNT_BASED
#If you want to use time based sliding window, assign WindowType.TIME_BASED
config = KDARStreamConfig(
	N=22,
	r=0.11,
	r_threshold=0.16,
	r_max=0.43,
	window_size=200,
	window_type=WindowType.AMOUNT_BASED,
	verbose=False
)

kdar = KDARStream(config)
timestamps = np.linspace(0, 10, len(X_scaled))

for i in range(len(X_scaled)):
	kdar.partial_fit(X_scaled[i:i+1], timestamps[i], np.array([i]))
	# Calculate ARI in each 10 points
	if i % 10 == 0 and i > 0:
		kdar.plot_data()
            
# Final ARI
y_pred = kdar.labels_
ARI = adjusted_rand_score(y_true, y_pred)
print(f"Final ARI: {ARI:.4f}")

# Final plot
kdar.plot_data()


```





## Citation

If you use this algorithm in research, please cite the corresponding paper.


Şenol, A., & Karacan, H. (2020). Kd-tree and adaptive radius (KD-AR Stream) based real-time data stream clustering. Journal of the Faculty of Engineering and Architecture of Gazi University, 35(1).


## BibTeX

@article{senol2020kd,

  title={Kd-tree and adaptive radius (KD-AR Stream) based real-time data stream clustering},
  
  author={Şenol, Ali and Karacan, Hacer},
  
  journal={Journal of the Faculty of Engineering and Architecture of Gazi University},
  
  volume={35},
  
  number={1},
  
  year={2020}
  
}


