70 lines
2.4 KiB
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;
|
|
}
|
|
} |