From c3165955c1130cf84bd512db12a714d1f0526a32 Mon Sep 17 00:00:00 2001 From: daffarahman11 Date: Mon, 26 May 2025 02:18:34 +0700 Subject: [PATCH] Tambah Normalisasi pada kmeans controller --- app/Http/Controllers/KmeansController.php | 110 +++++--- app/Http/Controllers/LandingController.php | 3 + app/Services/KMeansService.php | 238 ++++++++++++++++++ database/seeders/CuranmorSeeder.php | 42 ++-- database/seeders/CurasSeeder.php | 12 +- .../assets/assetLanding/images/team/zahra.jpg | Bin 0 -> 36931 bytes resources/views/landing.blade.php | 41 +++ 7 files changed, 381 insertions(+), 65 deletions(-) create mode 100644 public/assets/assetLanding/images/team/zahra.jpg diff --git a/app/Http/Controllers/KmeansController.php b/app/Http/Controllers/KmeansController.php index fd46253..7d38616 100644 --- a/app/Http/Controllers/KmeansController.php +++ b/app/Http/Controllers/KmeansController.php @@ -9,16 +9,30 @@ class KmeansController extends Controller { + public function KMeansCuras() { - $data = Curas::select('id', 'kecamatan_id', 'klaster_id', 'jumlah_curas')->orderBy('jumlah_curas', 'asc')->get(); + $data = Curas::select('id', 'kecamatan_id', 'klaster_id', 'jumlah_curas') + ->orderBy('kecamatan_id', 'asc')->get(); + + // Hitung min dan max untuk normalisasi + $min = $data->min('jumlah_curas'); + $max = $data->max('jumlah_curas'); + + // Normalisasi jumlah_curas ke skala 0–1 + $data = $data->map(function ($item) use ($min, $max) { + $item->jumlah_curas_normalized = $max == $min + ? 1 + : round(($item->jumlah_curas - $min) / ($max - $min), 2); + return $item; + }); $maxIterasi = 100; - - $centroidManual = [0, 1, 3]; + // Centroid awal langsung dalam skala 0–1 + $centroidManual = [0.0, 0.5, 1]; $centroids = collect($centroidManual)->map(function ($value) { - return ['C' => $value]; + return ['C' => round($value, 2)]; }); $centroidAwal = $centroids->toArray(); @@ -34,11 +48,14 @@ public function KMeansCuras() $jarak = []; foreach ($centroids as $idx => $centroid) { - $dist = abs($item->jumlah_curas - $centroid['C']); - $jarak["C" . ($idx + 1)] = $dist; + $dist = abs($item->jumlah_curas_normalized - $centroid['C']); + $jarak["C" . ($idx + 1)] = round($dist, 2); } - $iterasi[$i][] = array_merge(['kecamatan_id' => $item->kecamatan_id], $jarak); + $iterasi[$i][] = array_merge([ + 'kecamatan_id' => $item->kecamatan_id, + 'normal' => round($item->jumlah_curas_normalized, 2) + ], $jarak); $minIndex = array_keys($jarak, min($jarak))[0]; $clusterNumber = (int) str_replace("C", "", $minIndex); @@ -54,20 +71,20 @@ public function KMeansCuras() $prevAssignment = $currentAssignment; - // Update centroid berdasarkan rata-rata + // Update centroid dengan rata-rata nilai normalized foreach ($clustered as $key => $group) { - $avg = collect($group)->avg('jumlah_curas'); + $avg = collect($group)->avg('jumlah_curas_normalized'); $centroids = $centroids->map(function ($item, $index) use ($key, $avg) { return $index === ($key - 1) - ? ['C' => $avg] + ? ['C' => round($avg, 2)] : $item; }); } } - // Final mapping centroid ke klaster_id + // Mapping centroid ke klaster_id $finalCentroids = $centroids->map(function ($item, $index) { - return ['index' => $index + 1, 'C' => $item['C']]; + return ['index' => $index + 1, 'C' => round($item['C'], 2)]; })->sortBy('C')->values(); $availableKlasterIDs = Klaster::orderBy('id', 'asc')->pluck('id')->values(); @@ -82,20 +99,20 @@ public function KMeansCuras() ]); } - // Format centroid awal $centroidAwalFormatted = collect($centroidAwal)->values()->map(function ($item, $index) { - return ['C' . ($index + 1) => $item['C']]; + return ['C' . ($index + 1) => round($item['C'], 2)]; }); - // Format centroid akhir $centroidAkhirFormatted = $centroids->values()->map(function ($item, $index) { - return ['C' . ($index + 1) => $item['C']]; + return ['C' . ($index + 1) => round($item['C'], 2)]; }); $hasilKMeansCuras = [ 'centroid_awal' => $centroidAwalFormatted, 'centroid_akhir' => $centroidAkhirFormatted, - 'iterasi' => $iterasi + 'iterasi' => $iterasi, + 'min' => $min, + 'max' => $max ]; file_put_contents( @@ -103,21 +120,34 @@ public function KMeansCuras() json_encode($hasilKMeansCuras, JSON_PRETTY_PRINT) ); - return redirect('/dashboard/TampilHitungCuras'); - } public function KMeansCuranmor() { - $data = Curanmor::select('id', 'kecamatan_id', 'klaster_id', 'jumlah_curanmor')->orderBy('jumlah_curanmor', 'asc')->get(); + // Ambil data awal + $data = Curanmor::select('id', 'kecamatan_id', 'klaster_id', 'jumlah_curanmor') + ->orderBy('kecamatan_id', 'asc')->get(); + + // Hitung min dan max untuk normalisasi Min-Max + $min = $data->min('jumlah_curanmor'); + $max = $data->max('jumlah_curanmor'); + + // Normalisasi jumlah_curanmor ke skala 1-100 + $data = $data->map(function ($item) use ($min, $max) { + $item->jumlah_curanmor_normalized = $max == $min + ? 1 + : round((($item->jumlah_curanmor - $min) / ($max - $min)), 2); + return $item; + }); $maxIterasi = 100; - $centroidManual = [10, 20, 30]; + // Centroid awal dalam skala 1–100 + $centroidManual = [0.2, 0.5, 0.8]; $centroids = collect($centroidManual)->map(function ($value) { - return ['C' => $value]; + return ['C' => round($value, 2)]; }); $centroidAwal = $centroids->toArray(); @@ -133,11 +163,14 @@ public function KMeansCuranmor() $jarak = []; foreach ($centroids as $idx => $centroid) { - $dist = abs($item->jumlah_curanmor - $centroid['C']); - $jarak["C" . ($idx + 1)] = $dist; + $dist = abs($item->jumlah_curanmor_normalized - $centroid['C']); + $jarak["C" . ($idx + 1)] = round($dist, 2); // Dua angka di belakang koma } - $iterasi[$i][] = array_merge(['kecamatan_id' => $item->kecamatan_id], $jarak); + $iterasi[$i][] = array_merge([ + 'kecamatan_id' => $item->kecamatan_id, + 'normal' => round($item->jumlah_curanmor_normalized, 2) + ], $jarak); $minIndex = array_keys($jarak, min($jarak))[0]; $clusterNumber = (int) str_replace("C", "", $minIndex); @@ -147,18 +180,19 @@ public function KMeansCuranmor() $currentAssignment[$item->id] = $clusterNumber; } + // Cek konvergensi if ($currentAssignment === $prevAssignment) { break; } $prevAssignment = $currentAssignment; - // Update centroid berdasarkan rata-rata + // Update centroid berdasarkan rata-rata nilai yang sudah dinormalisasi foreach ($clustered as $key => $group) { - $avg = collect($group)->avg('jumlah_curanmor'); + $avg = collect($group)->avg('jumlah_curanmor_normalized'); $centroids = $centroids->map(function ($item, $index) use ($key, $avg) { return $index === ($key - 1) - ? ['C' => $avg] + ? ['C' => round($avg, 2)] : $item; }); } @@ -166,7 +200,7 @@ public function KMeansCuranmor() // Final mapping centroid ke klaster_id $finalCentroids = $centroids->map(function ($item, $index) { - return ['index' => $index + 1, 'C' => $item['C']]; + return ['index' => $index + 1, 'C' => round($item['C'], 2)]; })->sortBy('C')->values(); $availableKlasterIDs = Klaster::orderBy('id', 'asc')->pluck('id')->values(); @@ -175,11 +209,7 @@ public function KMeansCuranmor() $centroidToKlaster[$centroid['index']] = $availableKlasterIDs[$i]; } - - // Update ke database - - - + // Update hasil clustering ke database foreach ($data as $item) { Curanmor::where('id', $item->id)->update([ 'klaster_id' => $centroidToKlaster[$item->temp_klaster], @@ -188,18 +218,20 @@ public function KMeansCuranmor() // Format centroid awal $centroidAwalFormatted = collect($centroidAwal)->values()->map(function ($item, $index) { - return ['C' . ($index + 1) => $item['C']]; + return ['C' . ($index + 1) => round($item['C'], 2)]; }); // Format centroid akhir $centroidAkhirFormatted = $centroids->values()->map(function ($item, $index) { - return ['C' . ($index + 1) => $item['C']]; + return ['C' . ($index + 1) => round($item['C'], 2)]; }); $hasilKMeansCuranmor = [ 'centroid_awal' => $centroidAwalFormatted, 'centroid_akhir' => $centroidAkhirFormatted, - 'iterasi' => $iterasi + 'iterasi' => $iterasi, + 'min' => $min, + 'max' => $max ]; file_put_contents( @@ -207,8 +239,10 @@ public function KMeansCuranmor() json_encode($hasilKMeansCuranmor, JSON_PRETTY_PRINT) ); - return redirect('/dashboard/TampilHitungCuranmor'); } + + + } diff --git a/app/Http/Controllers/LandingController.php b/app/Http/Controllers/LandingController.php index 448061b..efd3b74 100644 --- a/app/Http/Controllers/LandingController.php +++ b/app/Http/Controllers/LandingController.php @@ -25,6 +25,9 @@ public function runKmeans() $serviceKMeans = new KMeansService(); $serviceKMeans->SSEElbowCuranmor(); $serviceKMeans->SSEElbowCuras(); + $serviceKMeans->hitungDBSCANManual(); + $serviceKMeans->kmeansWithSilhouetteSingleMethod(); + $serviceKMeansCuras = new KMeansService(); $hasilKMeansCuras = $serviceKMeansCuras->hitungKMeansCuras(); diff --git a/app/Services/KMeansService.php b/app/Services/KMeansService.php index 13a8fa6..ad6d18a 100644 --- a/app/Services/KMeansService.php +++ b/app/Services/KMeansService.php @@ -5,6 +5,7 @@ use App\Models\Curas; use App\Models\Klaster; use App\Models\Curanmor; +use Illuminate\Support\Facades\Storage; class KMeansService @@ -388,6 +389,243 @@ public function SSEElbowCuras() ); } + public function hitungDBSCANManual() + { + $eps = 1.5; // Jarak maksimum antar titik + $minPts = 3; // Minimum tetangga agar jadi core point + + $data = Curas::select('jumlah_curas')->get()->pluck('jumlah_curas')->map(fn($v) => (float)$v)->toArray(); + $n = count($data); + + $visited = array_fill(0, $n, false); + $labels = array_fill(0, $n, null); + $clusterId = 0; + + // Fungsi cari tetangga + $regionQuery = function ($pointIndex) use ($data, $eps) { + $neighbors = []; + foreach ($data as $i => $val) { + if (abs($val - $data[$pointIndex]) <= $eps) { + $neighbors[] = $i; + } + } + return $neighbors; + }; + + // DBSCAN Proses + for ($i = 0; $i < $n; $i++) { + if ($visited[$i]) continue; + $visited[$i] = true; + + $neighbors = $regionQuery($i); + if (count($neighbors) < $minPts) { + $labels[$i] = -1; // noise + continue; + } + + $labels[$i] = $clusterId; + $seeds = array_diff($neighbors, [$i]); + + foreach ($seeds as $seed) { + if (!$visited[$seed]) { + $visited[$seed] = true; + $newNeighbors = $regionQuery($seed); + if (count($newNeighbors) >= $minPts) { + $seeds = array_unique(array_merge($seeds, $newNeighbors)); + } + } + + if ($labels[$seed] === null || $labels[$seed] === -1) { + $labels[$seed] = $clusterId; + } + } + + $clusterId++; + } + + // Hitung silhouette (manual satu dimensi) + $silhouetteScores = []; + foreach ($data as $i => $val) { + $label = $labels[$i]; + if ($label === -1) continue; // skip noise + + $sameCluster = []; + $otherClusters = []; + + foreach ($data as $j => $otherVal) { + if ($i === $j || $labels[$j] === -1) continue; + if ($labels[$j] === $label) { + $sameCluster[] = abs($val - $otherVal); + } else { + $otherClusters[$labels[$j]][] = abs($val - $otherVal); + } + } + + $a = count($sameCluster) > 0 ? array_sum($sameCluster) / count($sameCluster) : 0; + $b = count($otherClusters) > 0 ? min(array_map(fn($d) => array_sum($d) / count($d), $otherClusters)) : 0; + + $s = ($a === $b && $a === 0) ? 0 : ($b - $a) / max($a, $b); + $silhouetteScores[] = $s; + } + + $meanSilhouette = count($silhouetteScores) > 0 ? round(array_sum($silhouetteScores) / count($silhouetteScores), 4) : 0; + + // Susun hasil anggota klaster + $anggotaKlaster = []; + foreach ($labels as $i => $label) { + $anggotaKlaster[$label][] = $data[$i]; + } + + $jumlahKlaster = count(array_filter(array_keys($anggotaKlaster), fn($k) => $k !== -1)); + + $hasil = [ + 'silhouette' => $meanSilhouette, + 'jumlah_klaster' => $jumlahKlaster, + 'anggota_klaster' => $anggotaKlaster, + ]; + + file_put_contents( + storage_path('app/public/dbscan_curas.json'), + json_encode($hasil, JSON_PRETTY_PRINT) + ); + return $hasil; + } + + public function kmeansWithSilhouetteSingleMethod(int $k = 2, int $maxIter = 100): array + { + // Ambil data dari tabel curas + $data = \App\Models\Curas::select('kecamatan_id', 'jumlah_curas') + ->get() + ->pluck('jumlah_curas', 'kecamatan_id') + ->toArray(); + + $ids = array_keys($data); + $values = array_values($data); + + // Inisialisasi centroid secara random + // Ambil nilai min dan max dari data + $minValue = min($values); + $maxValue = max($values); + + $centroids = []; + + if ($k == 1) { + // Jika cuma 1 klaster, centroid random antara min dan max + $centroids[] = rand($minValue, $maxValue); + } else { + // Untuk k >= 2, inisialisasi centroid unik integer dalam rentang min-max + $centroids = []; + while (count($centroids) < $k) { + $randCentroid = rand($minValue, $maxValue); + if (!in_array($randCentroid, $centroids)) { + $centroids[] = $randCentroid; + } + } + } + + + $clusters = []; + $iter = 0; + + do { + $clusters = array_fill(0, $k, []); + + // Assign ke klaster terdekat (jarak absolut 1 dimensi) + foreach ($values as $idx => $val) { + $distances = []; + foreach ($centroids as $cidx => $centroid) { + $distances[$cidx] = abs($val - $centroid); + } + asort($distances); + $nearestCluster = key($distances); + $clusters[$nearestCluster][] = $idx; + } + + // Hitung centroid baru + $newCentroids = []; + foreach ($clusters as $cluster) { + if (count($cluster) > 0) { + $sum = 0; + foreach ($cluster as $i) { + $sum += $values[$i]; + } + $newCentroids[] = $sum / count($cluster); + } else { + // Jika cluster kosong, pilih centroid random + $newCentroids[] = $values[array_rand($values)]; + } + } + + $iter++; + if ($newCentroids === $centroids) break; + if ($iter >= $maxIter) break; + $centroids = $newCentroids; + + } while (true); + + // Fungsi hitung rata-rata jarak + $avgDistance = function(int $i, array $cluster) use ($values): float { + if (count($cluster) <= 1) return 0; + $sum = 0; + foreach ($cluster as $idx) { + if ($idx == $i) continue; + $sum += abs($values[$i] - $values[$idx]); + } + return $sum / (count($cluster) - 1); + }; + + // Hitung silhouette untuk setiap data + $silhouetteScores = []; + for ($i = 0; $i < count($values); $i++) { + // Cari klaster data ke-i + $clusterIdx = null; + foreach ($clusters as $cidx => $cluster) { + if (in_array($i, $cluster)) { + $clusterIdx = $cidx; + break; + } + } + + $a = $avgDistance($i, $clusters[$clusterIdx]); + $b = INF; + foreach ($clusters as $cidx => $cluster) { + if ($cidx == $clusterIdx) continue; + $dist = $avgDistance($i, $cluster); + if ($dist < $b) $b = $dist; + } + + $silhouetteScores[] = ($b - $a) / max($a, $b); + } + + $silhouette = array_sum($silhouetteScores) / count($silhouetteScores); + + // Bentuk output anggota klaster dengan kecamatan_id + $clusterMembers = []; + foreach ($clusters as $cidx => $cluster) { + $clusterMembers[$cidx] = []; + foreach ($cluster as $idx) { + $clusterMembers[$cidx][] = $ids[$idx]; + } + } + + $hasil = [ + 'silhouette' => $silhouette, + 'jumlah_klaster' => $k, + 'anggota_klaster' => $clusterMembers, + 'iterasi' => $iter, + 'centroid' => $centroids, + ]; + + // Simpan ke file JSON + file_put_contents( + storage_path('app/public/silhoute_kmeans_curas.json'), + json_encode($hasil, JSON_PRETTY_PRINT) + ); + + return $hasil; + } + + diff --git a/database/seeders/CuranmorSeeder.php b/database/seeders/CuranmorSeeder.php index d7e3963..054e118 100644 --- a/database/seeders/CuranmorSeeder.php +++ b/database/seeders/CuranmorSeeder.php @@ -19,28 +19,28 @@ public function run(): void // Data jumlah curanmor untuk setiap kecamatan $dataCuranmor= [ - 1 => 5, - 2 => 4, - 3 => 2, - 4 => 22, - 5 => 4, - 6 => 18, - 7 => 0, - 8 => 37, - 9 => 9, - 10 => 3, - 11 => 2, - 12 => 13, - 13 => 1, - 14 => 21, - 15 => 14, - 16 => 4, - 17 => 10, - 18 => 0, - 19 => 1, + 1 => 11, + 2 => 14, + 3 => 21, + 4 => 59, + 5 => 8, + 6 => 42, + 7 => 13, + 8 => 188, + 9 => 30, + 10 => 13, + 11 => 4, + 12 => 33, + 13 => 3, + 14 => 48, + 15 => 53, + 16 => 12, + 17 => 30, + 18 => 5, + 19 => 4, 20 => 10, - 21 => 1, - 22 => 2, + 21 => 5, + 22 => 7, 23 => 15, 24 => 4, ]; diff --git a/database/seeders/CurasSeeder.php b/database/seeders/CurasSeeder.php index 97bcb6a..2ca816e 100644 --- a/database/seeders/CurasSeeder.php +++ b/database/seeders/CurasSeeder.php @@ -17,20 +17,20 @@ public function run(): void $dataCuras = [ 1 => 0, - 2 => 0, - 3 => 0, - 4 => 0, + 2 => 1, + 3 => 2, + 4 => 1, 5 => 1, 6 => 1, 7 => 0, - 8 => 0, - 9 => 0, + 8 => 1, + 9 => 1, 10 => 0, 11 => 0, 12 => 0, 13 => 0, 14 => 0, - 15 => 0, + 15 => 1, 16 => 0, 17 => 0, 18 => 0, diff --git a/public/assets/assetLanding/images/team/zahra.jpg b/public/assets/assetLanding/images/team/zahra.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c45d3b20c08410190865bd3cd16fb975b000763f GIT binary patch literal 36931 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 +
+
+
+ image +
+
+ +
+
+ Fatimatuzzahra
+
+ ANGGOTA PENGUJI +
+
+
+

+ Dosen Politeknik Negeri Jember Program Studi D4 Teknik Informatika. Berperan sebagai Anggota Penguji pada Web SIG Pemetaan Daerah Rawan Curas dan Curanmor +

+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+