import logging import pandas as pd from sklearn import metrics from sklearn.cluster import AffinityPropagation from sklearn.metrics import davies_bouldin_score from ..plot_metrics import draw_graphs logging.getLogger().setLevel(logging.INFO) def run_algo(training_set, fan_ids, modelling_config, algo_params): X = training_set if isinstance(fan_ids, pd.Series): fan_ids = fan_ids.to_frame() damping = algo_params['damping'] hyperparams = algo_params['hyperparams'] hyperparams['damping'] = damping hyperparams['random_state'] = 0 # For consistency over multiple runs, we want this to always remain the same #hyperparams['n_jobs'] = -1 # This algo doesn't utilize n_jobs and multiple cores clustering = AffinityPropagation(**hyperparams).fit(X) labels = clustering.labels_ cluster_centers_indices = clustering.cluster_centers_indices_ centers = clustering.cluster_centers_ n_clusters = len(cluster_centers_indices) cluster_output = fan_ids.join(pd.DataFrame(labels)).rename(columns={0: 'cluster', '0': 'cluster'}) X = pd.DataFrame(X).join(pd.DataFrame(labels), lsuffix='left_').rename(columns={0: 'cluster', '0': 'cluster'}) graph_locations = draw_graphs(X, labels, modelling_config, n_clusters, centers) eval_metrics = {'clusters': n_clusters, 'n_iter': clustering.n_iter_, 'silhouette_coefficient': metrics.silhouette_score(X, labels), 'davies_bouldin_index': davies_bouldin_score(X, labels), 'calinski_harabasz_index': metrics.calinski_harabasz_score(X, labels) } return clustering, eval_metrics, hyperparams, cluster_output, graph_locations if __name__ == '__main__': """ Instead of generating df, perhaps load your own dataframe from csv. We need a dataframe with training cols only (preprocessed, and standardscaled) and a fan_id. """ training_set = pd.DataFrame({ 'fan_id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 'a': [1,2,3,4,5,6,4,3,1,5,5,6,7,9], 'b': [2,3,4,5,6,7,8,9,2,3,4,5,6,9] }) fan_ids = training_set['fan_id'] modelling_config = { 'plot_2d': True, 'plot_3d': True, 'plot_silhouette': True, 'boxplot': True, } algo_params = {'damping': 0.5, 'hyperparams': {'affinity': 'euclidean', 'max_iter': 2000, 'convergence_iter': 15}} print(run_algo(training_set, fan_ids, modelling_config, algo_params)[1])