Teoría

Una Red Neuronal Artificial (ANN) modela la relación entre un conjunto de entradas y una salida, resolviendo un problema de aprendizaje.

Ejemplos prácticos de aplicación de Redes Neuronales son:

  • La recomendación de contenido de Netflix
  • El feed de Instagram o TikTok
  • Determinar el número o letra escrito a mano

Instalar paquetes y llamar librerías

# install.packages("neuralnet")
library(neuralnet)

Alimentar con ejemplos

examen <- c(20,10,30,20,80,30)
proyecto <- c(90,20,40,50,50,80)
estatus <- c(1,0,0,0,0,1)
df <- data.frame(examen,proyecto,estatus)

Generar la Red Neuronal

red_neuronal <- neuralnet(estatus~., data=df)
plot(red_neuronal, rep="best")

Predecir con la Red Neuronal

prueba_examen <- c(30,40,85)
prueba_proyecto <- c(85,50,40)
prueba <- data.frame(prueba_examen, prueba_proyecto)
prediccion <- compute(red_neuronal, prueba)
prediccion$net.result
##           [,1]
## [1,] 0.3329889
## [2,] 0.3329889
## [3,] 0.3329889
probabilidad <- prediccion$net.result
resultado <- ifelse(probabilidad>0.5,1,0)
resultado
##      [,1]
## [1,]    0
## [2,]    0
## [3,]    0

Caso Práctico: Cáncer de Mama

Instalar paquetes y llamar librerías

# install.packages("ggplot2") # Gráficas
library(ggplot2)
# install.packages("lattice") # Crear gráficos
library(lattice)
# install.packages("caret") # Algoritmos de aprendizaje automático
library(caret)
# install.packages("datasets") # Usar bases de datos, en este caso Iris
library(datasets)
# install.packages("DataExplorer") # Análisis exploratorio
library(DataExplorer)

Llamar la base de datos

df1 <- read.csv("C:\\Users\\gardi\\Downloads\\cancer_de_mama.csv")

Entender la base de datos

summary(df1)
##   diagnosis          radius_mean      texture_mean   perimeter_mean  
##  Length:569         Min.   : 6.981   Min.   : 9.71   Min.   : 43.79  
##  Class :character   1st Qu.:11.700   1st Qu.:16.17   1st Qu.: 75.17  
##  Mode  :character   Median :13.370   Median :18.84   Median : 86.24  
##                     Mean   :14.127   Mean   :19.29   Mean   : 91.97  
##                     3rd Qu.:15.780   3rd Qu.:21.80   3rd Qu.:104.10  
##                     Max.   :28.110   Max.   :39.28   Max.   :188.50  
##    area_mean      smoothness_mean   compactness_mean  concavity_mean   
##  Min.   : 143.5   Min.   :0.05263   Min.   :0.01938   Min.   :0.00000  
##  1st Qu.: 420.3   1st Qu.:0.08637   1st Qu.:0.06492   1st Qu.:0.02956  
##  Median : 551.1   Median :0.09587   Median :0.09263   Median :0.06154  
##  Mean   : 654.9   Mean   :0.09636   Mean   :0.10434   Mean   :0.08880  
##  3rd Qu.: 782.7   3rd Qu.:0.10530   3rd Qu.:0.13040   3rd Qu.:0.13070  
##  Max.   :2501.0   Max.   :0.16340   Max.   :0.34540   Max.   :0.42680  
##  concave_points_mean symmetry_mean    fractal_dimension_mean   radius_se     
##  Min.   :0.00000     Min.   :0.1060   Min.   :0.04996        Min.   :0.1115  
##  1st Qu.:0.02031     1st Qu.:0.1619   1st Qu.:0.05770        1st Qu.:0.2324  
##  Median :0.03350     Median :0.1792   Median :0.06154        Median :0.3242  
##  Mean   :0.04892     Mean   :0.1812   Mean   :0.06280        Mean   :0.4052  
##  3rd Qu.:0.07400     3rd Qu.:0.1957   3rd Qu.:0.06612        3rd Qu.:0.4789  
##  Max.   :0.20120     Max.   :0.3040   Max.   :0.09744        Max.   :2.8730  
##    texture_se      perimeter_se       area_se        smoothness_se     
##  Min.   :0.3602   Min.   : 0.757   Min.   :  6.802   Min.   :0.001713  
##  1st Qu.:0.8339   1st Qu.: 1.606   1st Qu.: 17.850   1st Qu.:0.005169  
##  Median :1.1080   Median : 2.287   Median : 24.530   Median :0.006380  
##  Mean   :1.2169   Mean   : 2.866   Mean   : 40.337   Mean   :0.007041  
##  3rd Qu.:1.4740   3rd Qu.: 3.357   3rd Qu.: 45.190   3rd Qu.:0.008146  
##  Max.   :4.8850   Max.   :21.980   Max.   :542.200   Max.   :0.031130  
##  compactness_se      concavity_se     concave_points_se   symmetry_se      
##  Min.   :0.002252   Min.   :0.00000   Min.   :0.000000   Min.   :0.007882  
##  1st Qu.:0.013080   1st Qu.:0.01509   1st Qu.:0.007638   1st Qu.:0.015160  
##  Median :0.020450   Median :0.02589   Median :0.010930   Median :0.018730  
##  Mean   :0.025478   Mean   :0.03189   Mean   :0.011796   Mean   :0.020542  
##  3rd Qu.:0.032450   3rd Qu.:0.04205   3rd Qu.:0.014710   3rd Qu.:0.023480  
##  Max.   :0.135400   Max.   :0.39600   Max.   :0.052790   Max.   :0.078950  
##  fractal_dimension_se  radius_worst   texture_worst   perimeter_worst 
##  Min.   :0.0008948    Min.   : 7.93   Min.   :12.02   Min.   : 50.41  
##  1st Qu.:0.0022480    1st Qu.:13.01   1st Qu.:21.08   1st Qu.: 84.11  
##  Median :0.0031870    Median :14.97   Median :25.41   Median : 97.66  
##  Mean   :0.0037949    Mean   :16.27   Mean   :25.68   Mean   :107.26  
##  3rd Qu.:0.0045580    3rd Qu.:18.79   3rd Qu.:29.72   3rd Qu.:125.40  
##  Max.   :0.0298400    Max.   :36.04   Max.   :49.54   Max.   :251.20  
##    area_worst     smoothness_worst  compactness_worst concavity_worst 
##  Min.   : 185.2   Min.   :0.07117   Min.   :0.02729   Min.   :0.0000  
##  1st Qu.: 515.3   1st Qu.:0.11660   1st Qu.:0.14720   1st Qu.:0.1145  
##  Median : 686.5   Median :0.13130   Median :0.21190   Median :0.2267  
##  Mean   : 880.6   Mean   :0.13237   Mean   :0.25427   Mean   :0.2722  
##  3rd Qu.:1084.0   3rd Qu.:0.14600   3rd Qu.:0.33910   3rd Qu.:0.3829  
##  Max.   :4254.0   Max.   :0.22260   Max.   :1.05800   Max.   :1.2520  
##  concave_points_worst symmetry_worst   fractal_dimension_worst
##  Min.   :0.00000      Min.   :0.1565   Min.   :0.05504        
##  1st Qu.:0.06493      1st Qu.:0.2504   1st Qu.:0.07146        
##  Median :0.09993      Median :0.2822   Median :0.08004        
##  Mean   :0.11461      Mean   :0.2901   Mean   :0.08395        
##  3rd Qu.:0.16140      3rd Qu.:0.3179   3rd Qu.:0.09208        
##  Max.   :0.29100      Max.   :0.6638   Max.   :0.20750
str(df1)
## 'data.frame':    569 obs. of  31 variables:
##  $ diagnosis              : chr  "M" "M" "M" "M" ...
##  $ radius_mean            : num  18 20.6 19.7 11.4 20.3 ...
##  $ texture_mean           : num  10.4 17.8 21.2 20.4 14.3 ...
##  $ perimeter_mean         : num  122.8 132.9 130 77.6 135.1 ...
##  $ area_mean              : num  1001 1326 1203 386 1297 ...
##  $ smoothness_mean        : num  0.1184 0.0847 0.1096 0.1425 0.1003 ...
##  $ compactness_mean       : num  0.2776 0.0786 0.1599 0.2839 0.1328 ...
##  $ concavity_mean         : num  0.3001 0.0869 0.1974 0.2414 0.198 ...
##  $ concave_points_mean    : num  0.1471 0.0702 0.1279 0.1052 0.1043 ...
##  $ symmetry_mean          : num  0.242 0.181 0.207 0.26 0.181 ...
##  $ fractal_dimension_mean : num  0.0787 0.0567 0.06 0.0974 0.0588 ...
##  $ radius_se              : num  1.095 0.543 0.746 0.496 0.757 ...
##  $ texture_se             : num  0.905 0.734 0.787 1.156 0.781 ...
##  $ perimeter_se           : num  8.59 3.4 4.58 3.44 5.44 ...
##  $ area_se                : num  153.4 74.1 94 27.2 94.4 ...
##  $ smoothness_se          : num  0.0064 0.00522 0.00615 0.00911 0.01149 ...
##  $ compactness_se         : num  0.049 0.0131 0.0401 0.0746 0.0246 ...
##  $ concavity_se           : num  0.0537 0.0186 0.0383 0.0566 0.0569 ...
##  $ concave_points_se      : num  0.0159 0.0134 0.0206 0.0187 0.0188 ...
##  $ symmetry_se            : num  0.03 0.0139 0.0225 0.0596 0.0176 ...
##  $ fractal_dimension_se   : num  0.00619 0.00353 0.00457 0.00921 0.00511 ...
##  $ radius_worst           : num  25.4 25 23.6 14.9 22.5 ...
##  $ texture_worst          : num  17.3 23.4 25.5 26.5 16.7 ...
##  $ perimeter_worst        : num  184.6 158.8 152.5 98.9 152.2 ...
##  $ area_worst             : num  2019 1956 1709 568 1575 ...
##  $ smoothness_worst       : num  0.162 0.124 0.144 0.21 0.137 ...
##  $ compactness_worst      : num  0.666 0.187 0.424 0.866 0.205 ...
##  $ concavity_worst        : num  0.712 0.242 0.45 0.687 0.4 ...
##  $ concave_points_worst   : num  0.265 0.186 0.243 0.258 0.163 ...
##  $ symmetry_worst         : num  0.46 0.275 0.361 0.664 0.236 ...
##  $ fractal_dimension_worst: num  0.1189 0.089 0.0876 0.173 0.0768 ...

Camibar a factor

df1$diagnosis <- as.factor(df1$diagnosis)

Partir la base de datos

# Normalmente 80-20
set.seed(123)
renglones_entrenamiento <- createDataPartition(df1$diagnosis, p=0.8, list=FALSE)
entrenamiento <- df1[renglones_entrenamiento, ]
prueba <- df1[-renglones_entrenamiento, ]

Árbol de Decisión

modelo4 <- train(diagnosis ~ ., data=entrenamiento,
                  method = "rpart", #Cambiar
                  preProcess = c("scale", "center"),
                  trControl = trainControl(method="cv", number=10),
                  tuneLength = 10 #Cambiar
                  )

resultado_entrenamiento <- predict(modelo4, entrenamiento)
resultado_prueba <- predict(modelo4, prueba)

# Matriz de Confusión
# Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación

# Matriz de Confusión del Resultado del Entrenamiento
mcre4 <- confusionMatrix(resultado_entrenamiento, entrenamiento$diagnosis)
mcre4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   B   M
##          B 270   9
##          M  16 161
##                                           
##                Accuracy : 0.9452          
##                  95% CI : (0.9201, 0.9642)
##     No Information Rate : 0.6272          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.8837          
##                                           
##  Mcnemar's Test P-Value : 0.2301          
##                                           
##             Sensitivity : 0.9441          
##             Specificity : 0.9471          
##          Pos Pred Value : 0.9677          
##          Neg Pred Value : 0.9096          
##              Prevalence : 0.6272          
##          Detection Rate : 0.5921          
##    Detection Prevalence : 0.6118          
##       Balanced Accuracy : 0.9456          
##                                           
##        'Positive' Class : B               
## 
# Matriz de Confusión del Resultado de Prueba
mcrp4 <- confusionMatrix(resultado_prueba, prueba$diagnosis)
mcrp4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  B  M
##          B 62  4
##          M  9 38
##                                           
##                Accuracy : 0.885           
##                  95% CI : (0.8113, 0.9373)
##     No Information Rate : 0.6283          
##     P-Value [Acc > NIR] : 8.286e-10       
##                                           
##                   Kappa : 0.7595          
##                                           
##  Mcnemar's Test P-Value : 0.2673          
##                                           
##             Sensitivity : 0.8732          
##             Specificity : 0.9048          
##          Pos Pred Value : 0.9394          
##          Neg Pred Value : 0.8085          
##              Prevalence : 0.6283          
##          Detection Rate : 0.5487          
##    Detection Prevalence : 0.5841          
##       Balanced Accuracy : 0.8890          
##                                           
##        'Positive' Class : B               
## 

Redes Neuronales

modelo5 <- train(diagnosis ~ ., data=entrenamiento,
                  method = "nnet", #Cambiar
                  preProcess = c("scale", "center"),
                  trControl = trainControl(method="cv", number=10)
                 #Cambiar
                  )
## # weights:  33
## initial  value 275.998898 
## iter  10 value 30.521126
## iter  20 value 16.892187
## iter  30 value 7.487588
## iter  40 value 6.637537
## iter  50 value 6.564171
## iter  60 value 6.556942
## iter  70 value 6.555469
## iter  80 value 6.555228
## iter  90 value 6.555004
## iter 100 value 6.554973
## final  value 6.554973 
## stopped after 100 iterations
## # weights:  97
## initial  value 350.645783 
## iter  10 value 17.463538
## iter  20 value 3.623620
## iter  30 value 0.293011
## iter  40 value 0.071928
## iter  50 value 0.002108
## iter  60 value 0.000520
## final  value 0.000069 
## converged
## # weights:  161
## initial  value 253.010368 
## iter  10 value 13.528826
## iter  20 value 3.494878
## iter  30 value 0.033021
## iter  40 value 0.000612
## final  value 0.000068 
## converged
## # weights:  33
## initial  value 282.421480 
## iter  10 value 71.578133
## iter  20 value 38.905638
## iter  30 value 28.542089
## iter  40 value 27.255899
## iter  50 value 27.253389
## iter  50 value 27.253389
## iter  50 value 27.253389
## final  value 27.253389 
## converged
## # weights:  97
## initial  value 267.598163 
## iter  10 value 28.654290
## iter  20 value 23.912149
## iter  30 value 22.247739
## iter  40 value 21.088159
## iter  50 value 20.241773
## iter  60 value 20.171894
## final  value 20.168471 
## converged
## # weights:  161
## initial  value 396.125347 
## iter  10 value 78.050372
## iter  20 value 32.336759
## iter  30 value 20.144663
## iter  40 value 18.610968
## iter  50 value 18.117495
## iter  60 value 17.995837
## iter  70 value 17.902925
## iter  80 value 17.856227
## iter  90 value 17.849165
## iter 100 value 17.848931
## final  value 17.848931 
## stopped after 100 iterations
## # weights:  33
## initial  value 265.214791 
## iter  10 value 75.036465
## iter  20 value 70.385667
## iter  30 value 59.572163
## iter  40 value 59.526901
## iter  50 value 40.037154
## iter  60 value 39.625183
## iter  70 value 35.867633
## iter  80 value 27.512388
## iter  90 value 22.625657
## iter 100 value 22.600065
## final  value 22.600065 
## stopped after 100 iterations
## # weights:  97
## initial  value 292.151253 
## iter  10 value 21.995170
## iter  20 value 6.273787
## iter  30 value 0.291543
## iter  40 value 0.174070
## iter  50 value 0.165038
## iter  60 value 0.155689
## iter  70 value 0.149400
## iter  80 value 0.145892
## iter  90 value 0.142093
## iter 100 value 0.140820
## final  value 0.140820 
## stopped after 100 iterations
## # weights:  161
## initial  value 299.290636 
## iter  10 value 19.673884
## iter  20 value 3.974816
## iter  30 value 0.300306
## iter  40 value 0.245302
## iter  50 value 0.207972
## iter  60 value 0.177294
## iter  70 value 0.157909
## iter  80 value 0.146513
## iter  90 value 0.137165
## iter 100 value 0.129139
## final  value 0.129139 
## stopped after 100 iterations
## # weights:  33
## initial  value 273.424203 
## iter  10 value 71.913015
## iter  20 value 19.931429
## iter  30 value 9.562690
## iter  40 value 2.475503
## iter  50 value 0.003667
## final  value 0.000042 
## converged
## # weights:  97
## initial  value 276.767987 
## iter  10 value 29.196954
## iter  20 value 10.000372
## iter  30 value 0.396747
## iter  40 value 0.038944
## iter  50 value 0.012340
## iter  60 value 0.002336
## iter  70 value 0.000576
## iter  80 value 0.000441
## final  value 0.000100 
## converged
## # weights:  161
## initial  value 324.126721 
## iter  10 value 24.947745
## iter  20 value 9.057573
## iter  30 value 6.199734
## iter  40 value 5.551519
## iter  50 value 3.683237
## iter  60 value 1.405142
## iter  70 value 0.110780
## iter  80 value 0.036725
## iter  90 value 0.009446
## iter 100 value 0.003279
## final  value 0.003279 
## stopped after 100 iterations
## # weights:  33
## initial  value 318.358768 
## iter  10 value 55.169016
## iter  20 value 32.511700
## iter  30 value 29.579076
## iter  40 value 29.501747
## final  value 29.501670 
## converged
## # weights:  97
## initial  value 280.559061 
## iter  10 value 32.477772
## iter  20 value 27.598927
## iter  30 value 26.294211
## iter  40 value 25.013635
## iter  50 value 24.595297
## iter  60 value 24.588117
## final  value 24.587994 
## converged
## # weights:  161
## initial  value 300.907822 
## iter  10 value 32.085987
## iter  20 value 21.578340
## iter  30 value 20.675820
## iter  40 value 20.113104
## iter  50 value 19.712787
## iter  60 value 19.477257
## iter  70 value 19.461146
## iter  80 value 19.460753
## final  value 19.460743 
## converged
## # weights:  33
## initial  value 268.288269 
## iter  10 value 57.938360
## iter  20 value 31.562140
## iter  30 value 23.571004
## iter  40 value 20.829308
## iter  50 value 20.817344
## iter  60 value 20.810467
## iter  70 value 20.793502
## iter  80 value 20.789423
## iter  90 value 20.782604
## iter 100 value 20.757249
## final  value 20.757249 
## stopped after 100 iterations
## # weights:  97
## initial  value 231.889568 
## iter  10 value 30.428563
## iter  20 value 14.231688
## iter  30 value 6.852545
## iter  40 value 6.521815
## iter  50 value 6.289251
## iter  60 value 5.789203
## iter  70 value 4.285936
## iter  80 value 3.449510
## iter  90 value 3.040118
## iter 100 value 2.341541
## final  value 2.341541 
## stopped after 100 iterations
## # weights:  161
## initial  value 328.507146 
## iter  10 value 27.207700
## iter  20 value 3.670020
## iter  30 value 0.193572
## iter  40 value 0.157942
## iter  50 value 0.147963
## iter  60 value 0.137429
## iter  70 value 0.129155
## iter  80 value 0.123858
## iter  90 value 0.118795
## iter 100 value 0.116373
## final  value 0.116373 
## stopped after 100 iterations
## # weights:  33
## initial  value 339.071080 
## iter  10 value 27.122536
## iter  20 value 14.005994
## iter  30 value 12.052883
## iter  40 value 11.750208
## iter  50 value 11.726918
## iter  60 value 11.720505
## iter  70 value 11.720234
## iter  80 value 11.719849
## final  value 11.719808 
## converged
## # weights:  97
## initial  value 292.776086 
## iter  10 value 39.139277
## iter  20 value 17.619340
## iter  30 value 8.523359
## iter  40 value 3.551056
## iter  50 value 2.827679
## iter  60 value 2.780955
## iter  70 value 2.775676
## iter  80 value 2.774006
## iter  90 value 2.773095
## iter 100 value 2.772837
## final  value 2.772837 
## stopped after 100 iterations
## # weights:  161
## initial  value 337.662652 
## iter  10 value 35.513359
## iter  20 value 11.335189
## iter  30 value 3.493333
## iter  40 value 1.516191
## iter  50 value 0.773291
## iter  60 value 0.054379
## iter  70 value 0.019447
## iter  80 value 0.012219
## iter  90 value 0.008004
## iter 100 value 0.005025
## final  value 0.005025 
## stopped after 100 iterations
## # weights:  33
## initial  value 315.979714 
## iter  10 value 73.939356
## iter  20 value 43.040693
## iter  30 value 34.227521
## iter  40 value 30.573617
## iter  50 value 30.370540
## final  value 30.370206 
## converged
## # weights:  97
## initial  value 274.646392 
## iter  10 value 34.428514
## iter  20 value 27.211483
## iter  30 value 24.956093
## iter  40 value 23.259159
## iter  50 value 21.798003
## iter  60 value 21.209930
## iter  70 value 20.828151
## iter  80 value 20.711196
## iter  90 value 20.704998
## final  value 20.704913 
## converged
## # weights:  161
## initial  value 340.782584 
## iter  10 value 26.686498
## iter  20 value 20.617506
## iter  30 value 19.685721
## iter  40 value 19.507345
## iter  50 value 19.442964
## iter  60 value 19.397076
## iter  70 value 19.389178
## iter  80 value 19.388686
## final  value 19.388661 
## converged
## # weights:  33
## initial  value 254.766757 
## iter  10 value 33.102178
## iter  20 value 12.538301
## iter  30 value 11.947829
## iter  40 value 11.921068
## iter  50 value 11.913502
## iter  60 value 11.909733
## iter  70 value 11.907765
## iter  80 value 11.906945
## iter  90 value 11.905427
## iter 100 value 11.904227
## final  value 11.904227 
## stopped after 100 iterations
## # weights:  97
## initial  value 233.657278 
## iter  10 value 23.099420
## iter  20 value 12.348781
## iter  30 value 10.602912
## iter  40 value 9.609898
## iter  50 value 7.456064
## iter  60 value 7.003786
## iter  70 value 6.436754
## iter  80 value 5.655291
## iter  90 value 5.555793
## iter 100 value 5.290668
## final  value 5.290668 
## stopped after 100 iterations
## # weights:  161
## initial  value 344.514075 
## iter  10 value 15.950737
## iter  20 value 5.352738
## iter  30 value 0.455525
## iter  40 value 0.386224
## iter  50 value 0.288002
## iter  60 value 0.262541
## iter  70 value 0.248084
## iter  80 value 0.223502
## iter  90 value 0.194867
## iter 100 value 0.164612
## final  value 0.164612 
## stopped after 100 iterations
## # weights:  33
## initial  value 299.713185 
## iter  10 value 26.955999
## iter  20 value 7.305041
## iter  30 value 6.645907
## iter  40 value 6.562104
## iter  50 value 6.555079
## iter  60 value 6.554895
## iter  60 value 6.554895
## iter  60 value 6.554895
## final  value 6.554895 
## converged
## # weights:  97
## initial  value 276.442511 
## iter  10 value 24.550543
## iter  20 value 8.547076
## iter  30 value 3.762047
## iter  40 value 1.659066
## iter  50 value 0.309429
## iter  60 value 0.128948
## iter  70 value 0.028906
## iter  80 value 0.007296
## iter  90 value 0.001929
## iter 100 value 0.000884
## final  value 0.000884 
## stopped after 100 iterations
## # weights:  161
## initial  value 272.875552 
## iter  10 value 15.599733
## iter  20 value 1.279912
## iter  30 value 0.055386
## iter  40 value 0.006596
## final  value 0.000090 
## converged
## # weights:  33
## initial  value 345.395404 
## iter  10 value 54.233262
## iter  20 value 27.568786
## iter  30 value 25.686661
## iter  40 value 25.670102
## final  value 25.670101 
## converged
## # weights:  97
## initial  value 330.002861 
## iter  10 value 83.414542
## iter  20 value 30.409348
## iter  30 value 19.426493
## iter  40 value 18.815383
## iter  50 value 18.676712
## iter  60 value 18.664858
## iter  70 value 18.657390
## iter  80 value 18.656134
## final  value 18.656115 
## converged
## # weights:  161
## initial  value 317.259966 
## iter  10 value 29.968613
## iter  20 value 22.779502
## iter  30 value 22.064079
## iter  40 value 19.559240
## iter  50 value 18.510413
## iter  60 value 18.241281
## iter  70 value 18.200612
## iter  80 value 18.160864
## iter  90 value 18.154712
## iter 100 value 18.154596
## final  value 18.154596 
## stopped after 100 iterations
## # weights:  33
## initial  value 275.382395 
## iter  10 value 70.385496
## iter  20 value 16.561636
## iter  30 value 11.943838
## iter  40 value 11.859954
## iter  50 value 11.852018
## iter  60 value 11.848284
## iter  70 value 11.846383
## iter  80 value 11.845597
## iter  90 value 11.845141
## iter 100 value 11.844669
## final  value 11.844669 
## stopped after 100 iterations
## # weights:  97
## initial  value 266.234908 
## iter  10 value 49.449370
## iter  20 value 13.886371
## iter  30 value 7.269242
## iter  40 value 2.525727
## iter  50 value 0.557149
## iter  60 value 0.212094
## iter  70 value 0.203484
## iter  80 value 0.184928
## iter  90 value 0.172134
## iter 100 value 0.163563
## final  value 0.163563 
## stopped after 100 iterations
## # weights:  161
## initial  value 324.519289 
## iter  10 value 14.011223
## iter  20 value 0.800256
## iter  30 value 0.220010
## iter  40 value 0.199692
## iter  50 value 0.177107
## iter  60 value 0.166079
## iter  70 value 0.155302
## iter  80 value 0.145797
## iter  90 value 0.140874
## iter 100 value 0.134864
## final  value 0.134864 
## stopped after 100 iterations
## # weights:  33
## initial  value 279.531097 
## iter  10 value 32.598777
## iter  20 value 24.751501
## iter  30 value 24.748250
## iter  40 value 24.747616
## iter  50 value 24.747015
## iter  60 value 24.746824
## iter  70 value 24.746686
## iter  80 value 24.745058
## iter  90 value 24.741764
## iter 100 value 21.342032
## final  value 21.342032 
## stopped after 100 iterations
## # weights:  97
## initial  value 305.848181 
## iter  10 value 30.092908
## iter  20 value 11.656501
## iter  30 value 8.652024
## iter  40 value 7.485757
## iter  50 value 6.814372
## iter  60 value 6.613440
## iter  70 value 6.562661
## iter  80 value 6.537230
## iter  90 value 6.525032
## iter 100 value 6.518359
## final  value 6.518359 
## stopped after 100 iterations
## # weights:  161
## initial  value 261.736670 
## iter  10 value 18.893221
## iter  20 value 5.578271
## iter  30 value 1.370243
## iter  40 value 0.125045
## iter  50 value 0.024484
## iter  60 value 0.007507
## iter  70 value 0.001699
## iter  80 value 0.000494
## iter  90 value 0.000307
## iter 100 value 0.000220
## final  value 0.000220 
## stopped after 100 iterations
## # weights:  33
## initial  value 352.808520 
## iter  10 value 50.216889
## iter  20 value 34.654734
## iter  30 value 31.385112
## iter  40 value 30.792453
## iter  50 value 30.767568
## final  value 30.767524 
## converged
## # weights:  97
## initial  value 311.806361 
## iter  10 value 85.681177
## iter  20 value 38.990995
## iter  30 value 25.404647
## iter  40 value 23.382125
## iter  50 value 22.556339
## iter  60 value 22.460685
## iter  70 value 22.439611
## iter  80 value 22.437716
## final  value 22.437707 
## converged
## # weights:  161
## initial  value 311.991515 
## iter  10 value 30.484131
## iter  20 value 23.389867
## iter  30 value 22.232274
## iter  40 value 21.958182
## iter  50 value 21.747833
## iter  60 value 21.123427
## iter  70 value 20.440795
## iter  80 value 20.192537
## iter  90 value 20.086437
## iter 100 value 20.066358
## final  value 20.066358 
## stopped after 100 iterations
## # weights:  33
## initial  value 401.768982 
## iter  10 value 86.850594
## iter  20 value 31.966843
## iter  30 value 16.892349
## iter  40 value 16.567413
## iter  50 value 16.538869
## iter  60 value 16.530598
## iter  70 value 16.518473
## iter  80 value 16.508747
## iter  90 value 16.182818
## iter 100 value 12.058521
## final  value 12.058521 
## stopped after 100 iterations
## # weights:  97
## initial  value 295.389925 
## iter  10 value 21.253836
## iter  20 value 12.141020
## iter  30 value 9.532368
## iter  40 value 6.651336
## iter  50 value 5.098491
## iter  60 value 4.398941
## iter  70 value 2.219046
## iter  80 value 0.326932
## iter  90 value 0.286936
## iter 100 value 0.265529
## final  value 0.265529 
## stopped after 100 iterations
## # weights:  161
## initial  value 274.877265 
## iter  10 value 17.352541
## iter  20 value 3.932245
## iter  30 value 0.363593
## iter  40 value 0.272774
## iter  50 value 0.240694
## iter  60 value 0.217790
## iter  70 value 0.205552
## iter  80 value 0.189608
## iter  90 value 0.176682
## iter 100 value 0.170082
## final  value 0.170082 
## stopped after 100 iterations
## # weights:  33
## initial  value 306.284143 
## iter  10 value 40.429850
## iter  20 value 27.800141
## iter  30 value 21.270745
## iter  40 value 17.154577
## iter  50 value 16.416097
## iter  60 value 16.383392
## iter  70 value 16.376012
## iter  80 value 11.773602
## iter  90 value 11.728873
## iter 100 value 11.724902
## final  value 11.724902 
## stopped after 100 iterations
## # weights:  97
## initial  value 333.091236 
## iter  10 value 29.696859
## iter  20 value 11.861005
## iter  30 value 2.308943
## iter  40 value 0.023228
## iter  50 value 0.000168
## final  value 0.000043 
## converged
## # weights:  161
## initial  value 239.616021 
## iter  10 value 18.363280
## iter  20 value 2.023144
## iter  30 value 0.023553
## iter  40 value 0.000482
## final  value 0.000096 
## converged
## # weights:  33
## initial  value 267.069403 
## iter  10 value 35.968473
## iter  20 value 31.422739
## iter  30 value 30.552536
## final  value 30.551897 
## converged
## # weights:  97
## initial  value 275.770592 
## iter  10 value 56.285102
## iter  20 value 29.474405
## iter  30 value 22.325068
## iter  40 value 21.272026
## iter  50 value 21.240166
## iter  60 value 21.234137
## iter  70 value 21.233853
## final  value 21.233852 
## converged
## # weights:  161
## initial  value 293.883920 
## iter  10 value 38.474812
## iter  20 value 25.678462
## iter  30 value 23.377080
## iter  40 value 21.621527
## iter  50 value 20.878186
## iter  60 value 20.510278
## iter  70 value 20.292783
## iter  80 value 19.968118
## iter  90 value 19.951615
## iter 100 value 19.951385
## final  value 19.951385 
## stopped after 100 iterations
## # weights:  33
## initial  value 270.406880 
## iter  10 value 49.673028
## iter  20 value 27.166472
## iter  30 value 13.891087
## iter  40 value 11.981655
## iter  50 value 11.956489
## iter  60 value 11.949206
## iter  70 value 11.942937
## iter  80 value 11.933469
## iter  90 value 11.928619
## iter 100 value 11.919527
## final  value 11.919527 
## stopped after 100 iterations
## # weights:  97
## initial  value 274.941998 
## iter  10 value 25.422855
## iter  20 value 9.555207
## iter  30 value 7.046244
## iter  40 value 6.937305
## iter  50 value 6.913073
## iter  60 value 6.886534
## iter  70 value 6.858187
## iter  80 value 6.832657
## iter  90 value 6.798121
## iter 100 value 6.756018
## final  value 6.756018 
## stopped after 100 iterations
## # weights:  161
## initial  value 234.401883 
## iter  10 value 16.563723
## iter  20 value 6.312462
## iter  30 value 2.127394
## iter  40 value 1.652306
## iter  50 value 1.623655
## iter  60 value 1.017077
## iter  70 value 0.275940
## iter  80 value 0.240571
## iter  90 value 0.228396
## iter 100 value 0.217557
## final  value 0.217557 
## stopped after 100 iterations
## # weights:  33
## initial  value 255.564161 
## iter  10 value 49.870240
## iter  20 value 31.207801
## iter  30 value 30.404616
## iter  40 value 30.303067
## iter  50 value 30.274337
## iter  60 value 30.268574
## iter  70 value 30.266307
## iter  80 value 30.266066
## iter  90 value 30.265865
## final  value 30.265620 
## converged
## # weights:  97
## initial  value 320.609429 
## iter  10 value 23.573761
## iter  20 value 9.606715
## iter  30 value 4.007404
## iter  40 value 3.659845
## iter  50 value 3.456729
## iter  60 value 3.276671
## iter  70 value 3.104113
## iter  80 value 3.015136
## iter  90 value 2.837960
## iter 100 value 2.706411
## final  value 2.706411 
## stopped after 100 iterations
## # weights:  161
## initial  value 289.479148 
## iter  10 value 13.648745
## iter  20 value 1.412409
## iter  30 value 0.018902
## final  value 0.000079 
## converged
## # weights:  33
## initial  value 317.164259 
## iter  10 value 83.897696
## iter  20 value 41.115703
## iter  30 value 30.232407
## iter  40 value 28.517083
## iter  50 value 28.514651
## final  value 28.514651 
## converged
## # weights:  97
## initial  value 332.158156 
## iter  10 value 37.551382
## iter  20 value 24.066124
## iter  30 value 22.035076
## iter  40 value 21.825935
## iter  50 value 21.545050
## iter  60 value 21.432357
## final  value 21.429235 
## converged
## # weights:  161
## initial  value 259.004422 
## iter  10 value 27.220113
## iter  20 value 20.180953
## iter  30 value 18.782211
## iter  40 value 18.457754
## iter  50 value 18.355749
## iter  60 value 18.349731
## iter  70 value 18.349510
## final  value 18.349493 
## converged
## # weights:  33
## initial  value 331.903973 
## iter  10 value 31.321324
## iter  20 value 13.895070
## iter  30 value 10.692874
## iter  40 value 6.990163
## iter  50 value 6.729053
## iter  60 value 6.717970
## iter  70 value 6.714656
## iter  80 value 6.713498
## iter  90 value 6.712739
## iter 100 value 6.712337
## final  value 6.712337 
## stopped after 100 iterations
## # weights:  97
## initial  value 356.333796 
## iter  10 value 19.155088
## iter  20 value 6.279157
## iter  30 value 3.283195
## iter  40 value 2.633579
## iter  50 value 0.326405
## iter  60 value 0.252720
## iter  70 value 0.239266
## iter  80 value 0.216118
## iter  90 value 0.198284
## iter 100 value 0.182766
## final  value 0.182766 
## stopped after 100 iterations
## # weights:  161
## initial  value 289.313949 
## iter  10 value 12.646971
## iter  20 value 1.711733
## iter  30 value 0.215401
## iter  40 value 0.181912
## iter  50 value 0.165675
## iter  60 value 0.149676
## iter  70 value 0.139276
## iter  80 value 0.129727
## iter  90 value 0.123228
## iter 100 value 0.118980
## final  value 0.118980 
## stopped after 100 iterations
## # weights:  33
## initial  value 313.961005 
## iter  10 value 54.180007
## iter  20 value 25.372670
## iter  30 value 24.766051
## iter  40 value 24.749060
## iter  50 value 24.747184
## iter  60 value 24.746561
## final  value 24.746560 
## converged
## # weights:  97
## initial  value 222.322936 
## iter  10 value 27.783384
## iter  20 value 16.692179
## iter  30 value 12.905102
## iter  40 value 9.780729
## iter  50 value 7.886774
## iter  60 value 4.863727
## iter  70 value 3.264137
## iter  80 value 2.518601
## iter  90 value 0.106332
## iter 100 value 0.013462
## final  value 0.013462 
## stopped after 100 iterations
## # weights:  161
## initial  value 290.889365 
## iter  10 value 18.952602
## iter  20 value 2.821763
## iter  30 value 0.020677
## iter  40 value 0.000355
## final  value 0.000100 
## converged
## # weights:  33
## initial  value 267.820562 
## iter  10 value 69.211429
## iter  20 value 43.311671
## iter  30 value 31.600878
## iter  40 value 30.654529
## iter  50 value 30.650762
## final  value 30.650602 
## converged
## # weights:  97
## initial  value 402.016361 
## iter  10 value 63.391327
## iter  20 value 35.454523
## iter  30 value 27.186212
## iter  40 value 23.922872
## iter  50 value 22.700202
## iter  60 value 21.942905
## iter  70 value 21.462998
## iter  80 value 21.419118
## iter  90 value 21.416137
## iter 100 value 21.415774
## final  value 21.415774 
## stopped after 100 iterations
## # weights:  161
## initial  value 240.463544 
## iter  10 value 31.007047
## iter  20 value 25.592256
## iter  30 value 22.770520
## iter  40 value 22.175053
## iter  50 value 21.779054
## iter  60 value 21.050726
## iter  70 value 20.981204
## iter  80 value 20.979705
## final  value 20.979703 
## converged
## # weights:  33
## initial  value 306.087770 
## iter  10 value 58.912876
## iter  20 value 15.363925
## iter  30 value 8.169851
## iter  40 value 7.106389
## iter  50 value 6.876432
## iter  60 value 6.829904
## iter  70 value 6.810498
## iter  80 value 6.792301
## iter  90 value 6.779632
## iter 100 value 6.774269
## final  value 6.774269 
## stopped after 100 iterations
## # weights:  97
## initial  value 324.391897 
## iter  10 value 30.581290
## iter  20 value 11.190305
## iter  30 value 4.239997
## iter  40 value 3.133842
## iter  50 value 2.977079
## iter  60 value 2.294446
## iter  70 value 0.372910
## iter  80 value 0.283825
## iter  90 value 0.262377
## iter 100 value 0.245555
## final  value 0.245555 
## stopped after 100 iterations
## # weights:  161
## initial  value 290.629442 
## iter  10 value 18.689106
## iter  20 value 4.740596
## iter  30 value 0.337905
## iter  40 value 0.271989
## iter  50 value 0.249219
## iter  60 value 0.230903
## iter  70 value 0.215947
## iter  80 value 0.202488
## iter  90 value 0.191071
## iter 100 value 0.185257
## final  value 0.185257 
## stopped after 100 iterations
## # weights:  33
## initial  value 345.290687 
## iter  10 value 64.733095
## iter  20 value 36.604133
## iter  30 value 23.539459
## iter  40 value 22.658058
## iter  50 value 22.449445
## iter  60 value 18.471376
## iter  70 value 17.774629
## iter  80 value 17.753909
## iter  90 value 17.747127
## iter 100 value 17.746386
## final  value 17.746386 
## stopped after 100 iterations
## # weights:  97
## initial  value 302.879906 
## iter  10 value 38.244466
## iter  20 value 15.923646
## iter  30 value 6.115832
## iter  40 value 0.743754
## iter  50 value 0.043831
## iter  60 value 0.011471
## iter  70 value 0.003884
## iter  80 value 0.001904
## iter  90 value 0.000505
## final  value 0.000083 
## converged
## # weights:  161
## initial  value 250.829604 
## iter  10 value 22.050144
## iter  20 value 8.317096
## iter  30 value 7.402939
## iter  40 value 5.110249
## iter  50 value 4.616511
## iter  60 value 4.309188
## iter  70 value 3.757335
## iter  80 value 3.300289
## iter  90 value 2.969666
## iter 100 value 2.154628
## final  value 2.154628 
## stopped after 100 iterations
## # weights:  33
## initial  value 286.735821 
## iter  10 value 58.505131
## iter  20 value 43.838997
## iter  30 value 34.163825
## iter  40 value 30.868565
## iter  50 value 30.813108
## iter  60 value 30.805874
## final  value 30.805872 
## converged
## # weights:  97
## initial  value 261.394605 
## iter  10 value 30.307410
## iter  20 value 23.861932
## iter  30 value 22.759163
## iter  40 value 22.066185
## iter  50 value 21.740540
## iter  60 value 21.693415
## iter  70 value 21.693089
## iter  70 value 21.693089
## iter  70 value 21.693089
## final  value 21.693089 
## converged
## # weights:  161
## initial  value 296.955140 
## iter  10 value 40.023630
## iter  20 value 25.085221
## iter  30 value 21.144361
## iter  40 value 20.215675
## iter  50 value 20.083063
## iter  60 value 20.039797
## iter  70 value 20.038109
## iter  80 value 20.038095
## final  value 20.038094 
## converged
## # weights:  33
## initial  value 275.046057 
## iter  10 value 34.012004
## iter  20 value 26.113471
## iter  30 value 24.901886
## iter  40 value 23.755759
## iter  50 value 20.803958
## iter  60 value 20.796865
## iter  70 value 20.794190
## iter  80 value 20.790126
## iter  90 value 20.557105
## iter 100 value 17.499939
## final  value 17.499939 
## stopped after 100 iterations
## # weights:  97
## initial  value 449.443222 
## iter  10 value 33.243409
## iter  20 value 17.721296
## iter  30 value 14.187760
## iter  40 value 7.112640
## iter  50 value 6.585820
## iter  60 value 6.297382
## iter  70 value 4.909035
## iter  80 value 2.189756
## iter  90 value 0.529127
## iter 100 value 0.465349
## final  value 0.465349 
## stopped after 100 iterations
## # weights:  161
## initial  value 347.206065 
## iter  10 value 18.417863
## iter  20 value 1.968475
## iter  30 value 0.451406
## iter  40 value 0.373896
## iter  50 value 0.338801
## iter  60 value 0.323210
## iter  70 value 0.305303
## iter  80 value 0.288216
## iter  90 value 0.277223
## iter 100 value 0.271178
## final  value 0.271178 
## stopped after 100 iterations
## # weights:  33
## initial  value 309.205709 
## iter  10 value 45.259741
## iter  20 value 27.157080
## iter  30 value 26.709956
## iter  40 value 26.693846
## iter  50 value 22.417875
## iter  60 value 22.398332
## iter  70 value 22.392330
## iter  80 value 22.391678
## iter  90 value 22.388162
## iter 100 value 22.387508
## final  value 22.387508 
## stopped after 100 iterations
## # weights:  97
## initial  value 269.753537 
## iter  10 value 30.561985
## iter  20 value 7.228053
## iter  30 value 3.080570
## iter  40 value 2.222693
## iter  50 value 1.955277
## iter  60 value 1.670174
## iter  70 value 1.416601
## iter  80 value 1.405071
## iter  90 value 1.395248
## iter 100 value 1.391600
## final  value 1.391600 
## stopped after 100 iterations
## # weights:  161
## initial  value 293.746197 
## iter  10 value 23.969241
## iter  20 value 8.399806
## iter  30 value 2.360855
## iter  40 value 0.284828
## iter  50 value 0.051548
## iter  60 value 0.031353
## iter  70 value 0.018714
## iter  80 value 0.005227
## iter  90 value 0.001890
## iter 100 value 0.000268
## final  value 0.000268 
## stopped after 100 iterations
## # weights:  33
## initial  value 348.586681 
## iter  10 value 68.992488
## iter  20 value 35.200869
## iter  30 value 30.598553
## iter  40 value 29.407747
## final  value 29.405231 
## converged
## # weights:  97
## initial  value 298.950904 
## iter  10 value 59.409879
## iter  20 value 28.135119
## iter  30 value 23.305450
## iter  40 value 22.157933
## iter  50 value 21.993239
## iter  60 value 21.990932
## final  value 21.990932 
## converged
## # weights:  161
## initial  value 335.172797 
## iter  10 value 29.675088
## iter  20 value 23.212793
## iter  30 value 21.897507
## iter  40 value 20.670359
## iter  50 value 19.884396
## iter  60 value 19.816024
## iter  70 value 19.807582
## iter  80 value 19.807436
## final  value 19.807409 
## converged
## # weights:  33
## initial  value 270.283817 
## iter  10 value 64.196983
## iter  20 value 22.952917
## iter  30 value 22.559291
## iter  40 value 18.590801
## iter  50 value 17.954065
## iter  60 value 17.895843
## iter  70 value 17.883711
## iter  80 value 17.881650
## iter  90 value 17.880617
## iter 100 value 17.878469
## final  value 17.878469 
## stopped after 100 iterations
## # weights:  97
## initial  value 328.956304 
## iter  10 value 38.420942
## iter  20 value 17.345140
## iter  30 value 4.543695
## iter  40 value 2.323675
## iter  50 value 2.129782
## iter  60 value 2.105720
## iter  70 value 1.209083
## iter  80 value 0.271663
## iter  90 value 0.225799
## iter 100 value 0.209947
## final  value 0.209947 
## stopped after 100 iterations
## # weights:  161
## initial  value 221.687481 
## iter  10 value 18.628850
## iter  20 value 3.532138
## iter  30 value 0.449831
## iter  40 value 0.345715
## iter  50 value 0.261712
## iter  60 value 0.202783
## iter  70 value 0.178047
## iter  80 value 0.162314
## iter  90 value 0.150774
## iter 100 value 0.145657
## final  value 0.145657 
## stopped after 100 iterations
## # weights:  161
## initial  value 343.597544 
## iter  10 value 122.241273
## iter  20 value 38.490157
## iter  30 value 24.719215
## iter  40 value 22.050819
## iter  50 value 21.231478
## iter  60 value 20.873136
## iter  70 value 20.775119
## iter  80 value 20.749658
## iter  90 value 20.741289
## iter 100 value 20.739536
## final  value 20.739536 
## stopped after 100 iterations
resultado_entrenamiento5 <- predict(modelo5, entrenamiento)
resultado_prueba5 <- predict(modelo5, prueba)

# Matriz de Confusión
# Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación

# Matriz de Confusión del Resultado del Entrenamiento
mcre5 <- confusionMatrix(resultado_entrenamiento5, entrenamiento$diagnosis)
mcre5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   B   M
##          B 286   3
##          M   0 167
##                                           
##                Accuracy : 0.9934          
##                  95% CI : (0.9809, 0.9986)
##     No Information Rate : 0.6272          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9859          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9824          
##          Pos Pred Value : 0.9896          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6272          
##          Detection Rate : 0.6272          
##    Detection Prevalence : 0.6338          
##       Balanced Accuracy : 0.9912          
##                                           
##        'Positive' Class : B               
## 
# Matriz de Confusión del Resultado de Prueba
mcrp5 <- confusionMatrix(resultado_prueba5, prueba$diagnosis)
mcrp5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  B  M
##          B 69  1
##          M  2 41
##                                           
##                Accuracy : 0.9735          
##                  95% CI : (0.9244, 0.9945)
##     No Information Rate : 0.6283          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9434          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9718          
##             Specificity : 0.9762          
##          Pos Pred Value : 0.9857          
##          Neg Pred Value : 0.9535          
##              Prevalence : 0.6283          
##          Detection Rate : 0.6106          
##    Detection Prevalence : 0.6195          
##       Balanced Accuracy : 0.9740          
##                                           
##        'Positive' Class : B               
## 

Conclusión

Para el análisis de la base de datos sobre cáncer de mama, el modelo con mejor predicción en este caso es el de Redes Neuronales Artificiales.

LS0tDQp0aXRsZTogIlJlZGVzIE5ldXJvbmFsZXMiDQphdXRob3I6ICJEaWVnbyBHYXJjw61hIC0gQTAxMjg1Mjk0Ig0KZGF0ZTogIjIwMjUtMDgtMjUiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogInNwYWNlbGFiIg0KLS0tDQoNCiFbXShodHRwczovL3d3dy5jcy51cy5lcy9+ZnNhbmNoby9CbG9nL3Bvc3RzL01hdGVtYXRpY2FzX1JlZGVzX05ldXJvbmFsZXMvaW1nL0RMLmdpZikNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+IFRlb3LDrWEgPC9zcGFuPg0KVW5hICoqUmVkIE5ldXJvbmFsIEFydGlmaWNpYWwgKEFOTikqKiBtb2RlbGEgbGEgcmVsYWNpw7NuIGVudHJlIHVuIGNvbmp1bnRvIGRlIGVudHJhZGFzIHkgdW5hIHNhbGlkYSwgcmVzb2x2aWVuZG8gdW4gcHJvYmxlbWEgZGUgYXByZW5kaXphamUuDQoNCkVqZW1wbG9zIHByw6FjdGljb3MgZGUgYXBsaWNhY2nDs24gZGUgUmVkZXMgTmV1cm9uYWxlcyBzb246DQoNCiogTGEgcmVjb21lbmRhY2nDs24gZGUgY29udGVuaWRvIGRlIE5ldGZsaXgNCiogRWwgZmVlZCBkZSBJbnN0YWdyYW0gbyBUaWtUb2sNCiogRGV0ZXJtaW5hciBlbCBuw7ptZXJvIG8gbGV0cmEgZXNjcml0byBhIG1hbm8NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+IEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMgPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgaW5zdGFsbC5wYWNrYWdlcygibmV1cmFsbmV0IikNCmxpYnJhcnkobmV1cmFsbmV0KQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPiBBbGltZW50YXIgY29uIGVqZW1wbG9zIDwvc3Bhbj4NCmBgYHtyfQ0KZXhhbWVuIDwtIGMoMjAsMTAsMzAsMjAsODAsMzApDQpwcm95ZWN0byA8LSBjKDkwLDIwLDQwLDUwLDUwLDgwKQ0KZXN0YXR1cyA8LSBjKDEsMCwwLDAsMCwxKQ0KZGYgPC0gZGF0YS5mcmFtZShleGFtZW4scHJveWVjdG8sZXN0YXR1cykNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gR2VuZXJhciBsYSBSZWQgTmV1cm9uYWwgPC9zcGFuPg0KYGBge3J9DQpyZWRfbmV1cm9uYWwgPC0gbmV1cmFsbmV0KGVzdGF0dXN+LiwgZGF0YT1kZikNCnBsb3QocmVkX25ldXJvbmFsLCByZXA9ImJlc3QiKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPiBQcmVkZWNpciBjb24gbGEgUmVkIE5ldXJvbmFsIDwvc3Bhbj4NCmBgYHtyfQ0KcHJ1ZWJhX2V4YW1lbiA8LSBjKDMwLDQwLDg1KQ0KcHJ1ZWJhX3Byb3llY3RvIDwtIGMoODUsNTAsNDApDQpwcnVlYmEgPC0gZGF0YS5mcmFtZShwcnVlYmFfZXhhbWVuLCBwcnVlYmFfcHJveWVjdG8pDQpwcmVkaWNjaW9uIDwtIGNvbXB1dGUocmVkX25ldXJvbmFsLCBwcnVlYmEpDQpwcmVkaWNjaW9uJG5ldC5yZXN1bHQNCnByb2JhYmlsaWRhZCA8LSBwcmVkaWNjaW9uJG5ldC5yZXN1bHQNCnJlc3VsdGFkbyA8LSBpZmVsc2UocHJvYmFiaWxpZGFkPjAuNSwxLDApDQpyZXN1bHRhZG8NCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjp2aW9sZXQiPiBDYXNvIFByw6FjdGljbzogQ8OhbmNlciBkZSBNYW1hIDwvc3Bhbj4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6dmlvbGV0Ij4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcyA8L3NwYW4+DQpgYGB7cn0NCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICMgR3LDoWZpY2FzDQpsaWJyYXJ5KGdncGxvdDIpDQojIGluc3RhbGwucGFja2FnZXMoImxhdHRpY2UiKSAjIENyZWFyIGdyw6FmaWNvcw0KbGlicmFyeShsYXR0aWNlKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpICMgQWxnb3JpdG1vcyBkZSBhcHJlbmRpemFqZSBhdXRvbcOhdGljbw0KbGlicmFyeShjYXJldCkNCiMgaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKSAjIFVzYXIgYmFzZXMgZGUgZGF0b3MsIGVuIGVzdGUgY2FzbyBJcmlzDQpsaWJyYXJ5KGRhdGFzZXRzKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJEYXRhRXhwbG9yZXIiKSAjIEFuw6FsaXNpcyBleHBsb3JhdG9yaW8NCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOnZpb2xldCI+IExsYW1hciBsYSBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0KZGYxIDwtIHJlYWQuY3N2KCJDOlxcVXNlcnNcXGdhcmRpXFxEb3dubG9hZHNcXGNhbmNlcl9kZV9tYW1hLmNzdiIpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6dmlvbGV0Ij4gRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCnN1bW1hcnkoZGYxKQ0Kc3RyKGRmMSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjp2aW9sZXQiPiBDYW1pYmFyIGEgZmFjdG9yIDwvc3Bhbj4NCmBgYHtyfQ0KZGYxJGRpYWdub3NpcyA8LSBhcy5mYWN0b3IoZGYxJGRpYWdub3NpcykNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjp2aW9sZXQiPiBQYXJ0aXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCiMgTm9ybWFsbWVudGUgODAtMjANCnNldC5zZWVkKDEyMykNCnJlbmdsb25lc19lbnRyZW5hbWllbnRvIDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oZGYxJGRpYWdub3NpcywgcD0wLjgsIGxpc3Q9RkFMU0UpDQplbnRyZW5hbWllbnRvIDwtIGRmMVtyZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQ0KcHJ1ZWJhIDwtIGRmMVstcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjp2aW9sZXQiPiDDgXJib2wgZGUgRGVjaXNpw7NuIDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvNCA8LSB0cmFpbihkaWFnbm9zaXMgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgICBtZXRob2QgPSAicnBhcnQiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwgImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICAgdHVuZUxlbmd0aCA9IDEwICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvIDwtIHByZWRpY3QobW9kZWxvNCwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEgPC0gcHJlZGljdChtb2RlbG80LCBwcnVlYmEpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24NCiMgRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50bw0KbWNyZTQgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvLCBlbnRyZW5hbWllbnRvJGRpYWdub3NpcykNCm1jcmU0DQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgUHJ1ZWJhDQptY3JwNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYSwgcHJ1ZWJhJGRpYWdub3NpcykNCm1jcnA0DQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6dmlvbGV0Ij4gUmVkZXMgTmV1cm9uYWxlcyA8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbW9kZWxvNSA8LSB0cmFpbihkaWFnbm9zaXMgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgICBtZXRob2QgPSAibm5ldCIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCAiY2VudGVyIiksDQogICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCkNCiAgICAgICAgICAgICAgICAgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG81IDwtIHByZWRpY3QobW9kZWxvNSwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE1IDwtIHByZWRpY3QobW9kZWxvNSwgcHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuDQojIEVzIHVuYSB0YWJsYSBkZSBldmFsdWFjacOzbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjacOzbg0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8NCm1jcmU1IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzUsIGVudHJlbmFtaWVudG8kZGlhZ25vc2lzKQ0KbWNyZTUNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBQcnVlYmENCm1jcnA1IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNSwgcHJ1ZWJhJGRpYWdub3NpcykNCm1jcnA1DQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6dmlvbGV0Ij4gQ29uY2x1c2nDs248L3NwYW4+DQpQYXJhIGVsIGFuw6FsaXNpcyBkZSBsYSBiYXNlIGRlIGRhdG9zIHNvYnJlIGPDoW5jZXIgZGUgbWFtYSwgZWwgbW9kZWxvIGNvbiBtZWpvciBwcmVkaWNjacOzbiBlbiBlc3RlIGNhc28gZXMgZWwgZGUgUmVkZXMgTmV1cm9uYWxlcyBBcnRpZmljaWFsZXMuDQoNCg0KDQoNCg0KDQo=