-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathcap-sist-exp.html
544 lines (529 loc) · 68.2 KB
/
cap-sist-exp.html
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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Capítulo 57 Implementación de un sistema experto en el ámbito pediátrico | Fundamentos de ciencia de datos con R</title>
<meta name="author" content="Gema Fernández-Avilés y José-María Montero">
<meta name="description" content="Arturo Peralta\(^{a,b,c}\), José Ángel Olivas\(^{c}\) y Eusebio Angulo\(^{c}\) \(^{a}\)Universidad Internacional de Valencia\(^{b}\)Universidad Internacional de la Rioja\(^{c}\)Universidad de...">
<meta name="generator" content="bookdown 0.37 with bs4_book()">
<meta property="og:title" content="Capítulo 57 Implementación de un sistema experto en el ámbito pediátrico | Fundamentos de ciencia de datos con R">
<meta property="og:type" content="book">
<meta property="og:image" content="/img/cover.png">
<meta property="og:description" content="Arturo Peralta\(^{a,b,c}\), José Ángel Olivas\(^{c}\) y Eusebio Angulo\(^{c}\) \(^{a}\)Universidad Internacional de Valencia\(^{b}\)Universidad Internacional de la Rioja\(^{c}\)Universidad de...">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Capítulo 57 Implementación de un sistema experto en el ámbito pediátrico | Fundamentos de ciencia de datos con R">
<meta name="twitter:description" content="Arturo Peralta\(^{a,b,c}\), José Ángel Olivas\(^{c}\) y Eusebio Angulo\(^{c}\) \(^{a}\)Universidad Internacional de Valencia\(^{b}\)Universidad Internacional de la Rioja\(^{c}\)Universidad de...">
<meta name="twitter:image" content="/img/cover.png">
<!-- JS --><script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js" integrity="sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js" integrity="sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==" crossorigin="anonymous"></script><script src="https://kit.fontawesome.com/6ecbd6c532.js" crossorigin="anonymous"></script><script src="libs/jquery-3.6.0/jquery-3.6.0.min.js"></script><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link href="libs/bootstrap-4.6.0/bootstrap.min.css" rel="stylesheet">
<script src="libs/bootstrap-4.6.0/bootstrap.bundle.min.js"></script><script src="libs/bs3compat-0.6.1/transition.js"></script><script src="libs/bs3compat-0.6.1/tabs.js"></script><script src="libs/bs3compat-0.6.1/bs3compat.js"></script><link href="libs/bs4_book-1.0.0/bs4_book.css" rel="stylesheet">
<script src="libs/bs4_book-1.0.0/bs4_book.js"></script><link href="libs/tabwid-1.1.3/tabwid.css" rel="stylesheet">
<script src="libs/tabwid-1.1.3/tabwid.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js" integrity="sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js" integrity="sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==" crossorigin="anonymous"></script><!-- CSS --><link rel="stylesheet" href="bs4_style.css">
<link rel="stylesheet" href="bs4_book.css">
<link rel="stylesheet" href="style.css">
</head>
<body data-spy="scroll" data-target="#toc">
<div class="container-fluid">
<div class="row">
<header class="col-sm-12 col-lg-3 sidebar sidebar-book"><a class="sr-only sr-only-focusable" href="#content">Skip to main content</a>
<div class="d-flex align-items-start justify-content-between">
<h1>
<a href="index.html" title="">Fundamentos de ciencia de datos con <strong>R</strong></a>
</h1>
<button class="btn btn-outline-primary d-lg-none ml-2 mt-1" type="button" data-toggle="collapse" data-target="#main-nav" aria-expanded="true" aria-controls="main-nav"><i class="fas fa-bars"></i><span class="sr-only">Show table of contents</span></button>
</div>
<div id="main-nav" class="collapse-lg">
<form role="search">
<input id="search" class="form-control" type="search" placeholder="Buscar" aria-label="Buscar">
</form>
<nav aria-label="Contenido"><h2>Contenido</h2>
<ul class="book-toc list-unstyled">
<li><a class="" href="index.html">Prefacio</a></li>
<li><a class="" href="pr%C3%B3logo-by-julia-silge.html">Prólogo (by Julia Silge)</a></li>
<li><a class="" href="pr%C3%B3logo-por-yanina-bellini.html">Prólogo (por Yanina Bellini)</a></li>
<li class="book-part">Ciencia, datos, software… y científicos</li>
<li><a class="" href="ciencia-datos.html"><span class="header-section-number">1</span> ¿Es la ciencia de datos una ciencia?</a></li>
<li><a class="" href="metodologia.html"><span class="header-section-number">2</span> Metodología en ciencia de datos</a></li>
<li><a class="" href="ch-110003.html"><span class="header-section-number">3</span> R para ciencia de datos</a></li>
<li><a class="" href="cap-etica.html"><span class="header-section-number">4</span> Ética en la ciencia de datos</a></li>
<li class="book-part">Bienvenidos a la jungla de datos</li>
<li><a class="" href="datos-sql.html"><span class="header-section-number">5</span> Gestión de bases de datos relacionales</a></li>
<li><a class="" href="cap-nosql.html"><span class="header-section-number">6</span> Gestión de bases de datos NoSQL</a></li>
<li><a class="" href="DGDQM.html"><span class="header-section-number">7</span> Gobierno, gestión y calidad del dato</a></li>
<li><a class="" href="cap-130009.html"><span class="header-section-number">8</span> Integración y limpieza de datos</a></li>
<li><a class="" href="chap-feature.html"><span class="header-section-number">9</span> Selección y transformación de variables</a></li>
<li><a class="" href="chap-herramientas.html"><span class="header-section-number">10</span> Herramientas para el análisis en ciencia de datos</a></li>
<li><a class="" href="cap-120006-aed.html"><span class="header-section-number">11</span> Análisis exploratorio de datos</a></li>
<li class="book-part">Fundamentos de estadística</li>
<li><a class="" href="Funda-probab.html"><span class="header-section-number">12</span> Probabilidad</a></li>
<li><a class="" href="Fundainfer.html"><span class="header-section-number">13</span> Inferencia estadística</a></li>
<li><a class="" href="muestreo.html"><span class="header-section-number">14</span> Muestreo y remuestreo</a></li>
<li class="book-part">Modelización estadística</li>
<li><a class="" href="cap-lm.html"><span class="header-section-number">15</span> Modelización lineal</a></li>
<li><a class="" href="cap-glm.html"><span class="header-section-number">16</span> Modelos lineales generalizados</a></li>
<li><a class="" href="cap-gam.html"><span class="header-section-number">17</span> Modelos aditivos generalizados</a></li>
<li><a class="" href="cap-mxm.html"><span class="header-section-number">18</span> Modelos mixtos</a></li>
<li><a class="" href="cap-sparse.html"><span class="header-section-number">19</span> Modelos \(\textit{sparse}\) y métodos penalizados de regresión</a></li>
<li><a class="" href="cap-series-temp.html"><span class="header-section-number">20</span> Modelización de series temporales</a></li>
<li><a class="" href="cap-discriminante.html"><span class="header-section-number">21</span> Análisis discriminante</a></li>
<li><a class="" href="cap-conjunto.html"><span class="header-section-number">22</span> Análisis conjunto</a></li>
<li><a class="" href="tablas-contingencia.html"><span class="header-section-number">23</span> Análisis de tablas de contingencia</a></li>
<li class="book-part">Machine learning supervisado</li>
<li><a class="" href="cap-arboles.html"><span class="header-section-number">24</span> Árboles de clasificación y regresión</a></li>
<li><a class="" href="cap-svm.html"><span class="header-section-number">25</span> Máquinas de vector soporte</a></li>
<li><a class="" href="cap-knn.html"><span class="header-section-number">26</span> Clasificador \(k\)-vecinos más próximos</a></li>
<li><a class="" href="cap-naive-bayes.html"><span class="header-section-number">27</span> Naive Bayes</a></li>
<li><a class="" href="cap-bagg-rf.html"><span class="header-section-number">28</span> Métodos ensamblados: \(\bf \textit {bagging}\) y \(\bf \textit{random}\) \(\bf \textit{forest}\)</a></li>
<li><a class="" href="cap-boosting-xgboost.html"><span class="header-section-number">29</span> \(\bf \textit{Boosting}\) y el algoritmo XGBoost</a></li>
<li class="book-part">Machine learning no supervisado</li>
<li><a class="" href="cap-cluster.html"><span class="header-section-number">30</span> Análisis clúster: clusterización jerárquica</a></li>
<li><a class="" href="no-jerarquico.html"><span class="header-section-number">31</span> Análisis clúster: clusterización no jerárquica</a></li>
<li><a class="" href="acp.html"><span class="header-section-number">32</span> Análisis de componentes principales</a></li>
<li><a class="" href="af.html"><span class="header-section-number">33</span> Análisis factorial</a></li>
<li><a class="" href="mds.html"><span class="header-section-number">34</span> Escalamiento multidimensional</a></li>
<li><a class="" href="correspondencias.html"><span class="header-section-number">35</span> Análisis de correspondencias</a></li>
<li class="book-part">Deep learning</li>
<li><a class="" href="capNN.html"><span class="header-section-number">36</span> Redes neuronales artificiales</a></li>
<li><a class="" href="cap-redes-convol.html"><span class="header-section-number">37</span> Redes neuronales convolucionales</a></li>
<li class="book-part">Ciencia de datos de texto y redes</li>
<li><a class="" href="mineria-textos.html"><span class="header-section-number">38</span> Minería de textos</a></li>
<li><a class="" href="grafos.html"><span class="header-section-number">39</span> Análisis de grafos y redes sociales</a></li>
<li class="book-part">Ciencia de datos espaciales</li>
<li><a class="" href="datos-espaciales.html"><span class="header-section-number">40</span> Trabajando con datos espaciales</a></li>
<li><a class="" href="geo.html"><span class="header-section-number">41</span> Geoestadística</a></li>
<li><a class="" href="cap-econom-esp.html"><span class="header-section-number">42</span> Modelos econométricos espaciales</a></li>
<li><a class="" href="cap-pp.html"><span class="header-section-number">43</span> Procesos de puntos</a></li>
<li class="book-part">Comunica y colabora</li>
<li><a class="" href="cap-120007-informes.html"><span class="header-section-number">44</span> Informes reproducibles con R Markdown y Quarto</a></li>
<li><a class="" href="shiny.html"><span class="header-section-number">45</span> Creación de aplicaciones web interactivas con Shiny</a></li>
<li><a class="" href="github.html"><span class="header-section-number">46</span> Git y GitHub R</a></li>
<li><a class="" href="geoproces.html"><span class="header-section-number">47</span> Geoprocesamiento en nube</a></li>
<li class="book-part">Casos de estudio en ciencia de datos</li>
<li><a class="" href="cap-crimen.html"><span class="header-section-number">48</span> Análisis de una red criminal</a></li>
<li><a class="" href="cap-publicidad.html"><span class="header-section-number">49</span> Optimización de inversiones publicitarias</a></li>
<li><a class="" href="cap-twitter.html"><span class="header-section-number">50</span> ¿Cómo tuitea Elon Musk?</a></li>
<li><a class="" href="cap-periodismo.html"><span class="header-section-number">51</span> Análisis electoral: de RStudio a su periódico favorito</a></li>
<li><a class="" href="paro-clm.html"><span class="header-section-number">52</span> El impacto de las crisis financiera y de la COVID-19 en el paro de CLM</a></li>
<li><a class="" href="cap-rfm.html"><span class="header-section-number">53</span> Segmentación de clientes en el comercio minorista</a></li>
<li><a class="" href="cap-medicina.html"><span class="header-section-number">54</span> Análisis de datos en medicina</a></li>
<li><a class="" href="cap-futbol.html"><span class="header-section-number">55</span> Messi y Ronaldo: dos ídolos desde la perspectiva de los datos</a></li>
<li><a class="" href="cambioclimatico.html"><span class="header-section-number">56</span> Una nota sobre el cambio climático</a></li>
<li><a class="active" href="cap-sist-exp.html"><span class="header-section-number">57</span> Implementación de un sistema experto en el ámbito pediátrico</a></li>
<li><a class="" href="cap-ree.html"><span class="header-section-number">58</span> Predicción de consumo eléctrico con redes neuronales artificiales</a></li>
<li><a class="" href="nlp-textil.html"><span class="header-section-number">59</span> El procesamiento del lenguaje natural para tendencias de moda en textil</a></li>
<li><a class="" href="cap-fraude.html"><span class="header-section-number">60</span> Detección de fraude de tarjetas de crédito</a></li>
<li class="book-part">Appendix</li>
<li><a class="" href="info-session.html"><span class="header-section-number">A</span> Información de la sesión</a></li>
<li><a class="" href="referencias.html">Referencias</a></li>
</ul>
<div class="book-extra">
</div>
</nav>
</div>
</header><main class="col-sm-12 col-md-9 col-lg-7" id="content"><div id="cap-sist-exp" class="section level1" number="57">
<h1>
<span class="header-section-number">Capítulo 57</span> Implementación de un sistema experto en el ámbito pediátrico<a class="anchor" aria-label="anchor" href="#cap-sist-exp"><i class="fas fa-link"></i></a>
</h1>
<p><em>Arturo Peralta</em><span class="math inline">\(^{a,b,c}\)</span>, <em>José Ángel Olivas</em><span class="math inline">\(^{c}\)</span> y <em>Eusebio Angulo</em><span class="math inline">\(^{c}\)</span></p>
<p><span class="math inline">\(^{a}\)</span>Universidad Internacional de Valencia<br><span class="math inline">\(^{b}\)</span>Universidad Internacional de la Rioja<br><span class="math inline">\(^{c}\)</span>Universidad de Castilla-La Mancha</p>
<div id="introducción-28" class="section level2" number="57.1">
<h2>
<span class="header-section-number">57.1</span> Introducción<a class="anchor" aria-label="anchor" href="#introducci%C3%B3n-28"><i class="fas fa-link"></i></a>
</h2>
<p></p>
<p>Sin lugar a duda, el análisis de situaciones complejas para la evaluación y toma de decisiones es un proceso para el que tradicionalmente se requiere el apoyo de un especialista dispuesto a poner en uso todo su conocimiento. Sin embargo, el desarrollo de sistemas automáticos capaces de modelar y procesar el conocimiento que un experto pudiera tener sobre un ámbito concreto para dar una respuesta adecuada a una consulta relacionada está cada día más extendido como mecanismo de ayuda. A este tipo de herramientas se les denomina <strong>sistemas expertos</strong> (SE).</p>
<p>En este capítulo se introducen los conceptos teóricos fundamentales de la <strong>ingeniería del conocimiento</strong>, los componentes y el funcionamiento de los SE para, posteriormente, presentar cómo su aplicación puede apoyar en el proceso de evaluación clínica en el ámbito pediátrico de atención primaria.
Finalmente, se incluye una sencilla implementación en <strong>R</strong> de un SE enfocado a la ayuda en esta problemática.</p>
</div>
<div id="marco-teórico" class="section level2" number="57.2">
<h2>
<span class="header-section-number">57.2</span> Marco teórico<a class="anchor" aria-label="anchor" href="#marco-te%C3%B3rico"><i class="fas fa-link"></i></a>
</h2>
<p>Un SE es un programa de ordenador que trata de emular el comportamiento de una persona experta en un dominio de conocimiento específico ante un problema que se plantee en dicho dominio y cómo llega a su solución. La ingeniería del conocimiento se ocupa, entre otras cosas, del proceso de especificación, análisis y desarrollo de un sistema experto <span class="citation">(<a href="referencias.html#ref-MaMoCa2005">Martínez et al., 2005</a>)</span>.</p>
<p>
</p>
<p>Los principales componentes de un SE son:
<span class="math inline">\((i)\)</span> la <strong>base de hechos (BH)</strong>, que contiene la definición del entorno sobre el que se van a resolver problemas. Hace el papel de “ojos” del SE; <span class="math inline">\((ii)\)</span> la <strong>base de conocimientos (BC)</strong>, que contiene la información del dominio específico, convenientemente representado, capaz de resolver problemas. También puede considerar la representación de incertidumbre; <span class="math inline">\((iii)\)</span> el <strong>motor de inferencias</strong>, que es el proceso de razonamiento que usa el SE. Combina hechos y conocimiento para emitir una conclusión; y
<span class="math inline">\((iv)\)</span> la <strong>interfaz de entrada/salida</strong> para comunicarse con los usuarios y/o expertos.</p>
<p>En la Fig.
<a href="cap-sist-exp.html#fig:ComponentesSistemaExperto">57.1</a> se muestra un diagrama con los principales componentes de un SE.</p>
<div class="figure" style="text-align: center">
<span style="display:block;" id="fig:ComponentesSistemaExperto"></span>
<img src="img/ComponentesSistemaExperto.png" alt="Componentes de un sistema experto." width="100%"><p class="caption">
Figura 57.1: Componentes de un sistema experto.
</p>
</div>
<p>Las principales limitaciones en la construcción de un SE vienen dadas porque el conocimiento experto humano es experiencia compilada, es heurístico, esto es, basado en experiencia y en reglas prácticas. Además, es incompleto, impreciso e incierto y, a veces, inconsistente y con errores o imprecisiones.
Es por ello que las limitaciones de todo SE pueden ser que no conoce lo que conoce ni el porqué, carece de imaginación, emociones, inteligencia innata, sentido común, etc. Tiene poco conocimiento de sí mismo, del usuario y del contexto de cada interacción y capacidad de razonamiento limitada por su estrategia de construcción.</p>
<p>En este contexto, los <strong>sistemas de producción</strong> son modelos de cálculo que han probado su eficiencia en la ingeniería del conocimiento, tanto en el desarrollo de algoritmos de búsqueda como en el modelado de problemas del dominio humano. Sus componentes principales son:</p>
<ol style="list-style-type: decimal">
<li>Las <strong>reglas de producción</strong>, que son la forma más extendida de representar el conocimiento, constan de condiciones (hipótesis) y acciones (conclusiones) y tienen la forma:</li>
</ol>
<div class="sourceCode" id="cb833"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb833-1"><a href="cap-sist-exp.html#cb833-1" tabindex="-1"></a> <span class="fu">Si</span> (If)</span>
<span id="cb833-2"><a href="cap-sist-exp.html#cb833-2" tabindex="-1"></a> Condición <span class="dv">1</span> </span>
<span id="cb833-3"><a href="cap-sist-exp.html#cb833-3" tabindex="-1"></a> y Condición <span class="dv">2</span> </span>
<span id="cb833-4"><a href="cap-sist-exp.html#cb833-4" tabindex="-1"></a> ... </span>
<span id="cb833-5"><a href="cap-sist-exp.html#cb833-5" tabindex="-1"></a> y Condición n</span>
<span id="cb833-6"><a href="cap-sist-exp.html#cb833-6" tabindex="-1"></a> <span class="fu">Entonces</span> (Then)</span>
<span id="cb833-7"><a href="cap-sist-exp.html#cb833-7" tabindex="-1"></a> Conclusión <span class="dv">1</span></span>
<span id="cb833-8"><a href="cap-sist-exp.html#cb833-8" tabindex="-1"></a> Conclusión <span class="dv">2</span></span>
<span id="cb833-9"><a href="cap-sist-exp.html#cb833-9" tabindex="-1"></a> ...</span>
<span id="cb833-10"><a href="cap-sist-exp.html#cb833-10" tabindex="-1"></a> y Conclusión m</span></code></pre></div>
<p>Por ejemplo:</p>
<div class="sourceCode" id="cb834"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb834-1"><a href="cap-sist-exp.html#cb834-1" tabindex="-1"></a> Si </span>
<span id="cb834-2"><a href="cap-sist-exp.html#cb834-2" tabindex="-1"></a> ha fallado la bombilla </span>
<span id="cb834-3"><a href="cap-sist-exp.html#cb834-3" tabindex="-1"></a> y hay una de repuesto </span>
<span id="cb834-4"><a href="cap-sist-exp.html#cb834-4" tabindex="-1"></a> y está útil</span>
<span id="cb834-5"><a href="cap-sist-exp.html#cb834-5" tabindex="-1"></a> Entonces</span>
<span id="cb834-6"><a href="cap-sist-exp.html#cb834-6" tabindex="-1"></a> cambiar la bombilla por la de repuesto</span>
<span id="cb834-7"><a href="cap-sist-exp.html#cb834-7" tabindex="-1"></a> y seguir trabajando</span></code></pre></div>
<ol start="2" style="list-style-type: decimal">
<li><p>La <strong>memoria de trabajo</strong>, que contiene una descripción del estado actual del mundo o entorno de la aplicación en cada paso del proceso de razonamiento.
Esta descripción es un modelo que sirve para asociar los antecedentes de las reglas con las observaciones del mundo, con el objetivo de seleccionar o producir las acciones apropiadas. En el momento en que se cumplen todas las condiciones de una regla se produce el “disparo” de la misma, ejecutándose la acción. Esta operación altera el contenido de la memoria de trabajo.</p></li>
<li><p>El <strong>ciclo de reconocimiento y actuación</strong>, que es el procedimiento de control de un sistema de producción. Es un procedimiento <em>feedforward</em> o hacia delante. La memoria de trabajo se inicializa con la descripción del problema. Los modelos almacenados en la memoria de trabajo se tratan de superponer en las condiciones de las producciones. Tras ello, se crea un conjunto “conflicto”, es decir, un subconjunto de producciones cuyas condiciones se cumplen. Se escoge una producción y se “dispara” o se activa. Se repite todo el proceso descrito con la memoria de trabajo modificada. El proceso continúa hasta que no haya condiciones en las reglas que cumplan el contenido de los modelos de la memoria de trabajo.</p></li>
</ol>
<p>Una de las principales ventajas de los sistemas de producción en los SE es la separación del conocimiento y del control. Se pueden hacer cambios fáciles de reglas sin cambiar el control y viceversa. Otras dos son la modularidad de las reglas de producción y la independencia del lenguaje de programación usado.</p>
<div id="razonamiento" class="section level3" number="57.2.1">
<h3>
<span class="header-section-number">57.2.1</span> Razonamiento<a class="anchor" aria-label="anchor" href="#razonamiento"><i class="fas fa-link"></i></a>
</h3>
<p>
</p>
<p>El <strong>razonamiento</strong> se define como el proceso de obtención de inferencias o conclusiones a partir de unos hechos u observaciones reales o asumidos y de un conocimiento previo.
La <strong>inferencia</strong> es el proceso por el que, a partir de unos hechos conocidos, se obtienen conclusiones acerca de otros desconocidos <span class="citation">(<a href="referencias.html#ref-amparo2004ingenieria">Amparo & Guijarro, 2004</a>; <a href="referencias.html#ref-Fleitas2017">Fleitas, 2017</a>)</span>. La realización de este tipo de procesamiento es llevada a cabo por el denominado <strong>motor de inferencia</strong>.</p>
<p>El <strong>razonamiento automático</strong> ya se utilizaba en los años 50 en los juegos. En 1963 se presentó el sistema <em>General Problem Solver</em>, capaz de hacer inferencias lógicas <span class="citation">(<a href="referencias.html#ref-newell1974simulacion">Newell et al., 1974</a>)</span>. En un SE se distinguen dos tipos de razonamiento automático:</p>
<ul>
<li><p><strong><em>Forward chaining</em></strong> (encadenamiento hacia delante, deductivo, progresivo, dirigido por datos o hechos): <code>síntomas $\rightarrow$ causas</code>. Se parte de sentencias (reglas de inferencia) de la BC para producir conclusiones o afirmaciones. Se denomina también procedimiento <em>data driven</em>.</p></li>
<li><p><strong><em>Backward chaining</em></strong> (encadenamiento hacia atrás, inductivo, regresivo, dirigido por metas u objetivos): <code>síntomas $\leftarrow$ causas</code>. Se parte de una hipótesis a contrastar proporcionando reglas en la BC de forma retroactiva para analizar las asertivas que soportan dicha hipótesis.</p></li>
</ul>
<p>Los pasos del motor de inferencia son los siguientes:</p>
<ol style="list-style-type: decimal">
<li><p>Elaboración de un <strong>conjunto conflicto</strong> con todas las reglas cuyas condiciones se cumplen;</p></li>
<li><p><strong>detección</strong> (filtro) de reglas pertinentes o <strong>selección</strong> de reglas a partir de unos hechos. Se trata de obtener de la BC el conjunto de reglas aplicables en una situación determinada o estado de la BH;</p></li>
<li><p><strong>aplicación de reglas</strong> o <strong>resolución del conflicto</strong>. Consiste en seleccionar una regla del conjunto conflicto y dispararla (ejecutar su conclusión). Se altera la BH o memoria de trabajo incluyendo el consecuente de la regla “disparada”;</p></li>
<li><p><strong>vuelta al paso 1</strong> hasta que el <strong>conjunto conflicto</strong> esté <strong>vacío</strong>.</p></li>
</ol>
<p>El ciclo de “razonamiento hacia delante” se sintetiza en los siguientes pasos:</p>
<ol style="list-style-type: decimal">
<li><p>Parte de unas observaciones (<strong>hechos</strong>);</p></li>
<li><p>a partir de los hechos observados, se <strong>seleccionan las reglas</strong> cuyas condiciones están relacionadas con estos;</p></li>
<li><p>las reglas seleccionadas son examinadas para ver si cumplen todas sus condiciones. Aquellas que las verifican constituyen el <strong>conjunto conflicto</strong>;</p></li>
<li><p>del total de reglas que forman el conjunto conflicto se selecciona una sola y se activa (se “dispara”). La selección de una regla del conjunto conflicto se denomina <strong>resolución del conflicto</strong>;</p></li>
<li><p>la activación de la regla provoca la <strong>aparición de otros hechos</strong> que se añaden a los observados y se <strong>actualiza</strong> la base de hechos;</p></li>
<li><p>vuelta al <strong>paso 2</strong> hasta analizar todos los hechos observados y deducidos.</p></li>
</ol>
<p>En la Fig.
<a href="cap-sist-exp.html#fig:FiguraRazonamientoHaciaDelante">57.2</a> se muestra el algoritmo correspondiente al ciclo de inferencia hacia delante.</p>
<div class="figure" style="text-align: center">
<span style="display:block;" id="fig:FiguraRazonamientoHaciaDelante"></span>
<img src="img/Figura1CicloRazonamientoHaciaDelante.png" alt="Ciclo de razonamiento hacia delante." width="60%"><p class="caption">
Figura 57.2: Ciclo de razonamiento hacia delante.
</p>
</div>
</div>
</div>
<div id="sistema-experto-para-el-ámbito-pediátrico-en-atención-primaria" class="section level2" number="57.3">
<h2>
<span class="header-section-number">57.3</span> Sistema experto para el ámbito pediátrico en atención primaria<a class="anchor" aria-label="anchor" href="#sistema-experto-para-el-%C3%A1mbito-pedi%C3%A1trico-en-atenci%C3%B3n-primaria"><i class="fas fa-link"></i></a>
</h2>
<p>
</p>
<div id="el-caso-de-uso" class="section level3" number="57.3.1">
<h3>
<span class="header-section-number">57.3.1</span> El caso de uso<a class="anchor" aria-label="anchor" href="#el-caso-de-uso"><i class="fas fa-link"></i></a>
</h3>
<p>En la actualidad, uno de los principales problemas al que se enfrentan los profesionales de la sanidad en el ámbito pediátrico de atención primaria en España es la falta del tiempo suficiente para realizar una evaluación clínica del estado del paciente. La necesidad de un mayor número de médicos especialistas y la aparición de picos de demanda motivados por fenómenos como el COVID-19, o de modo estacional por otras enfermedades recurrentes, favorecen esta situación.</p>
<p>Ante esta problemática, los centros de salud tratan de optimizar sus recursos mediante diferentes vías, poniendo especial interés en realizar procesos de triaje que les permitan priorizar la atención a los pacientes según su nivel de urgencia. Para ello, en España se utilizan escalas como el <em>Manchester Triage System</em> (MTS), el Sistema Español de Triaje (SET) y el <em>Canadian Pediatric Triage and Acuity Scale</em> (CPTAS) <span class="citation">(<a href="referencias.html#ref-Soler2010">Soler et al., 2010</a>)</span> para establecer el tiempo que un paciente puede esperar para recibir atención médica en base a sus síntomas y evolución.</p>
<p>Sin embargo, realizar un correcto proceso de triaje, además de requerir de un gran conocimiento experto, hace necesario un tiempo para una evaluación clínica que a veces resulta difícil dedicar. En este contexto, se plantea el desarrollo de un SE capaz de ayudar en el proceso de evaluación médica, con el objetivo de facilitar el proceso de triaje.</p>
</div>
<div id="la-implementación-del-sistema-experto" class="section level3" number="57.3.2">
<h3>
<span class="header-section-number">57.3.2</span> La implementación del sistema experto<a class="anchor" aria-label="anchor" href="#la-implementaci%C3%B3n-del-sistema-experto"><i class="fas fa-link"></i></a>
</h3>
<p>El primer paso para el desarrollo de un SE es la definición de un conjunto de reglas que modelen el conocimiento con el que se nutrirá. Para ello, es posible recurrir al apoyo de expertos, capaces de definir su conocimiento como reglas, o la aplicación de mecanismos de extracción de conocimiento a partir del procesamiento de conjuntos de datos y sucesos.</p>
<p>En este ejemplo, se recopiló y procesó un conjunto de datos relativos a los motivos de consulta pediátrica en un centro de salud, donde la escala de triaje utilizada fue el CPTAS. Los datos fueron anonimizados, seleccionando únicamente aquellos campos que pudieran resultar clave para la extracción de conocimiento y la conformación de reglas. Adicionalmente, se contó con el apoyo de profesionales especialistas del ámbito pediátrico para revisar y complementar algunas de las reglas extraídas. Un fragmento de los datos utilizados para el proceso de extracción de reglas se muestra en la Tabla <a href="cap-sist-exp.html#tab:TablaConsultaTriaje">57.1</a>.</p>
<div class="inline-table"><table class="table table-sm">
<caption>
<span id="tab:TablaConsultaTriaje">Tabla 57.1: </span> Ejemplo de datos de motivos de consulta y triaje</caption>
<thead><tr class="header">
<th>Sexo</th>
<th>Edad</th>
<th>Tiempo evolución</th>
<th>Causa</th>
<th>Triaje</th>
</tr></thead>
<tbody>
<tr class="odd">
<td>Hombre</td>
<td>1-3 años</td>
<td>25-72 horas</td>
<td>Dermatológica</td>
<td>5 (120 minutos)</td>
</tr>
<tr class="even">
<td>Mujer</td>
<td>1-3 años</td>
<td>25-72 horas</td>
<td>Respiratoria</td>
<td>3 (30 minutos)</td>
</tr>
<tr class="odd">
<td>Hombre</td>
<td>4-6 años</td>
<td>7-12 horas</td>
<td>Gastrointestinal</td>
<td>5 (120 minutos)</td>
</tr>
<tr class="even">
<td>Hombre</td>
<td>4-6 años</td>
<td>2-6 horas</td>
<td>Ocular</td>
<td>4 (60 minutos)</td>
</tr>
<tr class="odd">
<td>Mujer</td>
<td>4-6 años</td>
<td>13-24 horas</td>
<td>Fiebre</td>
<td>5 (120 minutos)</td>
</tr>
</tbody>
</table></div>
<p>A partir del procesamiento de un total de 400 visitas médicas mediante el algoritmo de extracción de reglas de asociación “Magnum Opus”, basado en la definición original de <span class="citation">Webb (<a href="referencias.html#ref-Webb2011">2011</a>)</span> y con el conocimiento experto proporcionado por un panel de pediatras, se extrajo un conjunto de reglas con suficiente calidad. A continuación se muestran, a modo de ejemplo, <span class="math inline">\(10\)</span> de ellas:</p>
<ul>
<li><p>R1: Si Causa Ginecológica o Edad mayor de 12 años <span class="math inline">\(\rightarrow\)</span> Tiempo de Evolución mayor de 73 h.</p></li>
<li><p>R2: Si Causa Ginecológica <span class="math inline">\(\rightarrow\)</span> Sexo Mujer.</p></li>
<li><p>R3: Si Edad menor de 7 días o Causa Fiebre <span class="math inline">\(\rightarrow\)</span> Tiempo de evolución de 1 h.</p></li>
<li><p>R4: Si Edad mayor de 12 años y Tiempo de Evolución mayor de 73 h <span class="math inline">\(\rightarrow\)</span> Causa Respiratoria.</p></li>
<li><p>R5: Si Tiempo Evolución mayor de 73 h y Causa Ocular <span class="math inline">\(\rightarrow\)</span> Triaje 1.</p></li>
<li><p>R6: Si Causa Respiratoria y Sexo Mujer <span class="math inline">\(\rightarrow\)</span> Triaje 3.</p></li>
<li><p>R7: Si Tiempo de Evolución entre 2-6 h o Causa Neurológica <span class="math inline">\(\rightarrow\)</span> Triaje 2.</p></li>
<li><p>R8: Si Causa Respiratoria y Tiempo de Evolución entre 2-6h <span class="math inline">\(\rightarrow\)</span> Triaje 4.</p></li>
<li><p>R9: Si Tiempo de Evolución es 13-24 h y Causa Ginecológica y Sexo Mujer <span class="math inline">\(\rightarrow\)</span> Triaje 5.</p></li>
<li><p>R10: Si Tiempo de Evolución mayor de 73 h <span class="math inline">\(\rightarrow\)</span> Triaje 4.</p></li>
</ul>
<p>A continuación, se muestra el código en <strong>R</strong> para la implementación de un SE capaz de procesar reglas como las anteriores, realizando una ejecución para obtener el valor de triaje correspondiente. Para este ejemplo se considera una niña mayor de <span class="math inline">\(12\)</span> años de edad cuyo motivo de consulta es ginecológico, con un tiempo de evolución superior a <span class="math inline">\(73\)</span> horas.</p>
<p>Es importante señalar que, normalmente, un SE parte de una BH compuesta por decenas o cientos de reglas. No obstante, para simplificar el siguiente fragmento de código, se considera únicamente la carga de <span class="math inline">\(10\)</span> reglas a modo de ejemplo.</p>
<p>Se declaran las reglas que conformarán la base conocimiento del SE:</p>
<ol style="list-style-type: decimal">
<li><p>La BC del SE contiene 10 reglas.</p></li>
<li><p>Cada regla se modela como una lista de antecedentes y un consecuente.</p></li>
<li><p>La relación entre los consecuentes se modela con el atributo “operador” del siguiente modo: <code>1 = Y lógico, 0 = O lógico, -1 = no hay operaciones</code>.</p></li>
</ol>
<div class="sourceCode" id="cb835"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="va">r1</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span></span>
<span> antecedentes <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Causa_Ginecologica"</span>, <span class="st">"Edad_>12a"</span><span class="op">)</span>,</span>
<span> consecuente <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"TiempoEvolucion_>73h"</span><span class="op">)</span>, operador <span class="op">=</span> <span class="fl">0</span></span>
<span><span class="op">)</span></span>
<span><span class="va">r2</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span></span>
<span> antecedentes <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Causa_Ginecologica"</span><span class="op">)</span>,</span>
<span> consecuente <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Sexo_Mujer"</span><span class="op">)</span>, operador <span class="op">=</span> <span class="op">-</span><span class="fl">1</span></span>
<span><span class="op">)</span></span>
<span><span class="va">r3</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span></span>
<span> antecedentes <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Edad_<7d"</span>, <span class="st">"Causa_Fiebre"</span><span class="op">)</span>,</span>
<span> consecuente <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"TiempoEvolucion_1h"</span><span class="op">)</span>, operador <span class="op">=</span> <span class="fl">0</span></span>
<span><span class="op">)</span></span>
<span><span class="va">r4</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span></span>
<span> antecedentes <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Edad_>12a"</span>, <span class="st">"TiempoEvolucion_>73h"</span><span class="op">)</span>,</span>
<span> consecuente <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Causa_Respiratoria"</span><span class="op">)</span>, operador <span class="op">=</span> <span class="fl">1</span></span>
<span><span class="op">)</span></span>
<span><span class="va">r5</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span></span>
<span> antecedentes <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"TiempoEvolucion_>73h"</span>, <span class="st">"Causa_Ocular"</span><span class="op">)</span>,</span>
<span> consecuente <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Triaje_1"</span><span class="op">)</span>, operador <span class="op">=</span> <span class="fl">1</span></span>
<span><span class="op">)</span></span>
<span><span class="va">r6</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span></span>
<span> antecedentes <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Causa_Respiratoria"</span>, <span class="st">"Sexo_Mujer"</span><span class="op">)</span>,</span>
<span> consecuente <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Triaje_3"</span><span class="op">)</span>, operador <span class="op">=</span> <span class="fl">1</span></span>
<span><span class="op">)</span></span>
<span><span class="va">r7</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span></span>
<span> antecedentes <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"TiempoEvolucion_2-6h"</span>, <span class="st">"Causa_Neurologica"</span><span class="op">)</span>,</span>
<span> consecuente <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Triaje_2"</span><span class="op">)</span>, operador <span class="op">=</span> <span class="fl">0</span></span>
<span><span class="op">)</span></span>
<span><span class="va">r8</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span></span>
<span> antecedentes <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Causa_Respiratoria"</span>, <span class="st">"TiempoEvolucion_2-6h"</span><span class="op">)</span>,</span>
<span> consecuente <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Triaje_4"</span><span class="op">)</span>, operador <span class="op">=</span> <span class="fl">1</span></span>
<span><span class="op">)</span></span>
<span><span class="va">r9</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span></span>
<span> antecedentes <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"TiempoEvolucion_13-24h"</span>, <span class="st">"Causa_Ginecologica"</span>, <span class="st">"Sexo_Mujer"</span><span class="op">)</span>,</span>
<span> consecuente <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Triaje_5"</span><span class="op">)</span>, operador <span class="op">=</span> <span class="fl">1</span></span>
<span><span class="op">)</span></span>
<span><span class="va">r10</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span></span>
<span> antecedentes <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"TiempoEvolucion_>73h"</span><span class="op">)</span>,</span>
<span> consecuente <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Triaje_4"</span><span class="op">)</span>, operador <span class="op">=</span> <span class="op">-</span><span class="fl">1</span></span>
<span><span class="op">)</span></span>
<span></span>
<span><span class="co"># r1 regla completa</span></span>
<span><span class="co"># r1[1] lista antecedentes</span></span>
<span><span class="co"># r1[[1]] [1] primero de los antecedentes</span></span>
<span><span class="co"># r1[2] lista consecuentes</span></span>
<span><span class="co"># r1[[2]] [1] primero de los consecuentes</span></span></code></pre></div>
<div class="sourceCode" id="cb836"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="va">b_hechos</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Causa_Ginecologica"</span>, <span class="st">"Edad_>12a"</span>, <span class="st">"TiempoEvolucion_>73h"</span><span class="op">)</span></span></code></pre></div>
<p>Se inicializa la BC con el conjunto de reglas y la BH con la circunstancia a evaluar:</p>
<div class="sourceCode" id="cb837"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="co"># Se añaden todas las reglas a la Base de Conocimiento</span></span>
<span><span class="va">b_conocimiento</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="va">r1</span>, <span class="va">r2</span>, <span class="va">r3</span>, <span class="va">r4</span>, <span class="va">r5</span>, <span class="va">r6</span>, <span class="va">r7</span>, <span class="va">r8</span>, <span class="va">r9</span>, <span class="va">r10</span><span class="op">)</span></span></code></pre></div>
<p>Se define una función para comprobar la existencia de un número en una lista. Esta función será usada por el motor del SE:</p>
<div class="sourceCode" id="cb838"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="co"># Función para comprobar si una lista contiene un número</span></span>
<span><span class="va">contiene</span> <span class="op"><-</span> <span class="kw">function</span><span class="op">(</span><span class="va">numero</span>, <span class="va">lista</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="va">existe</span> <span class="op"><-</span> <span class="cn">FALSE</span></span>
<span> <span class="kw">if</span> <span class="op">(</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">lista</span><span class="op">)</span> <span class="op">></span> <span class="fl">0</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="kw">for</span> <span class="op">(</span><span class="va">i</span> <span class="kw">in</span> <span class="fl">1</span><span class="op">:</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">lista</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="kw">if</span> <span class="op">(</span><span class="va">numero</span> <span class="op">==</span> <span class="va">lista</span><span class="op">[[</span><span class="va">i</span><span class="op">]</span><span class="op">]</span><span class="op">)</span> <span class="va">existe</span> <span class="op"><-</span> <span class="cn">TRUE</span></span>
<span> <span class="op">}</span></span>
<span> <span class="op">}</span></span>
<span> <span class="kw"><a href="https://rdrr.io/r/base/function.html">return</a></span><span class="op">(</span><span class="va">existe</span><span class="op">)</span></span>
<span><span class="op">}</span></span></code></pre></div>
<p>Se implementa el motor del SE: el algoritmo ejecuta un bucle en el que, en cada iteración, evalúa las reglas disponibles contenidas en la BC. Considerando los ítems de la BH, si una regla puede ser “disparada” se añade al conjunto conflicto. La regla “disparada” en una iteración será la primera disponible en el conjunto conflicto. Este se inicializa en cada iteración. El consecuente de la regla “disparada” se añade a la BH. Cada regla solo puede “dispararse” una vez, por lo que se actualiza una lista de reglas “disparadas”. El algoritmo finaliza cuando el conjunto conflicto queda vacío, al haber sido “disparadas” todas las reglas o no existir más candidatas a ser “disparadas”.</p>
<div class="sourceCode" id="cb839"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="co"># Motor del Sistema Experto</span></span>
<span><span class="va">AlgoritmoSE</span> <span class="op"><-</span> <span class="kw">function</span><span class="op">(</span><span class="va">b_hechos</span>, <span class="va">b_conocimiento</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="va">c_conflicto</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="op">)</span></span>
<span> <span class="va">r_disparadas</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="op">)</span></span>
<span> <span class="va">condicion</span> <span class="op"><-</span> <span class="cn">TRUE</span></span>
<span> <span class="va">iteracion</span> <span class="op"><-</span> <span class="fl">0</span></span>
<span> <span class="kw">while</span> <span class="op">(</span><span class="va">condicion</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="va">c_conflicto</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="op">)</span></span>
<span> <span class="fu"><a href="https://rdrr.io/r/base/cat.html">cat</a></span><span class="op">(</span><span class="st">"Iteración: "</span>, <span class="va">iteracion</span>, <span class="st">"\n"</span><span class="op">)</span></span>
<span> <span class="va">iteracion</span> <span class="op"><-</span> <span class="va">iteracion</span> <span class="op">+</span> <span class="fl">1</span></span>
<span> <span class="kw">for</span> <span class="op">(</span><span class="va">i</span> <span class="kw">in</span> <span class="fl">1</span><span class="op">:</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">b_conocimiento</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="kw">if</span> <span class="op">(</span><span class="op">!</span><span class="fu">contiene</span><span class="op">(</span><span class="va">i</span>, <span class="va">r_disparadas</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="kw">if</span> <span class="op">(</span><span class="va">b_conocimiento</span><span class="op">[[</span><span class="va">i</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">3</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">1</span><span class="op">]</span><span class="op">]</span> <span class="op">==</span> <span class="fl">1</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="va">r_disparada</span> <span class="op"><-</span> <span class="cn">TRUE</span></span>
<span> <span class="op">}</span> <span class="kw">else</span> <span class="op">{</span></span>
<span> <span class="va">r_disparada</span> <span class="op"><-</span> <span class="cn">FALSE</span></span>
<span> <span class="op">}</span></span>
<span> <span class="kw">for</span> <span class="op">(</span><span class="va">j</span> <span class="kw">in</span> <span class="fl">1</span><span class="op">:</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">b_conocimiento</span><span class="op">[[</span><span class="va">i</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">1</span><span class="op">]</span><span class="op">]</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="va">antecedente</span> <span class="op"><-</span> <span class="cn">FALSE</span></span>
<span> <span class="kw">for</span> <span class="op">(</span><span class="va">k</span> <span class="kw">in</span> <span class="fl">1</span><span class="op">:</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">b_hechos</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="kw">if</span> <span class="op">(</span><span class="va">b_conocimiento</span><span class="op">[[</span><span class="va">i</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">1</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="va">j</span><span class="op">]</span><span class="op">]</span> <span class="op">==</span> <span class="va">b_hechos</span><span class="op">[[</span><span class="va">k</span><span class="op">]</span><span class="op">]</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="kw">if</span> <span class="op">(</span><span class="va">b_conocimiento</span><span class="op">[[</span><span class="va">i</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">3</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">1</span><span class="op">]</span><span class="op">]</span> <span class="op">==</span> <span class="fl">0</span> <span class="op">||</span> <span class="va">b_conocimiento</span><span class="op">[[</span><span class="va">i</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">3</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">1</span><span class="op">]</span><span class="op">]</span> <span class="op">==</span> <span class="op">-</span><span class="fl">1</span><span class="op">)</span> <span class="va">r_disparada</span> <span class="op"><-</span> <span class="cn">TRUE</span></span>
<span> <span class="va">antecedente</span> <span class="op"><-</span> <span class="cn">TRUE</span></span>
<span> <span class="op">}</span></span>
<span> <span class="op">}</span></span>
<span> <span class="kw">if</span> <span class="op">(</span><span class="va">b_conocimiento</span><span class="op">[[</span><span class="va">i</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">3</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">1</span><span class="op">]</span><span class="op">]</span> <span class="op">==</span> <span class="fl">1</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="kw">if</span> <span class="op">(</span><span class="op">!</span><span class="va">antecedente</span><span class="op">)</span> <span class="va">r_disparada</span> <span class="op"><-</span> <span class="cn">FALSE</span></span>
<span> <span class="op">}</span></span>
<span> <span class="op">}</span></span>
<span> <span class="kw">if</span> <span class="op">(</span><span class="va">r_disparada</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="fu"><a href="https://rdrr.io/r/base/cat.html">cat</a></span><span class="op">(</span><span class="st">"Regla"</span>, <span class="va">i</span>, <span class="st">"añadida a Conjunto conflicto\n"</span><span class="op">)</span></span>
<span> <span class="va">c_conflicto</span><span class="op">[</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">c_conflicto</span><span class="op">)</span> <span class="op">+</span> <span class="fl">1</span><span class="op">]</span> <span class="op"><-</span> <span class="va">i</span></span>
<span> <span class="op">}</span></span>
<span> <span class="op">}</span></span>
<span> <span class="op">}</span></span>
<span> <span class="kw">if</span> <span class="op">(</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">c_conflicto</span><span class="op">)</span> <span class="op">></span> <span class="fl">0</span><span class="op">)</span> <span class="op">{</span></span>
<span> <span class="co"># str("Conjunto conflicto:")</span></span>
<span> <span class="co"># str(c_conflicto)</span></span>
<span> <span class="va">r_disparadas</span><span class="op">[</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">r_disparadas</span><span class="op">)</span> <span class="op">+</span> <span class="fl">1</span><span class="op">]</span> <span class="op"><-</span> <span class="va">c_conflicto</span><span class="op">[</span><span class="fl">1</span><span class="op">]</span></span>
<span> <span class="fu"><a href="https://rdrr.io/r/base/cat.html">cat</a></span><span class="op">(</span><span class="st">"Regla"</span>, <span class="va">r_disparadas</span><span class="op">[[</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">r_disparadas</span><span class="op">)</span><span class="op">]</span><span class="op">]</span>, <span class="st">"disparada\n"</span><span class="op">)</span></span>
<span> <span class="va">b_hechos</span><span class="op">[</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">b_hechos</span><span class="op">)</span> <span class="op">+</span> <span class="fl">1</span><span class="op">]</span> <span class="op"><-</span> <span class="va">b_conocimiento</span><span class="op">[[</span><span class="va">r_disparadas</span><span class="op">[[</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">r_disparadas</span><span class="op">)</span><span class="op">]</span><span class="op">]</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">2</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">1</span><span class="op">]</span><span class="op">]</span></span>
<span> <span class="fu"><a href="https://rdrr.io/r/utils/str.html">str</a></span><span class="op">(</span><span class="st">"Base de hechos:"</span><span class="op">)</span></span>
<span> <span class="fu"><a href="https://rdrr.io/r/utils/str.html">str</a></span><span class="op">(</span><span class="va">b_hechos</span><span class="op">)</span></span>
<span> <span class="fu"><a href="https://rdrr.io/r/base/cat.html">cat</a></span><span class="op">(</span><span class="st">"Consecuente:"</span>, <span class="va">b_conocimiento</span><span class="op">[[</span><span class="va">r_disparadas</span><span class="op">[[</span><span class="fu"><a href="https://rdrr.io/r/base/length.html">length</a></span><span class="op">(</span><span class="va">r_disparadas</span><span class="op">)</span><span class="op">]</span><span class="op">]</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">2</span><span class="op">]</span><span class="op">]</span><span class="op">[[</span><span class="fl">1</span><span class="op">]</span><span class="op">]</span>, <span class="st">"\n"</span><span class="op">)</span></span>
<span> <span class="op">}</span> <span class="kw">else</span> <span class="op">{</span></span>
<span> <span class="va">condicion</span> <span class="op"><-</span> <span class="cn">FALSE</span></span>
<span> <span class="op">}</span></span>
<span> <span class="op">}</span></span>
<span><span class="op">}</span></span></code></pre></div>
</div>
<div id="puesta-en-marcha-del-sistema-experto" class="section level3" number="57.3.3">
<h3>
<span class="header-section-number">57.3.3</span> Puesta en marcha del sistema experto<a class="anchor" aria-label="anchor" href="#puesta-en-marcha-del-sistema-experto"><i class="fas fa-link"></i></a>
</h3>
<p>Ahora considérese, por ejemplo, una posible paciente con más de 12 años de edad, que acude a consulta por causa ginecológica con un tiempo de evolución de los síntomas mayor de 73 h. ¿Qué triaje le corresponde? Para responder esta pregunta, se inicializa la BH con la situación propuesta <code>(Causa_Ginecologica, Edad_>12a y TiempoEvolucion_>73h)</code>:</p>
<div class="sourceCode" id="cb840"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="co"># Se inicializa la base de hechos con la situación propuesta (paciente de más de 12 años que acude por causa ginecológica con tiempo de evolución mayor de 73h)</span></span>
<span><span class="va">b_hechos</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html">list</a></span><span class="op">(</span><span class="st">"Causa_Ginecologica"</span>, <span class="st">"Edad_>12a"</span>, <span class="st">"TiempoEvolucion_>73h"</span><span class="op">)</span></span></code></pre></div>
<p>y se ejecuta el motor del SE:</p>
<div class="sourceCode" id="cb841"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="co"># Se lanza la ejecución del motor del Sistema Experto</span></span>
<span><span class="fu">AlgoritmoSE</span><span class="op">(</span><span class="va">b_hechos</span>, <span class="va">b_conocimiento</span><span class="op">)</span></span></code></pre></div>
<p>El resultado proporcionado por el algoritmo es un triaje de valor <span class="math inline">\(4\)</span>. Es decir, el tiempo de espera máximo para recibir atención médica debería ser inferior a <span class="math inline">\(60\)</span> minutos. La Tabla <a href="#tab:TablaIteracionesAlgoritmo"><strong>??</strong></a> muestra el proceso realizado por el algoritmo en cada iteración.</p>
<!-- Para compilar en HTML -->
<!-- tabla-html -->
<div class="inline-figure"><img src="img/tabla-58-2-sist-exp.jpg" width="100%" style="display: block; margin: auto;"></div>
<p>Como puede observarse, el algoritmo finaliza tras <span class="math inline">\(5\)</span> iteraciones, al alcanzar un conjunto conflicto vacío, dando como resultado un valor de <span class="math inline">\(4\)</span> para el triaje. A continuación, se describe el proceso ejecutado en cada una de las iteraciones.</p>
<ul>
<li><p><strong>Iteración 0:</strong> la BH se inicializa con las condiciones establecidas en el ejemplo de consulta médica considerado, es decir, <code>Causa_Ginecologica</code>, <code>Edad_>12a</code> y <code>TiempoEvolucion_>73h</code>. En el conjunto conflicto se incluyen aquellas reglas que podrían ser lanzadas con los elementos contenidos en la BH, es decir, las reglas R1, R2, R4 y R10. Se dispara la regla R1, al ser la primera de la lista de reglas del conjunto conflicto. El consecuente de la regla disparada (<code>TiempoEvolucion_>73h</code>) se añade a la BH para la siguiente iteración, aunque en este caso no es necesario porque ya lo contiene. La iteración finaliza estableciendo como conclusión el consecuente de la regla disparada, es decir, <code>TiempoEvolucion_>73h</code>.</p></li>
<li><p><strong>Iteración 1:</strong> el conjunto conflicto se inicializa con las reglas que podrían ser lanzadas, excluyendo las ya ejecutadas (R1), a partir de los elementos incluidos en la BH tras la iteración anterior, es decir, las reglas R2, R4 y R10. Se lanza la primera de las reglas del conjunto conflicto, es decir, R2. El consecuente de la regla disparada (<code>Sexo_Mujer</code>) se añade a la BH. La iteración finaliza estableciendo como conclusión el consecuente de la regla disparada, es decir, <code>Sexo_Mujer</code>.</p></li>
<li><p><strong>Iteración 2:</strong> el conjunto conflicto se inicializa con las reglas que podrían ser lanzadas, excluyendo las ya ejecutadas (R1 y R2), a partir de los elementos contenidos en la BH tras la iteración anterior, es decir, las reglas R4 y R10. Se lanza la primera de las reglas del conjunto conflicto, es decir, R4. El consecuente de la regla disparada (<code>Causa_Respiratoria</code>) se añade a la BH. La iteración finaliza estableciendo como conclusión el consecuente de la regla disparada, es decir, <code>Causa_Respiratoria</code>.</p></li>
<li><p><strong>Iteración 3:</strong> el conjunto conflicto se inicializa con las reglas que podrían ser lanzadas, excluyendo las ya ejecutadas (R1, R2 y R4), a partir de los elementos contenidos en la BH tras la iteración anterior, es decir, las reglas R6 y R10. Se lanza la primera de las reglas del conjunto conflicto, es decir, R6. El consecuente de la regla disparada (<code>Triaje_3</code>) se añade a la BH. La iteración finaliza estableciendo como conclusión el consecuente de la regla disparada, es decir, <code>Triaje_3</code>.</p></li>
<li><p><strong>Iteración 4:</strong> el conjunto conflicto se inicializa con las reglas que podrían ser lanzadas, excluyendo las ya ejecutadas (R1, R2, R4 y R6), a partir de los elementos contenidos en la BH tras la iteración anterior, en este caso únicamente R10. Se lanza por tanto la regla R10. El consecuente de la regla disparada (<code>Triaje_4</code>) se añade a la BH. La iteración finaliza estableciendo como conclusión el consecuente de la regla disparada, es decir, <code>Triaje_4</code>.</p></li>
<li><p><strong>Iteración 5:</strong> el conjunto conflicto queda vacío, al no ser posible incluir en él reglas no disparadas aún y que pudieran ser ejecutadas a partir de los elementos contenidos en la BH. Por tanto, el algoritmo finaliza concluyendo como resultado el consecuente de la última regla lanzada, es decir, <code>Triaje_4</code>.</p></li>
</ul>
<p>La implementación del algoritmo, las reglas y el modelado considerado para este caso de estudio es una simplificación intencionada del problema, con el único objetivo de facilitar su comprensión desde una perspectiva académica y docente.</p>
<p>En un escenario de aplicación real, el volumen y la complejidad de las reglas suele ser mucho mayor, considerando además la posibilidad de incorporar otras características que permitieran modelar de un modo más completo el estado de salud del paciente y su motivo de consulta.</p>
<p>Actualmente son innumerables los ámbitos donde la aplicación de un SE puede ser de ayuda. En este caso de estudio el objetivo ha sido facilitar y mejorar el proceso de triaje del nivel de urgencia en el ámbito pediátrico en atención primaria. Pero, en este mismo contexto, podría valorarse su uso como herramienta de apoyo para, por ejemplo, el diagnóstico de enfermedades o la prescripción de tratamientos.</p>
<p>La tecnología actual y los lenguajes de programación como <strong>R</strong> facilitan la implementación de los SE de un modo rápido y sencillo. Por tanto, pueden ser considerados como herramienta de ayuda para situaciones en las que aplicar conocimiento experto de forma automatizada resulte clave para la solución de problemas.</p>
</div>
</div>
</div>
<div class="chapter-nav">
<div class="prev"><a href="cambioclimatico.html"><span class="header-section-number">56</span> Una nota sobre el cambio climático</a></div>
<div class="next"><a href="cap-ree.html"><span class="header-section-number">58</span> Predicción de consumo eléctrico con redes neuronales artificiales</a></div>
</div></main><div class="col-md-3 col-lg-2 d-none d-md-block sidebar sidebar-chapter">
<nav id="toc" data-toggle="toc" aria-label="Índice del capítulo"><h2>Índice del capítulo</h2>
<ul class="nav navbar-nav">
<li><a class="nav-link" href="#cap-sist-exp"><span class="header-section-number">57</span> Implementación de un sistema experto en el ámbito pediátrico</a></li>
<li><a class="nav-link" href="#introducci%C3%B3n-28"><span class="header-section-number">57.1</span> Introducción</a></li>
<li>
<a class="nav-link" href="#marco-te%C3%B3rico"><span class="header-section-number">57.2</span> Marco teórico</a><ul class="nav navbar-nav"><li><a class="nav-link" href="#razonamiento"><span class="header-section-number">57.2.1</span> Razonamiento</a></li></ul>
</li>
<li>
<a class="nav-link" href="#sistema-experto-para-el-%C3%A1mbito-pedi%C3%A1trico-en-atenci%C3%B3n-primaria"><span class="header-section-number">57.3</span> Sistema experto para el ámbito pediátrico en atención primaria</a><ul class="nav navbar-nav">
<li><a class="nav-link" href="#el-caso-de-uso"><span class="header-section-number">57.3.1</span> El caso de uso</a></li>
<li><a class="nav-link" href="#la-implementaci%C3%B3n-del-sistema-experto"><span class="header-section-number">57.3.2</span> La implementación del sistema experto</a></li>
<li><a class="nav-link" href="#puesta-en-marcha-del-sistema-experto"><span class="header-section-number">57.3.3</span> Puesta en marcha del sistema experto</a></li>
</ul>
</li>
</ul>
<div class="book-extra">
<ul class="list-unstyled">
</ul>
</div>
</nav>
</div>
</div>
</div> <!-- .container -->
<footer class="bg-primary text-light mt-5"><div class="container"><div class="row">
<div class="col-12 col-md-6 mt-3">
<p>"<strong>Fundamentos de ciencia de datos con <strong>R</strong></strong>" coordinado por <a href="https://blog.uclm.es/gemafaviles/" class="text-light">Gema Fernández-Avilés y José-María Montero</a>. </p>
</div>
<div class="col-12 col-md-6 mt-3">
<p>Este libro ha sido generado con el paquete de R <a class="text-light" href="https://bookdown.org">bookdown</a>.</p>
</div>
</div></div>
</footer><!-- dynamically load mathjax for compatibility with self-contained --><script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
var src = "true";
if (src === "" || src === "true") src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-MML-AM_CHTML";
if (location.protocol !== "file:")
if (/^https?:/.test(src))
src = src.replace(/^https?:/, '');
script.src = src;
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script><script type="text/x-mathjax-config">const popovers = document.querySelectorAll('a.footnote-ref[data-toggle="popover"]');
for (let popover of popovers) {
const div = document.createElement('div');
div.setAttribute('style', 'position: absolute; top: 0, left:0; width:0, height:0, overflow: hidden; visibility: hidden;');
div.innerHTML = popover.getAttribute('data-content');
var has_math = div.querySelector("span.math");
if (has_math) {
document.body.appendChild(div);
MathJax.Hub.Queue(["Typeset", MathJax.Hub, div]);
MathJax.Hub.Queue(function() {
popover.setAttribute('data-content', div.innerHTML);
document.body.removeChild(div);
})
}
}
</script>
</body>
</html>