MIF_E31221247/app/Services/CBRService.php

70 lines
2.4 KiB
PHP

<?php
namespace App\Services;
use App\Models\Aturan;
use App\Models\Penyakit;
class CBRService
{
public static function calculatePrediction(array $indicators)
{
if (!$indicators) {
return [];
}
// Ambil semua aturan yang relevan dengan indikator/gejala yang dimasukkan
$rules = Aturan::whereIn('kode_indikator', $indicators)->get();
// Menyimpan nilai similarity untuk setiap penyakit
$similarities = [];
// Menyimpan total bobot rule untuk setiap penyakit
$totalBobotRulePenyakit = [];
// Loop melalui aturan untuk menghitung similarity dan total bobot rule penyakit
foreach ($rules as $rule) {
$penyakit = $rule->kode_penyakit;
$weight = $rule->nilai_cf; // Menggunakan kolom nilai_cf sebagai bobot gejala
// Hitung total bobot rule penyakit
if (!isset($totalBobotRulePenyakit[$penyakit])) {
// Ambil semua aturan untuk penyakit ini dan hitung total bobotnya
$totalBobotRulePenyakit[$penyakit] = Aturan::where('kode_penyakit', $penyakit)
->sum('nilai_cf');
}
// Jika penyakit sudah ada dalam array similarities, tambahkan nilai similarity
if (isset($similarities[$penyakit])) {
$similarities[$penyakit] += $weight; // Tambahkan bobot gejala relevan
} else {
$similarities[$penyakit] = $weight; // Inisialisasi similarity
}
}
// Hitung similarity berdasarkan formula baru
$results = [];
foreach ($similarities as $kode_penyakit => $similarityScore) {
$penyakit = Penyakit::find($kode_penyakit);
if ($penyakit) {
// Total bobot rule penyakit sebagai penyebut
$totalBobotPenyakit = $totalBobotRulePenyakit[$kode_penyakit] ?? 0;
// Hitung similarity
$similarity = ($totalBobotPenyakit > 0) ? round(($similarityScore / $totalBobotPenyakit) * 100, 2) : 0;
$results[] = [
'penyakit' => $penyakit,
'confidence_score' => $similarity // Persentase similarity
];
}
}
// Urutkan hasil dari yang paling tinggi ke rendah
usort($results, function ($a, $b) {
return $b['confidence_score'] <=> $a['confidence_score'];
});
return $results;
}
}