File size: 2,778 Bytes
803f04a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import gradio as gr
import pandas as pd
import numpy as np
import plotly.express as px
from sklearn.cluster import KMeans, AgglomerativeClustering, SpectralClustering
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

def perform_clustering(data_file, model_type, n_clusters):
    # Lire les données
    df = pd.read_csv(data_file.name)
    
    # Nettoyage supplémentaire au cas où (suppression des NaN)
    df = df.dropna()
    
    # Standardisation des données
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(df)
    
    # Réduction de dimension pour visualisation (si plus de 2 features)
    if X_scaled.shape[1] > 2:
        pca = PCA(n_components=2)
        X_vis = pca.fit_transform(X_scaled)
    else:
        X_vis = X_scaled
    
    # Application du clustering
    if model_type == "KMeans":
        model = KMeans(n_clusters=n_clusters, random_state=42)
    elif model_type == "CAH":
        model = AgglomerativeClustering(n_clusters=n_clusters)
    elif model_type == "Spectral Clustering":
        model = SpectralClustering(n_clusters=n_clusters, affinity='nearest_neighbors', random_state=42)
    
    clusters = model.fit_predict(X_scaled)
    
    # Création du dataframe de résultats
    results_df = df.copy()
    results_df['Cluster'] = clusters
    
    # Visualisation
    if X_vis.shape[1] >= 2:
        fig = px.scatter(
            x=X_vis[:, 0], 
            y=X_vis[:, 1], 
            color=clusters,
            title=f"Visualisation des clusters ({model_type}, k={n_clusters})",
            labels={'x': 'Composante 1', 'y': 'Composante 2'},
            color_continuous_scale=px.colors.qualitative.Plotly
        )
    else:
        fig = px.scatter(
            x=range(len(X_vis)), 
            y=X_vis[:, 0], 
            color=clusters,
            title=f"Visualisation des clusters ({model_type}, k={n_clusters})",
            labels={'x': 'Index', 'y': 'Valeur'},
            color_continuous_scale=px.colors.qualitative.Plotly
        )
    
    return fig, results_df

# Interface Gradio
iface = gr.Interface(
    fn=perform_clustering,
    inputs=[
        gr.File(label="Uploader votre jeu de données (CSV)"),
        gr.Dropdown(["KMeans", "CAH", "Spectral Clustering"], label="Modèle de clustering", value="KMeans"),
        gr.Slider(2, 10, step=1, label="Nombre de clusters (k)", value=3)
    ],
    outputs=[
        gr.Plot(label="Visualisation des clusters"),
        gr.Dataframe(label="Données avec labels de cluster")
    ],
    title="Application de Clustering",
    description="""Uploader un jeu de données nettoyé, choisissez un modèle de clustering 
    et le nombre de clusters pour obtenir une visualisation et les résultats."""
)

iface.launch()