update perhitungan kmeans controller

This commit is contained in:
daffarahman11 2025-04-17 00:49:27 +07:00
parent d6899cac61
commit 7fa65c1bb1
4 changed files with 89 additions and 74 deletions

View File

@ -16,7 +16,7 @@ class CuranmorController extends Controller
*/
public function index()
{
$curanmors = Curanmor::orderBy('jumlah_curanmor', 'asc')->get();
$curanmors = Curanmor::orderBy('jumlah_curanmor', 'desc')->get();
return view('admin.dashboardListCuranmor', compact('curanmors'));
}

View File

@ -16,7 +16,7 @@ class CurasController extends Controller
*/
public function index()
{
$curases = Curas::orderBy('jumlah_curas', 'asc')->get();
$curases = Curas::orderBy('jumlah_curas', 'desc')->get();
return view('admin.dashboardListCuras', compact('curases'));
}

View File

@ -11,14 +11,23 @@ class KmeansController extends Controller
{
public function KMeansCuras()
{
$data = Curas::select('id', 'kecamatan_id', 'klaster_id', 'jumlah_curas')->orderBy('jumlah_curas', 'asc')->get();
$k = Klaster::count('id');
$maxIterasi = 100;
$centroids = $data->random($k)->values()->map(function ($item) {
return [
'jumlah_curas' => $item->jumlah_curas,
];
// Simpan centroid awal ke variabel terpisah
$uniqueJumlahCuras = $data->pluck('jumlah_curas')->unique()->shuffle()->take($k)->values();
$initialCentroids = $uniqueJumlahCuras->map(function ($jumlah) {
return ['jumlah_curas' => $jumlah];
});
// Salin untuk digunakan dalam proses iterasi
$centroids = $initialCentroids->map(function ($item) {
return $item;
});
$iterasi = [];
@ -46,15 +55,12 @@ public function KMeansCuras()
$currentAssignment[$item->id] = $clusterNumber;
}
// ✨ Cek konvergensi: jika assignment sekarang == sebelumnya, break
if ($currentAssignment === $prevAssignment) {
break;
}
$prevAssignment = $currentAssignment;
// Update centroid berdasarkan rata-rata
foreach ($clustered as $key => $group) {
$avg = collect($group)->avg('jumlah_curas');
@ -66,32 +72,41 @@ public function KMeansCuras()
}
}
// Final mapping centroid ke klaster_id (aman/sedang/rawan)
// Final mapping centroid ke klaster_id
$finalCentroids = $centroids->map(function ($item, $index) {
return ['index' => $index + 1, 'jumlah_curas' => $item['jumlah_curas']];
})->sortBy('jumlah_curas')->values();
$centroidToKlaster = [];
foreach ($finalCentroids as $i => $centroid) {
// Klaster ID mulai dari 1 (asumsi klaster di DB bernomor 1, 2, 3, ...)
$centroidToKlaster[$centroid['index']] = $i + 1;
}
// Update ke database
foreach ($data as $item) {
Curas::where('id', $item->id)->update([
'klaster_id' => $centroidToKlaster[$item->temp_klaster],
]);
}
session(['hasil_iterasi' => $iterasi]);
// Simpan hasil iterasi dan centroid awal ke session
session([
'hasil_iterasi' => $iterasi,
'centroid_awal' => $initialCentroids
]);
return response()->json($iterasi);
// Format ulang centroid awal dengan label 'Centroid 1', dst.
$formattedInitialCentroids = [];
foreach ($initialCentroids as $i => $centroid) {
$formattedInitialCentroids['Centroid ' . ($i + 1)] = $centroid['jumlah_curas'];
}
return response()->json([
'centroid_awal' => $formattedInitialCentroids,
'hasil_iterasi' => $iterasi,
]);
}
public function KMeansCuranmor()
{
$data = Curanmor::select('id', 'kecamatan_id', 'klaster_id', 'jumlah_curanmor')->orderBy('jumlah_curanmor', 'asc')->get();

View File

@ -8,10 +8,10 @@
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<title>
Markethon - Digital Marketing Agency Responsive HTML5 Template
KPROTECT | Probolinggo Threat & Crime Tracker
</title>
<!-- Favicon -->
<link rel="shortcut icon" href="{{ asset('assets/assetLanding/images/favicon.ico') }}" />
<link rel="shortcut icon" href="{{ asset('assets/assetLanding/images/favicon2.png') }}" />
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="{{ asset('assets/assetLanding/css/bootstrap.min.css') }}" />
<!-- Typography CSS -->