Muhamamad/Clustering
0
1from flask import Flask, render_template, request2import numpy as np3import pandas as pd4from sklearn.decomposition import TruncatedSVD5from skfuzzy.cluster import cmeans6from sklearn.preprocessing import LabelEncoder7from sklearn.metrics import accuracy_score8import matplotlib.pyplot as plt9import base6410from io import BytesIO11 12app = Flask(__name__)13 14@app.route('/', methods=['GET', 'POST'])15def index():16 accuracy = None # Placeholder untuk akurasi17 18 if request.method == 'POST':19 # Ambil jumlah cluster dari inputan20 num_clusters = int(request.form['num_clusters'])21 22 # 1. Membaca dataset23 file_path = "dataset/berita_vsm_new.csv" # Ganti dengan path file Anda24 data = pd.read_csv(file_path)25 26 # 2. Pisahkan label dan data fitur27 labels = data['Category']28 features = data.drop('Category', axis=1).values29 30 # Encode label kategori menjadi numerik untuk evaluasi akurasi31 label_encoder = LabelEncoder()32 encoded_labels = label_encoder.fit_transform(labels)33 34 # 3. Reduksi dimensi dengan SVD35 svd = TruncatedSVD(n_components=100) # Gunakan 2 dimensi untuk visualisasi36 reduced_features = svd.fit_transform(features)37 38 # 4. Fuzzy C-Means Clustering39 cntr, u, u0, d, jm, p, fpc = cmeans(40 data=reduced_features.T,41 c=num_clusters, # Jumlah cluster dari input42 m=2.0, # Tingkat fuzziness43 error=0.005, # Toleransi error44 maxiter=1000 # Iterasi maksimum45 )46 47 # Keanggotaan cluster48 cluster_membership = np.argmax(u, axis=0)49 50 # Hitung akurasi berdasarkan label asli51 accuracy = max(52 accuracy_score(encoded_labels, cluster_membership),53 accuracy_score(encoded_labels, 1 - cluster_membership) # Cek inversi cluster54 )55 56 # Menyimpan hasil visualisasi57 fig = plt.figure(figsize=(8, 6))58 colors = ['red', 'blue']59 for i in range(num_clusters):60 cluster_points = reduced_features[cluster_membership == i]61 plt.scatter(cluster_points[:, 0], cluster_points[:, 1], c=colors[i % len(colors)], label=f'Cluster {i}', alpha=0.6)62 63 # Tambahkan centroid64 plt.scatter(cntr[:, 0], cntr[:, 1], c='black', marker='x', s=100, label='Centroid')65 plt.title(f"Fuzzy C-Means Clustering - Akurasi: {accuracy:.2f}")66 plt.xlabel("Komponen 1")67 plt.ylabel("Komponen 2")68 plt.legend()69 plt.grid()70 71 # Simpan gambar ke dalam buffer72 img_buf = BytesIO()73 plt.savefig(img_buf, format='png')74 img_buf.seek(0)75 img_str = base64.b64encode(img_buf.getvalue()).decode('utf-8')76 77 return render_template('index.html', accuracy=accuracy, image=img_str)78 79 return render_template('index.html', accuracy=accuracy)80 81if __name__ == '__main__':82 app.run(port=5002)83 