1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
| <?php
require_once '../lib_observatoria.php';
needRegistered();
$debug = 1;
$id = getInt('id');
$observatoire = getObservatoireOfIndividu($id);
$nomObservatoire = getNomObservatoire($observatoire);
$nomInd = getNomIndividu($id);
// Cette ligne est bizarre, il y a une concaténation dans le vide: ici ↴
header_(traduit('contrib_interface') . ' > ' . $nomObservatoire . ' > ' . traduit('individual')) . ' > ' . $nomInd . ' > ' . traduit('predict_ald');
?>
</head>
<body> <!-- plutôt que d'écrire < ? php echo traduit('home'); ? >, utilise des short-tags < ? = traduit('home') ? > -->
<!-- mieux vaut utiliser des entités html > pour les '>'. Tu peux aussi passer tes sorties texte par htmlspecialchars() -->
<a href="../"><?= traduit('home') ?></a> >
<a href="index.php"><?= traduit('contrib_interface') ?></a> >
<a href="observatoire.php?id=<?= $observatoire ?>"><?= $nomObservatoire ?></a> >
<?= htmlspecialchars(traduit('individual') . " > $nomInd > " . traduit('predict_ald')) ?>
<?php
function loadCsv($filename) {
$data = [];
if (($handle = fopen($filename, "r")) !== FALSE) {
$headers = fgetcsv($handle); // Lire les en-têtes
if ($headers === FALSE || empty($headers)) {
throw new Exception("Fichier CSV vide ou en-têtes manquants.");
}
array_shift($headers); // Ignorer la première colonne (clés)
while (($row = fgetcsv($handle)) !== FALSE) {
$key = array_shift($row); // Utiliser la première colonne comme clé
$data[$key] = array_combine($headers, $row);
}
fclose($handle);
} else {
throw new Exception("Impossible d'ouvrir le fichier : $filename");
}
return $data;
}
// Fonction pour prédire la classe avec LDA, avec pondération des axes
function predictLDA($newData, $scaling, $globalStats, $prior) {
$scores = [];
global $debug;
foreach ($prior as $class => $priorValue) {
$scores[$class] = 0; // Initialiser le score pour chaque classe
foreach ($newData as $var => $value) {
if (!isset($globalStats[$var]) || !isset($scaling[$var])) {
if ($debug) echo "Variable ignorée : $var<br />";
continue;
}
// Centrer et normaliser avec les moyennes et écarts-types globaux
$mean = $globalStats[$var]['mean'];
$sd = $globalStats[$var]['sd'];
$standardizedValue = ($value - $mean) / $sd;
if ($debug) echo "Variable: $var, Valeur: $value, Moyenne: $mean, Écart-type: $sd, Valeur normalisée: $standardizedValue<br />";
// Calculer la contribution pondérée pour chaque discriminant
foreach ($scaling[$var] as $ld => $coefficient) {
$contribution = $standardizedValue * $coefficient ;
$scores[$class] += $contribution;
if ($debug)
echo "Classe: $class, Variable: $var, LD: $ld, Coefficient: $coefficient, Contribution: $contribution<br />";
}
}
// Ajouter la probabilité à priori
$scores[$class] += log($prior[$class]['x']);
}
if ($debug) {
echo "Scores calculés :<br />";
echoPre($scores);
}
// Retourner la classe avec le score maximum
return array_keys($scores, max($scores))[0];
// peut-être plus clair et ne nécessitant pas la création d'un tableau (ephémère) avec PHP >= 8.4:
// return array_find_key($scores, fn($s) => $s === max($scores));
}
?>
<h1><?php echo traduit('contrib_interface').' > '.$nomObservatoire.' > '.traduit('individual').' > '.$nomInd.' > '.traduit('predict_ald'); ?></h1>
<?php apresBody(); ?>
<br /><br />
<?php
// '../admin_expert/ALD/' . $observatoire . '/ est répété 11 fois dans le code
// définir une variable genre $path = "../admin_expert/ALD/$observatoire/";
echo is_file('../admin_expert/ALD/' . $observatoire . '/coefficients_lda.csv')?1:0;
echo is_file('../admin_expert/ALD/' . $observatoire . '/global_stats.csv')?1:0;
echo is_file('../admin_expert/ALD/' . $observatoire . '/prior_lda.csv')?1:0;
if (!is_file('../admin_expert/ALD/' . $observatoire . '/coefficients_lda.csv') ||
!is_file('../admin_expert/ALD/' . $observatoire . '/global_stats.csv') ||
!is_file('../admin_expert/ALD/' . $observatoire . '/prior_lda.csv') ) {
?>
<div style="font-size:14px; font-weight:bold; color:red">
<?= traduit('no_ald') ?>
</div>
<?php
}
else {
// Charger les fichiers CSV
$scaling = loadCsv('../admin_expert/ALD/' . $observatoire . '/coefficients_lda.csv');
$globalStatsCsv = loadCsv('../admin_expert/ALD/' . $observatoire . '/global_stats.csv');
$prior = loadCsv('../admin_expert/ALD/' . $observatoire . '/prior_lda.csv');
// Reformater globalStats
$globalStats = [];
foreach ($globalStatsCsv as $var => $stats) {
$globalStats[$var] = [
'mean' => $stats['mean'],
'sd' => $stats['sd']
];
}
echo "globalStats<br>";
echoPre($globalStats);
echo "scaling<br>";
echoPre($scaling);
$prior = loadCsv('../admin_expert/ALD/' . $observatoire . '/prior_lda.csv');
echo "prior<br>";
echoPre($prior);
$mesuresTemp = explode("\n", file_get_contents('../admin_expert/ALD/' . $observatoire . '/mesures.txt'));
$mesures = array();
$mesuresObservatoire = getMesuresIdsOfObservatoire($observatoire);
$vraiesMesures = array();
foreach($mesuresTemp as $mt) {
$mesureId = getMesureId($mt);
if (in_array($mesureId, $mesuresObservatoire)) {
$specimens = getSpecimensOfIndividu($id);
$nb_specimens = count($specimens);
// $n = count($specimens); // ne sert à rien
$m = 0;
$faux = 0;
foreach ($specimens as $specimen) {
$mm = getMoyenne(getMesuresOfSpecimen2($mesureId, $specimen)); //moyenne de la mesure du spécimen
// si $mm est un nombre, alors le test $mm !== '' sera toujours false
if ($mm!=='') // peut-être: if ($mm !== 0) ?
$m += $mm;
else
$faux++;
}
$m /= $nb_specimens; //$m /= $n;
// if ($m === '' || $faux === $nb_specimens)
// $m est un nombre, pas une chaîne. Donc le test strict $m === '' sera toujours false
// suggestion: on le compare à 0, sa valeur initiale.
if ($m === 0 || $faux === $nb_specimens)
$m = getMoyenneMesureTaxon($mesureId, $observatoire, getTaxonOfSpecimen($specimen));
// moyenne de la mesure du taxon
if ($m === 0) // if ($m==='')
$m = getMoyenneMesure($mesureId, $observatoire); // moyenne de la mesure
// code bizarre: les deux if précédents testent la même condition $m === 0
$vraiesMesures['x' . $mesureId] = $m;
}
}
if ($debug)
echoPre($vraiesMesures);
// Prédire la classe
$predictedClass = predictLDA($vraiesMesures, $scaling, $globalStats, $prior);
echo traduit('predicted_class') . $predictedClass;
}
?>
</body>
</html> |
Partager