File size: 2,229 Bytes
6de3029
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import joblib
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, DBSCAN
from scipy.cluster.hierarchy import fcluster, linkage

# 讀取保存的模型
scaler = joblib.load('scaler.sav')
pca = joblib.load('pca_model.sav')
kmeans = joblib.load('kmeans_model.sav')
linked = joblib.load('hierarchical_model.sav')
dbscan = joblib.load('dbscan_model.sav')

# 標題和簡介
st.title("聚類分析 - KMeans, Hierarchical Clustering 和 DBSCAN")
st.write("上傳 CSV 文件並查看聚類結果")

# 上傳文件
uploaded_file = st.file_uploader("上傳 CSV 文件", type=["csv"])

if uploaded_file is not None:
    # 讀取上傳的 CSV 文件
    data = pd.read_csv(uploaded_file)
    
    # 移除 'Time' 欄位
    numerical_data = data.drop(columns=['Time'])
    
    # 標準化數據
    scaled_data = scaler.transform(numerical_data)
    
    # 使用 PCA 進行降維
    pca_data = pca.transform(scaled_data)
    
    # 創建包含主成分的 DataFrame
    pca_df = pd.DataFrame(pca_data, columns=['PC1', 'PC2'])
    
    # 使用保存的 K-means 模型進行聚類
    kmeans_labels = kmeans.predict(pca_df)
    
    # 使用保存的階層式聚類結果
    hclust_labels = fcluster(linked, 3, criterion='maxclust')
    
    # 使用保存的 DBSCAN 模型進行聚類
    dbscan_labels = dbscan.fit_predict(pca_df)
    
    # 繪製 K-means 聚類結果
    fig, ax = plt.subplots(1, 3, figsize=(15, 5))
    
    # K-means 繪圖
    ax[0].scatter(pca_df['PC1'], pca_df['PC2'], c=kmeans_labels, cmap='viridis')
    ax[0].set_title('K-means Clustering')
    ax[0].set_xlabel('PC1')
    ax[0].set_ylabel('PC2')
    
    # 階層式聚類繪圖
    ax[1].scatter(pca_df['PC1'], pca_df['PC2'], c=hclust_labels, cmap='viridis')
    ax[1].set_title('Hierarchical Clustering')
    ax[1].set_xlabel('PC1')
    ax[1].set_ylabel('PC2')
    
    # DBSCAN 繪圖
    ax[2].scatter(pca_df['PC1'], pca_df['PC2'], c=dbscan_labels, cmap='viridis')
    ax[2].set_title('DBSCAN Clustering')
    ax[2].set_xlabel('PC1')
    ax[2].set_ylabel('PC2')
    
    # 顯示圖表
    st.pyplot(fig)