import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle


from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN, KMeans




# 1) f[^𐶐
X, y = make_moons(n_samples=500, noise=0.10, random_state=42)


# 2) DBSCAN iŒp[^j
eps = 0.15
min_samples = 5
db = DBSCAN(eps=eps, min_samples=min_samples)
labels = db.fit_predict(X)


# 3) NX^o
n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
n_noise = np.sum(labels == -1)
print(f"NX^: {n_clusters}")
print(f"mCY_̐: {n_noise}")


# 4) ʂ̉
def plot_clusters(X, labels, title):
    markers = ['o','s','^','v','<','>','D','P','X','*']
    plt.figure()
    plt.title(title)
    for cid in np.unique(labels):
        if cid == -1:
            plt.scatter(
                X[labels == cid,0],
                X[labels == cid,1],
                marker='x',
                label='Noise',
            )
        else:
            plt.scatter(
                X[labels == cid,0],
                X[labels == cid,1],
                marker=markers[cid % len(markers)],
                label=f"cluster {cid}"
            )
    plt.xlabel("PC1"); plt.ylabel("PC2")
    plt.legend()
    plt.tight_layout()
    plt.show()


plot_clusters(X, labels, f"DBSCAN (eps={eps}, min_samples={min_samples})")


# 5) KMeans Ƃ̔r
km = KMeans(n_clusters=2, n_init='auto', random_state=0)
labels_km = km.fit_predict(X)
plot_clusters(X, labels_km, "k-means (k=2)")