from util import * from sklearn.cluster import KMeans, SpectralClustering, DBSCAN from sklearn import metrics import numpy as np import warnings import os from util.Monitor_construction import Box from runtime_monitors import * def k_means_cluster(data, n_clusters): kmeans = KMeans(n_clusters=n_clusters, init='k-means++', random_state=0, n_init="auto") kmeans.fit_predict(data) lbs = kmeans.labels_ # cluster labels clusters = dict() for lb in set(lbs): idx = np.where(lbs == lb)[0] clusters[lb] = list(zip(idx, data[idx])) return clusters def spectral_cluster(data, n_clusters): n_neighbors = min(n_clusters, 10) spectral = SpectralClustering(n_clusters=n_clusters, affinity='nearest_neighbors', n_neighbors=n_neighbors, gamma=1.0, eigen_solver="arpack", random_state=0) # catch warnings related to kneighbors_graph with warnings.catch_warnings(): warnings.filterwarnings( "ignore", message="the number of connected components of the " + "connectivity matrix is [0-9]{1,2}" + " > 1. Completing it to avoid stopping the tree early.", category=UserWarning, ) warnings.filterwarnings( "ignore", message="Graph is not fully connected, spectral embedding" + " may not work as expected.", category=UserWarning, ) spectral = spectral.fit(data) lbs = spectral.labels_ # cluster labels clusters = dict() for lb in set(lbs): idx = np.where(lbs == lb)[0] clusters[lb] = list(zip(idx, data[idx])) return clusters def dbscan_cluster(data, eps, min_samples): db = DBSCAN(eps=eps, min_samples=min_samples).fit(data) lbs = db.labels_ # cluster labels n_cls = len(set(lbs)) - (1 if -1 in lbs else 0) # number of clusters n_noise = list(lbs).count(-1) clusters = dict() for lb in set(lbs): idx = np.where(lbs == lb)[0] clusters[lb] = list(zip(idx, data[idx])) return clusters