Teoría

El paquete caret (Clasification And Regression Training) es un paquete integral con una amplia variedad de algoritmos para el aprendizaje automático.

Ejercicio 1. Modelo de Aprendizaje Automático

Paso 1. Instalar paquetes y llamar librerías

#install.packages("caret") #Algoritmos de aprendizaje
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
#install.packages("datasets") #Usar la base de datos "Iris"
library(datasets)
#install.packages("ggplot2") #Gráficas con mejor diseño
library(ggplot2)
#install.packages("lattice") #Crear gráficos
library(lattice)
#install.packages("DataExplorer") #Crear gráficos
library(DataExplorer)
#install.packages("mlbench") #Crear gráficos
library(mlbench)
#install.packages("tidyverse")
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ purrr::lift()   masks caret::lift()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Paso 2. Crear y limpiar base de datos

data("BreastCancer")
df<- BreastCancer
# Asignar el dataframe BreastCancer a una variable (en este caso, df)
df <- df %>% select(-Id)
df <- na.omit(df)
df <- data.frame(sapply(df, as.numeric))

summary(df)
##   Cl.thickness      Cell.size        Cell.shape     Marg.adhesion  
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.00  
##  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 1.000   1st Qu.: 1.00  
##  Median : 4.000   Median : 1.000   Median : 1.000   Median : 1.00  
##  Mean   : 4.442   Mean   : 3.151   Mean   : 3.215   Mean   : 2.83  
##  3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 5.000   3rd Qu.: 4.00  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.00  
##   Epith.c.size     Bare.nuclei      Bl.cromatin     Normal.nucleoli
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.00  
##  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 1.00  
##  Median : 2.000   Median : 1.000   Median : 3.000   Median : 1.00  
##  Mean   : 3.234   Mean   : 3.545   Mean   : 3.445   Mean   : 2.87  
##  3rd Qu.: 4.000   3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 4.00  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.00  
##     Mitoses          Class     
##  Min.   :1.000   Min.   :1.00  
##  1st Qu.:1.000   1st Qu.:1.00  
##  Median :1.000   Median :1.00  
##  Mean   :1.583   Mean   :1.35  
##  3rd Qu.:1.000   3rd Qu.:2.00  
##  Max.   :9.000   Max.   :2.00

Paso 3. Generar análisis exploratorio

summary(df)
##   Cl.thickness      Cell.size        Cell.shape     Marg.adhesion  
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.00  
##  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 1.000   1st Qu.: 1.00  
##  Median : 4.000   Median : 1.000   Median : 1.000   Median : 1.00  
##  Mean   : 4.442   Mean   : 3.151   Mean   : 3.215   Mean   : 2.83  
##  3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 5.000   3rd Qu.: 4.00  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.00  
##   Epith.c.size     Bare.nuclei      Bl.cromatin     Normal.nucleoli
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.00  
##  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 1.00  
##  Median : 2.000   Median : 1.000   Median : 3.000   Median : 1.00  
##  Mean   : 3.234   Mean   : 3.545   Mean   : 3.445   Mean   : 2.87  
##  3rd Qu.: 4.000   3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 4.00  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.00  
##     Mitoses          Class     
##  Min.   :1.000   Min.   :1.00  
##  1st Qu.:1.000   1st Qu.:1.00  
##  Median :1.000   Median :1.00  
##  Mean   :1.583   Mean   :1.35  
##  3rd Qu.:1.000   3rd Qu.:2.00  
##  Max.   :9.000   Max.   :2.00
str(df)
## 'data.frame':    683 obs. of  10 variables:
##  $ Cl.thickness   : num  5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : num  1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : num  1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : num  1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : num  2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : num  1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : num  3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: num  1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : num  1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : num  1 1 1 1 1 2 1 1 1 1 ...
boxplot(df)

#plot_missing(df)
plot_histogram(df)

plot_correlation(df)

#create_report(df)

Nota: La variable que queremos predecir debe tener formato de FACTOR

Paso 4. Partir los datos 80/20

class(df)  
## [1] "data.frame"
set.seed(123)
renglones_entrenamiento <- createDataPartition(df$Class, p=.8, list=FALSE)

entrenamiento <- df[renglones_entrenamiento, ]
prueba <- df[-renglones_entrenamiento, ]

entrenamiento$Class <- as.factor(entrenamiento$Class)
prueba$Class <- as.factor(prueba$Class)

Paso 5. Métodos para modelar

Los métodos más utilizados para modelar aprendizaje automático son:
* SVM. Support Vector Machine o Máquina de Vectores de Soporte. Hay varios subtipos: Lineal (svmLineal), Rdial (svmRadial), Polinómico (svmPoly), etc.
* Árbol de Decisión. rpart
* Redes Neuronales. nnet
* Random Forest o Bosques Aleatorios. rf

1. Modelo con el método svmLineal

#install.packages("kernlab")
library(caret)
modelo1 <- train(Class ~ ., data=entrenamiento, 
                method = "svmLinear", 
                preProcess = c("scale", "center"),
                trControl = trainControl(method="cv", number=10),
                tuneGrid = data.frame(C=1) #Cuando es svmLinear
                )

resultado_entrenamiento1 <- predict(modelo1, entrenamiento)
resultado_prueba1 <- predict(modelo1, prueba)

#Matriz de Consufión 
mcre1 <- confusionMatrix(resultado_entrenamiento1,entrenamiento$Class) #Matriz de confusion de resultado de entrenamiento
mcre1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2
##          1 347   7
##          2   8 185
##                                           
##                Accuracy : 0.9726          
##                  95% CI : (0.9552, 0.9846)
##     No Information Rate : 0.649           
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9399          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9775          
##             Specificity : 0.9635          
##          Pos Pred Value : 0.9802          
##          Neg Pred Value : 0.9585          
##              Prevalence : 0.6490          
##          Detection Rate : 0.6344          
##    Detection Prevalence : 0.6472          
##       Balanced Accuracy : 0.9705          
##                                           
##        'Positive' Class : 1               
## 
mcrp1 <- confusionMatrix(resultado_prueba1, prueba$Class)  #Matriz de confusion de resultado de prueba
mcrp1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2
##          1 86  1
##          2  3 46
##                                           
##                Accuracy : 0.9706          
##                  95% CI : (0.9264, 0.9919)
##     No Information Rate : 0.6544          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9356          
##                                           
##  Mcnemar's Test P-Value : 0.6171          
##                                           
##             Sensitivity : 0.9663          
##             Specificity : 0.9787          
##          Pos Pred Value : 0.9885          
##          Neg Pred Value : 0.9388          
##              Prevalence : 0.6544          
##          Detection Rate : 0.6324          
##    Detection Prevalence : 0.6397          
##       Balanced Accuracy : 0.9725          
##                                           
##        'Positive' Class : 1               
## 

2. Modelo con el método svmRadial

modelo2 <- train(Class ~ ., data=entrenamiento, 
                method = "svmRadial", 
                preProcess = c("scale", "center"),
                trControl = trainControl(method="cv", number=10),
                tuneGrid = data.frame(sigma=1,C=1) #Cambiar
                )

resultado_entrenamiento2 <- predict(modelo2, entrenamiento)
resultado_prueba2 <- predict(modelo2, prueba)

#Matriz de Consufión 
mcre2 <- confusionMatrix(resultado_entrenamiento2,entrenamiento$Class) #Matriz de confusion de resultado de entrenamiento
mcre2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2
##          1 354   0
##          2   1 192
##                                      
##                Accuracy : 0.9982     
##                  95% CI : (0.9899, 1)
##     No Information Rate : 0.649      
##     P-Value [Acc > NIR] : <2e-16     
##                                      
##                   Kappa : 0.996      
##                                      
##  Mcnemar's Test P-Value : 1          
##                                      
##             Sensitivity : 0.9972     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 0.9948     
##              Prevalence : 0.6490     
##          Detection Rate : 0.6472     
##    Detection Prevalence : 0.6472     
##       Balanced Accuracy : 0.9986     
##                                      
##        'Positive' Class : 1          
## 
mcrp2 <- confusionMatrix(resultado_prueba2, prueba$Class)  #Matriz de confusion de resultado de prueba
mcrp2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2
##          1 82  0
##          2  7 47
##                                           
##                Accuracy : 0.9485          
##                  95% CI : (0.8968, 0.9791)
##     No Information Rate : 0.6544          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.8901          
##                                           
##  Mcnemar's Test P-Value : 0.02334         
##                                           
##             Sensitivity : 0.9213          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.8704          
##              Prevalence : 0.6544          
##          Detection Rate : 0.6029          
##    Detection Prevalence : 0.6029          
##       Balanced Accuracy : 0.9607          
##                                           
##        'Positive' Class : 1               
## 

3. Modelo con el método svmPoly

modelo3 <- train(Class ~ ., data = entrenamiento,
                  method = "svmPoly",
                  preProcess = c("scale", "center"),
                  trControl = trainControl(method = "cv", number = 10),
                  tuneGrid = data.frame(degree = 1, scale = 1, C = 1))  # Adjust values as needed

resultado_entrenamiento3 <- predict(modelo3, entrenamiento)
resultado_prueba3 <- predict(modelo3, prueba)

#Matriz de Consufión 
mcre3 <- confusionMatrix(resultado_entrenamiento3,entrenamiento$Class) #Matriz de confusion de resultado de entrenamiento
mcre3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2
##          1 347   7
##          2   8 185
##                                           
##                Accuracy : 0.9726          
##                  95% CI : (0.9552, 0.9846)
##     No Information Rate : 0.649           
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9399          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9775          
##             Specificity : 0.9635          
##          Pos Pred Value : 0.9802          
##          Neg Pred Value : 0.9585          
##              Prevalence : 0.6490          
##          Detection Rate : 0.6344          
##    Detection Prevalence : 0.6472          
##       Balanced Accuracy : 0.9705          
##                                           
##        'Positive' Class : 1               
## 
mcrp3 <- confusionMatrix(resultado_prueba3, prueba$Class)  #Matriz de confusion de resultado de prueba
mcrp3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2
##          1 86  1
##          2  3 46
##                                           
##                Accuracy : 0.9706          
##                  95% CI : (0.9264, 0.9919)
##     No Information Rate : 0.6544          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9356          
##                                           
##  Mcnemar's Test P-Value : 0.6171          
##                                           
##             Sensitivity : 0.9663          
##             Specificity : 0.9787          
##          Pos Pred Value : 0.9885          
##          Neg Pred Value : 0.9388          
##              Prevalence : 0.6544          
##          Detection Rate : 0.6324          
##    Detection Prevalence : 0.6397          
##       Balanced Accuracy : 0.9725          
##                                           
##        'Positive' Class : 1               
## 

4. Modelo con el método rpart

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

resultado_entrenamiento4 <- predict(modelo4, entrenamiento)
resultado_prueba4 <- predict(modelo4, prueba)

#Matriz de Consufión 
mcre4 <- confusionMatrix(resultado_entrenamiento4,entrenamiento$Class) #Matriz de confusion de resultado de entrenamiento
mcre4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2
##          1 338   0
##          2  17 192
##                                           
##                Accuracy : 0.9689          
##                  95% CI : (0.9507, 0.9818)
##     No Information Rate : 0.649           
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9331          
##                                           
##  Mcnemar's Test P-Value : 0.0001042       
##                                           
##             Sensitivity : 0.9521          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.9187          
##              Prevalence : 0.6490          
##          Detection Rate : 0.6179          
##    Detection Prevalence : 0.6179          
##       Balanced Accuracy : 0.9761          
##                                           
##        'Positive' Class : 1               
## 
mcrp4 <- confusionMatrix(resultado_prueba4, prueba$Class)  #Matriz de confusion de resultado de prueba
mcrp4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2
##          1 83  0
##          2  6 47
##                                           
##                Accuracy : 0.9559          
##                  95% CI : (0.9064, 0.9836)
##     No Information Rate : 0.6544          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.9053          
##                                           
##  Mcnemar's Test P-Value : 0.04123         
##                                           
##             Sensitivity : 0.9326          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.8868          
##              Prevalence : 0.6544          
##          Detection Rate : 0.6103          
##    Detection Prevalence : 0.6103          
##       Balanced Accuracy : 0.9663          
##                                           
##        'Positive' Class : 1               
## 

5. Modelo con el metodo nnet

modelo5 <- train(Class ~ ., data=entrenamiento, 
                method = "nnet", 
                preProcess = c("scale", "center"),
                trControl = trainControl(method="cv", number=10)
                )
## # weights:  12
## initial  value 369.528009 
## iter  10 value 41.819970
## iter  20 value 39.433966
## iter  30 value 32.887215
## iter  40 value 32.799068
## iter  50 value 32.764193
## iter  60 value 32.755066
## iter  70 value 32.750204
## iter  80 value 32.747564
## iter  90 value 32.742868
## iter 100 value 32.740134
## final  value 32.740134 
## stopped after 100 iterations
## # weights:  34
## initial  value 294.668916 
## iter  10 value 30.055704
## iter  20 value 26.050427
## iter  30 value 19.457075
## iter  40 value 19.095042
## iter  50 value 19.090960
## final  value 19.090956 
## converged
## # weights:  56
## initial  value 342.277239 
## iter  10 value 24.720258
## iter  20 value 12.101687
## iter  30 value 9.041027
## iter  40 value 8.733649
## iter  50 value 8.592591
## iter  60 value 8.591593
## iter  70 value 8.591556
## iter  80 value 8.591499
## iter  90 value 8.591412
## iter 100 value 8.591368
## final  value 8.591368 
## stopped after 100 iterations
## # weights:  12
## initial  value 354.804601 
## iter  10 value 67.075547
## iter  20 value 44.691699
## iter  30 value 43.226554
## iter  40 value 43.163396
## final  value 43.163232 
## converged
## # weights:  34
## initial  value 330.844731 
## iter  10 value 61.358831
## iter  20 value 39.054280
## iter  30 value 36.278132
## iter  40 value 34.164218
## iter  50 value 33.901188
## iter  60 value 33.797582
## iter  70 value 33.786970
## iter  70 value 33.786970
## final  value 33.786970 
## converged
## # weights:  56
## initial  value 329.936184 
## iter  10 value 44.624095
## iter  20 value 36.172924
## iter  30 value 33.058378
## iter  40 value 32.462422
## iter  50 value 32.122565
## iter  60 value 31.946978
## iter  70 value 31.944346
## final  value 31.944340 
## converged
## # weights:  12
## initial  value 372.974996 
## iter  10 value 36.414256
## iter  20 value 33.837577
## iter  30 value 32.143484
## iter  40 value 30.279564
## iter  50 value 29.803641
## iter  60 value 29.741623
## iter  70 value 29.552948
## iter  80 value 29.530379
## iter  90 value 29.530302
## iter 100 value 29.529869
## final  value 29.529869 
## stopped after 100 iterations
## # weights:  34
## initial  value 291.074263 
## iter  10 value 31.192281
## iter  20 value 23.773599
## iter  30 value 19.405717
## iter  40 value 18.354602
## iter  50 value 17.179209
## iter  60 value 15.389018
## iter  70 value 12.792203
## iter  80 value 11.959741
## iter  90 value 11.584935
## iter 100 value 11.496790
## final  value 11.496790 
## stopped after 100 iterations
## # weights:  56
## initial  value 408.249966 
## iter  10 value 27.159978
## iter  20 value 15.704815
## iter  30 value 11.777367
## iter  40 value 11.241328
## iter  50 value 10.965649
## iter  60 value 10.576246
## iter  70 value 9.165488
## iter  80 value 6.954739
## iter  90 value 6.810054
## iter 100 value 6.709868
## final  value 6.709868 
## stopped after 100 iterations
## # weights:  12
## initial  value 393.824737 
## iter  10 value 49.395182
## iter  20 value 45.550806
## iter  30 value 45.517039
## iter  40 value 42.917800
## iter  50 value 39.510282
## iter  60 value 36.342265
## iter  70 value 36.321426
## iter  80 value 36.311902
## iter  90 value 36.309679
## iter 100 value 36.306146
## final  value 36.306146 
## stopped after 100 iterations
## # weights:  34
## initial  value 348.321763 
## iter  10 value 38.794295
## iter  20 value 26.286037
## iter  30 value 24.511966
## iter  40 value 23.812323
## iter  50 value 23.577728
## iter  60 value 23.311331
## iter  70 value 22.792928
## iter  80 value 22.621743
## iter  90 value 21.743386
## iter 100 value 21.704483
## final  value 21.704483 
## stopped after 100 iterations
## # weights:  56
## initial  value 378.043380 
## iter  10 value 38.869616
## iter  20 value 26.425979
## iter  30 value 24.397714
## iter  40 value 20.614828
## iter  50 value 14.759707
## iter  60 value 13.262644
## iter  70 value 11.614706
## iter  80 value 10.733897
## iter  90 value 9.718532
## iter 100 value 9.322398
## final  value 9.322398 
## stopped after 100 iterations
## # weights:  12
## initial  value 372.143389 
## iter  10 value 61.265734
## iter  20 value 47.484146
## iter  30 value 45.318841
## final  value 45.315739 
## converged
## # weights:  34
## initial  value 353.596953 
## iter  10 value 59.249687
## iter  20 value 37.156097
## iter  30 value 35.677434
## iter  40 value 33.931031
## iter  50 value 33.848048
## iter  60 value 33.828808
## final  value 33.828798 
## converged
## # weights:  56
## initial  value 393.883329 
## iter  10 value 37.594505
## iter  20 value 33.987094
## iter  30 value 33.314166
## iter  40 value 32.869876
## iter  50 value 32.591400
## iter  60 value 32.574621
## iter  70 value 32.572254
## iter  80 value 32.571875
## iter  90 value 32.571791
## iter 100 value 32.571551
## final  value 32.571551 
## stopped after 100 iterations
## # weights:  12
## initial  value 310.166321 
## iter  10 value 61.486355
## iter  20 value 48.753151
## iter  30 value 47.729536
## iter  40 value 46.627002
## iter  50 value 46.100506
## iter  60 value 46.075834
## iter  70 value 46.016354
## iter  80 value 46.014876
## iter  90 value 46.014772
## iter 100 value 46.014665
## final  value 46.014665 
## stopped after 100 iterations
## # weights:  34
## initial  value 386.953348 
## iter  10 value 38.523272
## iter  20 value 30.430677
## iter  30 value 28.161798
## iter  40 value 26.070472
## iter  50 value 24.090645
## iter  60 value 23.806977
## iter  70 value 23.638473
## iter  80 value 23.489186
## iter  90 value 23.306210
## iter 100 value 23.287900
## final  value 23.287900 
## stopped after 100 iterations
## # weights:  56
## initial  value 422.604028 
## iter  10 value 36.427840
## iter  20 value 20.138704
## iter  30 value 15.350478
## iter  40 value 14.019003
## iter  50 value 10.385515
## iter  60 value 9.978772
## iter  70 value 9.943863
## iter  80 value 9.907811
## iter  90 value 9.862090
## iter 100 value 9.829076
## final  value 9.829076 
## stopped after 100 iterations
## # weights:  12
## initial  value 410.896791 
## iter  10 value 91.075449
## iter  20 value 66.415312
## iter  30 value 58.182082
## iter  40 value 44.427391
## iter  50 value 39.135305
## iter  60 value 37.049764
## iter  70 value 36.496929
## iter  80 value 36.436878
## iter  90 value 35.987245
## iter 100 value 35.932504
## final  value 35.932504 
## stopped after 100 iterations
## # weights:  34
## initial  value 356.728418 
## iter  10 value 50.187736
## iter  20 value 43.613661
## iter  30 value 40.497995
## iter  40 value 38.861879
## iter  50 value 37.591193
## iter  60 value 36.414757
## iter  70 value 31.870857
## iter  80 value 27.771304
## iter  90 value 26.335968
## iter 100 value 26.071600
## final  value 26.071600 
## stopped after 100 iterations
## # weights:  56
## initial  value 300.765541 
## iter  10 value 38.694082
## iter  20 value 19.615132
## iter  30 value 10.438801
## iter  40 value 6.130038
## iter  50 value 5.047103
## iter  60 value 5.010580
## iter  70 value 5.004238
## iter  80 value 5.004025
## final  value 5.004024 
## converged
## # weights:  12
## initial  value 315.139418 
## iter  10 value 62.920550
## iter  20 value 49.774272
## iter  30 value 49.609764
## final  value 49.609752 
## converged
## # weights:  34
## initial  value 330.972037 
## iter  10 value 77.370411
## iter  20 value 51.158529
## iter  30 value 43.696200
## iter  40 value 40.344400
## iter  50 value 39.157190
## iter  60 value 38.498133
## iter  70 value 38.484126
## final  value 38.484122 
## converged
## # weights:  56
## initial  value 309.107112 
## iter  10 value 40.303629
## iter  20 value 37.828497
## iter  30 value 37.393351
## iter  40 value 37.067837
## iter  50 value 36.945768
## iter  60 value 36.934193
## final  value 36.934120 
## converged
## # weights:  12
## initial  value 380.298739 
## iter  10 value 77.589104
## iter  20 value 48.900443
## iter  30 value 43.660300
## iter  40 value 41.198243
## iter  50 value 39.970607
## iter  60 value 39.932757
## iter  70 value 39.918363
## iter  80 value 39.910610
## iter  90 value 39.905794
## iter 100 value 39.899607
## final  value 39.899607 
## stopped after 100 iterations
## # weights:  34
## initial  value 350.496078 
## iter  10 value 32.195786
## iter  20 value 23.678022
## iter  30 value 19.040790
## iter  40 value 18.944045
## iter  50 value 18.848037
## iter  60 value 18.636963
## iter  70 value 18.300233
## iter  80 value 18.144565
## iter  90 value 18.057101
## iter 100 value 17.994934
## final  value 17.994934 
## stopped after 100 iterations
## # weights:  56
## initial  value 321.330799 
## iter  10 value 31.472694
## iter  20 value 16.969868
## iter  30 value 8.878363
## iter  40 value 6.469743
## iter  50 value 6.229107
## iter  60 value 5.908416
## iter  70 value 5.807451
## iter  80 value 5.643872
## iter  90 value 5.326080
## iter 100 value 3.555650
## final  value 3.555650 
## stopped after 100 iterations
## # weights:  12
## initial  value 355.356497 
## iter  10 value 52.524845
## iter  20 value 45.907267
## iter  30 value 41.016510
## iter  40 value 40.563428
## iter  50 value 36.413786
## iter  60 value 35.181601
## iter  70 value 34.778378
## iter  80 value 34.579012
## iter  90 value 34.538333
## iter 100 value 34.449311
## final  value 34.449311 
## stopped after 100 iterations
## # weights:  34
## initial  value 377.107170 
## iter  10 value 33.292679
## iter  20 value 27.836480
## iter  30 value 23.941559
## iter  40 value 20.728814
## iter  50 value 19.680930
## iter  60 value 18.655866
## iter  70 value 17.976924
## iter  80 value 17.717182
## iter  90 value 17.683488
## iter 100 value 17.666402
## final  value 17.666402 
## stopped after 100 iterations
## # weights:  56
## initial  value 312.926494 
## iter  10 value 31.162308
## iter  20 value 15.690372
## iter  30 value 10.003080
## iter  40 value 6.719613
## iter  50 value 6.145456
## iter  60 value 6.090321
## iter  70 value 6.074871
## iter  80 value 6.069184
## iter  90 value 6.066960
## iter 100 value 6.066205
## final  value 6.066205 
## stopped after 100 iterations
## # weights:  12
## initial  value 475.770258 
## iter  10 value 70.927291
## iter  20 value 49.243630
## iter  30 value 48.733984
## iter  40 value 48.683221
## final  value 48.683220 
## converged
## # weights:  34
## initial  value 417.091448 
## iter  10 value 60.357968
## iter  20 value 43.504331
## iter  30 value 41.340080
## iter  40 value 39.360883
## iter  50 value 36.986296
## iter  60 value 36.485163
## iter  70 value 36.248848
## iter  80 value 36.247149
## final  value 36.247142 
## converged
## # weights:  56
## initial  value 432.410034 
## iter  10 value 42.477444
## iter  20 value 36.707169
## iter  30 value 35.694412
## iter  40 value 35.323019
## iter  50 value 35.125552
## iter  60 value 34.931194
## iter  70 value 34.906543
## iter  80 value 34.859237
## iter  90 value 34.825244
## final  value 34.825220 
## converged
## # weights:  12
## initial  value 483.185808 
## iter  10 value 44.274835
## iter  20 value 42.938796
## iter  30 value 42.538232
## iter  40 value 39.836819
## iter  50 value 39.834227
## iter  60 value 39.834130
## iter  70 value 39.834039
## iter  80 value 39.833989
## iter  90 value 39.833962
## final  value 39.833956 
## converged
## # weights:  34
## initial  value 350.502515 
## iter  10 value 32.927155
## iter  20 value 22.730048
## iter  30 value 17.206123
## iter  40 value 16.375815
## iter  50 value 16.262999
## iter  60 value 16.232913
## iter  70 value 16.208273
## iter  80 value 16.191870
## iter  90 value 16.175187
## iter 100 value 16.153326
## final  value 16.153326 
## stopped after 100 iterations
## # weights:  56
## initial  value 356.799299 
## iter  10 value 36.449025
## iter  20 value 18.887833
## iter  30 value 9.589752
## iter  40 value 4.716782
## iter  50 value 1.675048
## iter  60 value 0.698145
## iter  70 value 0.547533
## iter  80 value 0.502501
## iter  90 value 0.477363
## iter 100 value 0.453583
## final  value 0.453583 
## stopped after 100 iterations
## # weights:  12
## initial  value 344.136501 
## iter  10 value 52.780605
## iter  20 value 48.286081
## iter  30 value 45.631249
## iter  40 value 45.489322
## iter  50 value 45.484234
## iter  60 value 45.482398
## iter  70 value 45.479438
## iter  80 value 45.476549
## iter  90 value 45.475508
## iter 100 value 45.474052
## final  value 45.474052 
## stopped after 100 iterations
## # weights:  34
## initial  value 292.720313 
## iter  10 value 32.409860
## iter  20 value 31.276204
## iter  30 value 30.495487
## iter  40 value 29.334598
## iter  50 value 27.727389
## iter  60 value 27.115621
## iter  70 value 26.413413
## iter  80 value 25.981984
## iter  90 value 25.739081
## iter 100 value 25.607393
## final  value 25.607393 
## stopped after 100 iterations
## # weights:  56
## initial  value 359.984588 
## iter  10 value 37.144803
## iter  20 value 27.112851
## iter  30 value 20.017997
## iter  40 value 17.836122
## iter  50 value 15.875999
## iter  60 value 13.444093
## iter  70 value 13.144410
## iter  80 value 12.606599
## iter  90 value 12.040247
## iter 100 value 11.935470
## final  value 11.935470 
## stopped after 100 iterations
## # weights:  12
## initial  value 307.654011 
## iter  10 value 58.525836
## iter  20 value 48.342080
## iter  30 value 47.584723
## iter  40 value 47.574569
## iter  40 value 47.574569
## iter  40 value 47.574569
## final  value 47.574569 
## converged
## # weights:  34
## initial  value 372.674142 
## iter  10 value 41.390035
## iter  20 value 38.676063
## iter  30 value 37.172050
## iter  40 value 36.638221
## iter  50 value 36.574445
## final  value 36.574319 
## converged
## # weights:  56
## initial  value 382.472849 
## iter  10 value 72.420446
## iter  20 value 39.333417
## iter  30 value 36.185961
## iter  40 value 35.352723
## iter  50 value 35.216532
## iter  60 value 35.096788
## iter  70 value 35.082873
## iter  80 value 35.082814
## final  value 35.082772 
## converged
## # weights:  12
## initial  value 330.122863 
## iter  10 value 40.912739
## iter  20 value 38.506078
## iter  30 value 38.256446
## iter  40 value 34.105829
## iter  50 value 33.637980
## iter  60 value 33.445976
## iter  70 value 33.406364
## iter  80 value 33.397812
## iter  90 value 33.392176
## iter 100 value 33.379453
## final  value 33.379453 
## stopped after 100 iterations
## # weights:  34
## initial  value 335.690660 
## iter  10 value 36.381480
## iter  20 value 28.982668
## iter  30 value 23.805843
## iter  40 value 21.487236
## iter  50 value 20.241339
## iter  60 value 19.681873
## iter  70 value 19.626557
## iter  80 value 19.565181
## iter  90 value 19.558486
## iter 100 value 19.553292
## final  value 19.553292 
## stopped after 100 iterations
## # weights:  56
## initial  value 341.588756 
## iter  10 value 28.786236
## iter  20 value 18.168040
## iter  30 value 9.846261
## iter  40 value 5.032360
## iter  50 value 4.441379
## iter  60 value 2.679413
## iter  70 value 2.544886
## iter  80 value 2.498162
## iter  90 value 2.459608
## iter 100 value 2.437057
## final  value 2.437057 
## stopped after 100 iterations
## # weights:  12
## initial  value 359.954945 
## iter  10 value 47.835385
## iter  20 value 44.277785
## iter  30 value 41.309066
## iter  40 value 39.558618
## iter  50 value 39.472439
## final  value 39.472349 
## converged
## # weights:  34
## initial  value 341.030572 
## iter  10 value 46.703305
## iter  20 value 29.601659
## iter  30 value 26.940764
## iter  40 value 26.599190
## iter  50 value 21.519716
## iter  60 value 21.430501
## iter  70 value 21.409034
## iter  80 value 21.377963
## iter  90 value 21.361474
## iter 100 value 21.336973
## final  value 21.336973 
## stopped after 100 iterations
## # weights:  56
## initial  value 324.843402 
## iter  10 value 31.362872
## iter  20 value 20.374454
## iter  30 value 4.481585
## iter  40 value 3.743240
## iter  50 value 3.740621
## iter  60 value 3.740351
## iter  70 value 3.739010
## iter  80 value 3.674222
## final  value 3.673951 
## converged
## # weights:  12
## initial  value 413.529404 
## iter  10 value 72.810188
## iter  20 value 52.198007
## iter  30 value 50.592124
## iter  40 value 50.578712
## iter  40 value 50.578712
## iter  40 value 50.578712
## final  value 50.578712 
## converged
## # weights:  34
## initial  value 315.080576 
## iter  10 value 58.974724
## iter  20 value 40.539509
## iter  30 value 38.617470
## iter  40 value 38.222216
## iter  50 value 37.969486
## iter  60 value 37.961685
## iter  60 value 37.961685
## iter  60 value 37.961685
## final  value 37.961685 
## converged
## # weights:  56
## initial  value 326.549524 
## iter  10 value 61.234769
## iter  20 value 42.700873
## iter  30 value 38.423703
## iter  40 value 37.452549
## iter  50 value 37.294977
## iter  60 value 36.566381
## iter  70 value 36.213830
## iter  80 value 36.172025
## iter  90 value 36.167624
## final  value 36.167622 
## converged
## # weights:  12
## initial  value 356.965518 
## iter  10 value 51.688104
## iter  20 value 47.138198
## iter  30 value 43.722287
## iter  40 value 40.288868
## iter  50 value 39.791785
## iter  60 value 39.755746
## iter  70 value 39.747962
## iter  80 value 39.731725
## iter  90 value 39.727952
## iter 100 value 39.724732
## final  value 39.724732 
## stopped after 100 iterations
## # weights:  34
## initial  value 374.323124 
## iter  10 value 37.355608
## iter  20 value 32.072326
## iter  30 value 22.632809
## iter  40 value 20.233293
## iter  50 value 19.705316
## iter  60 value 17.013251
## iter  70 value 16.729733
## iter  80 value 16.460649
## iter  90 value 16.312008
## iter 100 value 16.171573
## final  value 16.171573 
## stopped after 100 iterations
## # weights:  56
## initial  value 311.235313 
## iter  10 value 30.155543
## iter  20 value 9.554859
## iter  30 value 5.811890
## iter  40 value 5.362715
## iter  50 value 5.107756
## iter  60 value 4.865939
## iter  70 value 4.798686
## iter  80 value 4.695730
## iter  90 value 4.616456
## iter 100 value 4.547477
## final  value 4.547477 
## stopped after 100 iterations
## # weights:  12
## initial  value 343.614277 
## iter  10 value 53.299168
## iter  20 value 32.509574
## iter  30 value 26.449451
## iter  40 value 26.307341
## iter  50 value 26.013269
## iter  60 value 25.846284
## iter  70 value 25.845141
## final  value 25.845135 
## converged
## # weights:  34
## initial  value 316.873328 
## iter  10 value 29.726297
## iter  20 value 20.532428
## iter  30 value 11.459159
## iter  40 value 7.101294
## iter  50 value 4.720538
## iter  60 value 3.464813
## iter  70 value 3.106115
## iter  80 value 3.064230
## iter  90 value 3.043057
## iter 100 value 3.042539
## final  value 3.042539 
## stopped after 100 iterations
## # weights:  56
## initial  value 316.600953 
## iter  10 value 28.737512
## iter  20 value 11.229893
## iter  30 value 6.075681
## iter  40 value 5.709626
## iter  50 value 5.605253
## iter  60 value 5.476611
## iter  70 value 5.282768
## iter  80 value 5.180506
## iter  90 value 5.132434
## iter 100 value 5.066015
## final  value 5.066015 
## stopped after 100 iterations
## # weights:  12
## initial  value 323.491815 
## iter  10 value 55.628329
## iter  20 value 43.165785
## iter  30 value 41.213636
## final  value 41.212262 
## converged
## # weights:  34
## initial  value 367.131860 
## iter  10 value 66.620816
## iter  20 value 35.450385
## iter  30 value 32.857447
## iter  40 value 32.691141
## iter  50 value 32.651666
## iter  60 value 32.651235
## final  value 32.651233 
## converged
## # weights:  56
## initial  value 314.947373 
## iter  10 value 77.106433
## iter  20 value 35.463501
## iter  30 value 30.716166
## iter  40 value 30.183467
## iter  50 value 29.617730
## iter  60 value 29.305492
## iter  70 value 29.299751
## final  value 29.299670 
## converged
## # weights:  12
## initial  value 344.480465 
## iter  10 value 83.740434
## iter  20 value 34.357641
## iter  30 value 26.885069
## iter  40 value 25.071417
## iter  50 value 23.328862
## iter  60 value 23.316932
## iter  70 value 23.312852
## iter  80 value 23.305286
## iter  90 value 23.303388
## iter 100 value 23.302829
## final  value 23.302829 
## stopped after 100 iterations
## # weights:  34
## initial  value 354.145565 
## iter  10 value 29.889402
## iter  20 value 21.587445
## iter  30 value 20.057871
## iter  40 value 19.012599
## iter  50 value 18.633272
## iter  60 value 17.540103
## iter  70 value 16.956364
## iter  80 value 16.717756
## iter  90 value 16.509332
## iter 100 value 16.086733
## final  value 16.086733 
## stopped after 100 iterations
## # weights:  56
## initial  value 555.324625 
## iter  10 value 26.135842
## iter  20 value 14.075957
## iter  30 value 7.154809
## iter  40 value 5.770379
## iter  50 value 5.526264
## iter  60 value 5.221688
## iter  70 value 4.926856
## iter  80 value 4.789912
## iter  90 value 4.639032
## iter 100 value 4.342006
## final  value 4.342006 
## stopped after 100 iterations
## # weights:  12
## initial  value 322.850273 
## iter  10 value 43.063804
## iter  20 value 39.941578
## iter  30 value 39.858368
## iter  40 value 39.474417
## iter  50 value 39.469062
## final  value 39.469056 
## converged
## # weights:  34
## initial  value 332.260925 
## iter  10 value 41.414748
## iter  20 value 30.230336
## iter  30 value 28.199957
## iter  40 value 26.509024
## iter  50 value 25.105297
## iter  60 value 24.058602
## iter  70 value 23.367914
## iter  80 value 23.155447
## iter  90 value 22.782940
## iter 100 value 22.722687
## final  value 22.722687 
## stopped after 100 iterations
## # weights:  56
## initial  value 323.193537 
## iter  10 value 31.245415
## iter  20 value 17.265422
## iter  30 value 6.269596
## iter  40 value 5.594091
## iter  50 value 5.468771
## iter  60 value 5.428449
## iter  70 value 5.424956
## iter  80 value 5.424893
## iter  90 value 5.424885
## iter  90 value 5.424885
## iter  90 value 5.424885
## final  value 5.424885 
## converged
## # weights:  12
## initial  value 395.125121 
## iter  10 value 92.698049
## iter  20 value 50.742225
## iter  30 value 49.074882
## iter  40 value 48.951537
## final  value 48.951517 
## converged
## # weights:  34
## initial  value 338.900221 
## iter  10 value 111.422120
## iter  20 value 43.396065
## iter  30 value 37.975350
## iter  40 value 37.206679
## iter  50 value 36.568418
## iter  60 value 36.391689
## iter  70 value 36.380616
## final  value 36.380609 
## converged
## # weights:  56
## initial  value 374.263961 
## iter  10 value 41.580653
## iter  20 value 36.605013
## iter  30 value 35.750170
## iter  40 value 34.693029
## iter  50 value 34.142092
## iter  60 value 34.126771
## iter  70 value 34.125163
## iter  80 value 34.124630
## final  value 34.124630 
## converged
## # weights:  12
## initial  value 334.114972 
## iter  10 value 54.877785
## iter  20 value 46.809506
## iter  30 value 42.894717
## iter  40 value 39.722044
## iter  50 value 39.639217
## iter  60 value 39.627470
## iter  70 value 39.625332
## iter  80 value 39.623099
## iter  90 value 39.618324
## iter 100 value 39.617493
## final  value 39.617493 
## stopped after 100 iterations
## # weights:  34
## initial  value 309.920641 
## iter  10 value 33.371633
## iter  20 value 23.194254
## iter  30 value 14.331682
## iter  40 value 13.337363
## iter  50 value 12.880946
## iter  60 value 12.436954
## iter  70 value 12.081840
## iter  80 value 11.899487
## iter  90 value 11.683769
## iter 100 value 11.654989
## final  value 11.654989 
## stopped after 100 iterations
## # weights:  56
## initial  value 425.302509 
## iter  10 value 29.941186
## iter  20 value 10.986143
## iter  30 value 6.310928
## iter  40 value 6.176340
## iter  50 value 4.950996
## iter  60 value 3.172406
## iter  70 value 2.819869
## iter  80 value 2.671431
## iter  90 value 2.611110
## iter 100 value 2.526765
## final  value 2.526765 
## stopped after 100 iterations
## # weights:  12
## initial  value 354.023869 
## iter  10 value 39.283516
## iter  20 value 35.770340
## iter  30 value 34.373859
## iter  40 value 33.848125
## iter  50 value 33.157726
## iter  60 value 33.117666
## iter  70 value 33.024354
## iter  80 value 32.955375
## iter  90 value 32.954441
## iter 100 value 32.913144
## final  value 32.913144 
## stopped after 100 iterations
## # weights:  34
## initial  value 397.673134 
## iter  10 value 38.784999
## iter  20 value 28.359039
## iter  30 value 22.141237
## iter  40 value 21.063550
## iter  50 value 20.740871
## iter  60 value 20.384461
## iter  70 value 20.089028
## iter  80 value 19.927941
## iter  90 value 19.769947
## iter 100 value 19.499301
## final  value 19.499301 
## stopped after 100 iterations
## # weights:  56
## initial  value 313.374671 
## iter  10 value 32.083672
## iter  20 value 23.708195
## iter  30 value 21.112298
## iter  40 value 20.248257
## iter  50 value 18.632902
## iter  60 value 18.339068
## iter  70 value 18.152288
## iter  80 value 17.997704
## iter  90 value 17.848595
## iter 100 value 17.685149
## final  value 17.685149 
## stopped after 100 iterations
## # weights:  12
## initial  value 337.077746 
## iter  10 value 63.281287
## iter  20 value 54.863565
## iter  30 value 48.413095
## iter  40 value 47.845264
## final  value 47.790421 
## converged
## # weights:  34
## initial  value 366.353690 
## iter  10 value 64.794440
## iter  20 value 44.957517
## iter  30 value 40.769897
## iter  40 value 36.650964
## iter  50 value 34.748855
## iter  60 value 34.555152
## iter  70 value 34.517861
## iter  80 value 34.516252
## iter  90 value 34.513131
## final  value 34.513084 
## converged
## # weights:  56
## initial  value 294.712202 
## iter  10 value 46.347189
## iter  20 value 37.957016
## iter  30 value 35.220965
## iter  40 value 34.703193
## iter  50 value 34.298810
## iter  60 value 34.275328
## iter  70 value 34.273655
## final  value 34.273646 
## converged
## # weights:  12
## initial  value 379.362140 
## iter  10 value 57.455067
## iter  20 value 52.911394
## iter  30 value 52.761506
## iter  40 value 52.754954
## iter  50 value 52.737421
## iter  60 value 52.735613
## iter  70 value 52.734265
## iter  80 value 52.731898
## iter  90 value 52.731129
## iter 100 value 52.730710
## final  value 52.730710 
## stopped after 100 iterations
## # weights:  34
## initial  value 342.250550 
## iter  10 value 35.180483
## iter  20 value 29.693837
## iter  30 value 24.370972
## iter  40 value 20.872998
## iter  50 value 20.581446
## iter  60 value 20.540750
## iter  70 value 20.519548
## iter  80 value 20.511201
## iter  90 value 20.503910
## iter 100 value 20.498901
## final  value 20.498901 
## stopped after 100 iterations
## # weights:  56
## initial  value 450.573408 
## iter  10 value 34.037837
## iter  20 value 17.860088
## iter  30 value 12.759443
## iter  40 value 9.255811
## iter  50 value 8.870258
## iter  60 value 8.395126
## iter  70 value 7.791529
## iter  80 value 7.294425
## iter  90 value 6.575039
## iter 100 value 6.222544
## final  value 6.222544 
## stopped after 100 iterations
## # weights:  12
## initial  value 307.017398 
## iter  10 value 34.914184
## iter  20 value 31.813467
## iter  30 value 31.292020
## iter  40 value 30.298390
## iter  50 value 28.798551
## iter  60 value 28.553735
## iter  70 value 28.395953
## iter  80 value 28.390058
## iter  90 value 28.287602
## iter 100 value 28.285959
## final  value 28.285959 
## stopped after 100 iterations
## # weights:  34
## initial  value 395.706784 
## iter  10 value 38.119674
## iter  20 value 27.756374
## iter  30 value 21.821249
## iter  40 value 21.664364
## iter  50 value 21.609400
## iter  60 value 21.512754
## iter  70 value 21.407259
## iter  80 value 21.325151
## iter  90 value 21.282174
## iter 100 value 21.164080
## final  value 21.164080 
## stopped after 100 iterations
## # weights:  56
## initial  value 339.263717 
## iter  10 value 21.401622
## iter  20 value 10.241894
## iter  30 value 4.448594
## iter  40 value 2.561257
## iter  50 value 2.294347
## iter  60 value 2.264403
## iter  70 value 2.254425
## iter  80 value 2.251592
## iter  90 value 2.249424
## iter 100 value 2.249138
## final  value 2.249138 
## stopped after 100 iterations
## # weights:  12
## initial  value 360.518253 
## iter  10 value 65.507009
## iter  20 value 45.812107
## iter  30 value 42.672270
## iter  40 value 41.952116
## final  value 41.951920 
## converged
## # weights:  34
## initial  value 431.808831 
## iter  10 value 54.638091
## iter  20 value 35.458633
## iter  30 value 33.578262
## iter  40 value 33.079096
## iter  50 value 33.055063
## final  value 33.055026 
## converged
## # weights:  56
## initial  value 270.295335 
## iter  10 value 46.265356
## iter  20 value 34.582750
## iter  30 value 32.251874
## iter  40 value 31.562441
## iter  50 value 31.483987
## iter  60 value 31.454296
## iter  70 value 31.419194
## final  value 31.418875 
## converged
## # weights:  12
## initial  value 381.216543 
## iter  10 value 40.427486
## iter  20 value 32.682573
## iter  30 value 29.881991
## iter  40 value 28.051135
## iter  50 value 26.999489
## iter  60 value 26.969361
## iter  70 value 26.963407
## iter  80 value 26.962656
## iter  90 value 26.960979
## iter 100 value 26.960518
## final  value 26.960518 
## stopped after 100 iterations
## # weights:  34
## initial  value 327.104152 
## iter  10 value 44.786711
## iter  20 value 44.081802
## iter  30 value 43.104457
## iter  40 value 41.899283
## iter  50 value 33.995060
## iter  60 value 29.951902
## iter  70 value 28.199882
## iter  80 value 27.398332
## iter  90 value 27.277569
## iter 100 value 27.177694
## final  value 27.177694 
## stopped after 100 iterations
## # weights:  56
## initial  value 253.505969 
## iter  10 value 34.865541
## iter  20 value 24.171863
## iter  30 value 14.604240
## iter  40 value 9.551494
## iter  50 value 3.351279
## iter  60 value 0.541836
## iter  70 value 0.442962
## iter  80 value 0.426645
## iter  90 value 0.396665
## iter 100 value 0.375886
## final  value 0.375886 
## stopped after 100 iterations
## # weights:  34
## initial  value 506.788021 
## iter  10 value 52.239847
## iter  20 value 41.095093
## iter  30 value 40.489771
## iter  40 value 40.269751
## iter  50 value 40.209301
## iter  60 value 40.105537
## final  value 40.105025 
## converged
resultado_entrenamiento5 <- predict(modelo5, entrenamiento)
resultado_prueba5 <- predict(modelo5, prueba)

#Matriz de Consufión 
mcre5 <- confusionMatrix(resultado_entrenamiento5,entrenamiento$Class) #Matriz de confusion de resultado de entrenamiento
mcre5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2
##          1 348   5
##          2   7 187
##                                          
##                Accuracy : 0.9781         
##                  95% CI : (0.962, 0.9886)
##     No Information Rate : 0.649          
##     P-Value [Acc > NIR] : <2e-16         
##                                          
##                   Kappa : 0.952          
##                                          
##  Mcnemar's Test P-Value : 0.7728         
##                                          
##             Sensitivity : 0.9803         
##             Specificity : 0.9740         
##          Pos Pred Value : 0.9858         
##          Neg Pred Value : 0.9639         
##              Prevalence : 0.6490         
##          Detection Rate : 0.6362         
##    Detection Prevalence : 0.6453         
##       Balanced Accuracy : 0.9771         
##                                          
##        'Positive' Class : 1              
## 
mcrp5 <- confusionMatrix(resultado_prueba5, prueba$Class)  #Matriz de confusion de resultado de prueba
mcrp5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2
##          1 87  1
##          2  2 46
##                                           
##                Accuracy : 0.9779          
##                  95% CI : (0.9369, 0.9954)
##     No Information Rate : 0.6544          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9515          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9775          
##             Specificity : 0.9787          
##          Pos Pred Value : 0.9886          
##          Neg Pred Value : 0.9583          
##              Prevalence : 0.6544          
##          Detection Rate : 0.6397          
##    Detection Prevalence : 0.6471          
##       Balanced Accuracy : 0.9781          
##                                           
##        'Positive' Class : 1               
## 

6. Modelo con el método rf

modelo6 <- train(Class ~ ., data=entrenamiento, 
                method = "rf", 
                preProcess = c("scale", "center"),
                trControl = trainControl(method="cv", number=10),
                tuneGrid = expand.grid(mtry=c(2,4,6))
                )

resultado_entrenamiento6 <- predict(modelo6, entrenamiento)
resultado_prueba6 <- predict(modelo6, prueba)

#Matriz de Consufión 
mcre6 <- confusionMatrix(resultado_entrenamiento6,entrenamiento$Class) #Matriz de confusion de resultado de entrenamiento
mcre6
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2
##          1 355   0
##          2   0 192
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9933, 1)
##     No Information Rate : 0.649      
##     P-Value [Acc > NIR] : < 2.2e-16  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.000      
##             Specificity : 1.000      
##          Pos Pred Value : 1.000      
##          Neg Pred Value : 1.000      
##              Prevalence : 0.649      
##          Detection Rate : 0.649      
##    Detection Prevalence : 0.649      
##       Balanced Accuracy : 1.000      
##                                      
##        'Positive' Class : 1          
## 
mcrp6 <- confusionMatrix(resultado_prueba6, prueba$Class)  #Matriz de confusion de resultado de prueba
mcrp6
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  1  2
##          1 87  2
##          2  2 45
##                                           
##                Accuracy : 0.9706          
##                  95% CI : (0.9264, 0.9919)
##     No Information Rate : 0.6544          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.935           
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9775          
##             Specificity : 0.9574          
##          Pos Pred Value : 0.9775          
##          Neg Pred Value : 0.9574          
##              Prevalence : 0.6544          
##          Detection Rate : 0.6397          
##    Detection Prevalence : 0.6544          
##       Balanced Accuracy : 0.9675          
##                                           
##        'Positive' Class : 1               
## 

Paso 6. Resumen de resultados

resultados <- data.frame(
  "svmLinear" = c(mcre1$overall["Accuracy"], mcrp1$overall["Accuracy"]),
  "svmRadial" = c(mcre2$overall["Accuracy"], mcrp2$overall["Accuracy"]),
  "svmPoly" = c(mcre3$overall["Accuracy"], mcrp3$overall["Accuracy"]),
  "rpart" = c(mcre4$overall["Accuracy"], mcrp4$overall["Accuracy"]),
  "nnet" = c(mcre5$overall["Accuracy"], mcrp5$overall["Accuracy"]),
  "rf" = c(mcre6$overall["Accuracy"], mcrp6$overall["Accuracy"])
)
rownames(resultados) <- c("Precision de entrenamiento", "Precision de prueba")
resultados
##                            svmLinear svmRadial   svmPoly     rpart      nnet
## Precision de entrenamiento 0.9725777 0.9981718 0.9725777 0.9689214 0.9780622
## Precision de prueba        0.9705882 0.9485294 0.9705882 0.9558824 0.9779412
##                                   rf
## Precision de entrenamiento 1.0000000
## Precision de prueba        0.9705882

Conclusiones

El modelo con el método de bosques aleatorios presenta sobreajuste, ya que tiene una alta precisión en entrenamiento, pero baja en prueba.
Acorde al resumen de resultados, el mejor modelo es el de Redes Neuronales debido a la poca variación entre resultados y un valor mayor en la prueba.

LS0tDQp0aXRsZTogJ01MMjogQ2FyZXQgRnVuY3Rpb24nDQphdXRob3I6ICJBdnJpbCBMb2JhdG8gLSBBMDA4MzMxMTMiDQpkYXRlOiAiMjAyNC0wMi0yOCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KDQohW10oaHR0cHM6Ly9zdGF0aWMwMS5ueXQuY29tL2ltYWdlcy8yMDE5LzA3LzA5L3NjaWVuY2UvMDNDQU5DRVItQkFDVEVSSUEvMDNDQU5DRVItQkFDVEVSSUEtc3VwZXJKdW1iby5qcGcpDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiNFMDY2RkYiPioqVGVvcsOtYSoqPC9zcGFuPg0KRWwgcGFxdWV0ZSAqY2FyZXQgKENsYXNpZmljYXRpb24gQW5kIFJlZ3Jlc3Npb24gVHJhaW5pbmcpKiBlcyB1biBwYXF1ZXRlIGludGVncmFsIGNvbiB1bmEgYW1wbGlhIHZhcmllZGFkIGRlIGFsZ29yaXRtb3MgcGFyYSBlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljby4gIA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjojRTA2NkZGIj4qKkVqZXJjaWNpbyAxLioqPC9zcGFuPiAgKipNb2RlbG8gZGUgQXByZW5kaXphamUgQXV0b23DoXRpY28qKg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjojRTA2NkZGIj4qKlBhc28gMS4qKjwvc3Bhbj4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcw0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKSAjQWxnb3JpdG1vcyBkZSBhcHJlbmRpemFqZQ0KbGlicmFyeShjYXJldCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhc2V0cyIpICNVc2FyIGxhIGJhc2UgZGUgZGF0b3MgIklyaXMiDQpsaWJyYXJ5KGRhdGFzZXRzKQ0KI2luc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAjR3LDoWZpY2FzIGNvbiBtZWpvciBkaXNlw7FvDQpsaWJyYXJ5KGdncGxvdDIpDQojaW5zdGFsbC5wYWNrYWdlcygibGF0dGljZSIpICNDcmVhciBncsOhZmljb3MNCmxpYnJhcnkobGF0dGljZSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJEYXRhRXhwbG9yZXIiKSAjQ3JlYXIgZ3LDoWZpY29zDQpsaWJyYXJ5KERhdGFFeHBsb3JlcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJtbGJlbmNoIikgI0NyZWFyIGdyw6FmaWNvcw0KbGlicmFyeShtbGJlbmNoKQ0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjojRTA2NkZGIj4qKlBhc28gMi4qKjwvc3Bhbj4gIENyZWFyIHkgbGltcGlhciBiYXNlIGRlIGRhdG9zDQpgYGB7cn0NCmRhdGEoIkJyZWFzdENhbmNlciIpDQpkZjwtIEJyZWFzdENhbmNlcg0KIyBBc2lnbmFyIGVsIGRhdGFmcmFtZSBCcmVhc3RDYW5jZXIgYSB1bmEgdmFyaWFibGUgKGVuIGVzdGUgY2FzbywgZGYpDQpkZiA8LSBkZiAlPiUgc2VsZWN0KC1JZCkNCmRmIDwtIG5hLm9taXQoZGYpDQpkZiA8LSBkYXRhLmZyYW1lKHNhcHBseShkZiwgYXMubnVtZXJpYykpDQoNCnN1bW1hcnkoZGYpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6I0UwNjZGRiI+KipQYXNvIDMuKio8L3NwYW4+IEdlbmVyYXIgYW7DoWxpc2lzIGV4cGxvcmF0b3Jpbw0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0Kc3RyKGRmKQ0KYm94cGxvdChkZikNCiNwbG90X21pc3NpbmcoZGYpDQpwbG90X2hpc3RvZ3JhbShkZikNCnBsb3RfY29ycmVsYXRpb24oZGYpDQojY3JlYXRlX3JlcG9ydChkZikNCmBgYA0KDQoqKk5vdGE6IExhIHZhcmlhYmxlIHF1ZSBxdWVyZW1vcyBwcmVkZWNpciBkZWJlIHRlbmVyIGZvcm1hdG8gZGUgRkFDVE9SKioNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6I0UwNjZGRiI+KipQYXNvIDQuKio8L3NwYW4+IFBhcnRpciBsb3MgZGF0b3MgODAvMjANCmBgYHtyfQ0KY2xhc3MoZGYpICANCnNldC5zZWVkKDEyMykNCnJlbmdsb25lc19lbnRyZW5hbWllbnRvIDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oZGYkQ2xhc3MsIHA9LjgsIGxpc3Q9RkFMU0UpDQoNCmVudHJlbmFtaWVudG8gPC0gZGZbcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCnBydWViYSA8LSBkZlstcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCg0KZW50cmVuYW1pZW50byRDbGFzcyA8LSBhcy5mYWN0b3IoZW50cmVuYW1pZW50byRDbGFzcykNCnBydWViYSRDbGFzcyA8LSBhcy5mYWN0b3IocHJ1ZWJhJENsYXNzKQ0KYGBgDQojIDxzcGFuIHN0eWxlPSJjb2xvcjojRTA2NkZGIj4qKlBhc28gNS4qKjwvc3Bhbj4gTcOpdG9kb3MgcGFyYSBtb2RlbGFyICANCkxvcyBtw6l0b2RvcyBtw6FzIHV0aWxpemFkb3MgcGFyYSBtb2RlbGFyIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvIHNvbjogIA0KKiAqKlNWTSoqLiAqU3VwcG9ydCBWZWN0b3IgTWFjaGluZSogbyBNw6FxdWluYSBkZSBWZWN0b3JlcyBkZSBTb3BvcnRlLiBIYXkgdmFyaW9zIHN1YnRpcG9zOiBMaW5lYWwgKHN2bUxpbmVhbCksIFJkaWFsIChzdm1SYWRpYWwpLCBQb2xpbsOzbWljbyAoc3ZtUG9seSksIGV0Yy4gIA0KKiAqKsOBcmJvbCBkZSBEZWNpc2nDs24qKi4gcnBhcnQgIA0KKiAqKlJlZGVzIE5ldXJvbmFsZXMqKi4gbm5ldCAgDQoqICoqUmFuZG9tIEZvcmVzdCoqIG8gQm9zcXVlcyBBbGVhdG9yaW9zLiByZiAgDQoNCiMjICoqMS4qKiBNb2RlbG8gY29uIGVsIG3DqXRvZG8gc3ZtTGluZWFsICANCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoImtlcm5sYWIiKQ0KbGlicmFyeShjYXJldCkNCm1vZGVsbzEgPC0gdHJhaW4oQ2xhc3MgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sIA0KICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1MaW5lYXIiLCANCiAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCAiY2VudGVyIiksDQogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gZGF0YS5mcmFtZShDPTEpICNDdWFuZG8gZXMgc3ZtTGluZWFyDQogICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzEgPC0gcHJlZGljdChtb2RlbG8xLCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTEgPC0gcHJlZGljdChtb2RlbG8xLCBwcnVlYmEpDQoNCiNNYXRyaXogZGUgQ29uc3VmacOzbiANCm1jcmUxIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzEsZW50cmVuYW1pZW50byRDbGFzcykgI01hdHJpeiBkZSBjb25mdXNpb24gZGUgcmVzdWx0YWRvIGRlIGVudHJlbmFtaWVudG8NCm1jcmUxDQptY3JwMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTEsIHBydWViYSRDbGFzcykgICNNYXRyaXogZGUgY29uZnVzaW9uIGRlIHJlc3VsdGFkbyBkZSBwcnVlYmENCm1jcnAxDQpgYGANCg0KIyMgKioyLioqIE1vZGVsbyBjb24gZWwgbcOpdG9kbyBzdm1SYWRpYWwgIA0KYGBge3J9DQptb2RlbG8yIDwtIHRyYWluKENsYXNzIH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLCANCiAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtUmFkaWFsIiwgDQogICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwgImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGRhdGEuZnJhbWUoc2lnbWE9MSxDPTEpICNDYW1iaWFyDQogICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzIgPC0gcHJlZGljdChtb2RlbG8yLCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTIgPC0gcHJlZGljdChtb2RlbG8yLCBwcnVlYmEpDQoNCiNNYXRyaXogZGUgQ29uc3VmacOzbiANCm1jcmUyIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzIsZW50cmVuYW1pZW50byRDbGFzcykgI01hdHJpeiBkZSBjb25mdXNpb24gZGUgcmVzdWx0YWRvIGRlIGVudHJlbmFtaWVudG8NCm1jcmUyDQptY3JwMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTIsIHBydWViYSRDbGFzcykgICNNYXRyaXogZGUgY29uZnVzaW9uIGRlIHJlc3VsdGFkbyBkZSBwcnVlYmENCm1jcnAyDQpgYGANCg0KIyMgKiozLioqIE1vZGVsbyBjb24gZWwgbcOpdG9kbyBzdm1Qb2x5DQpgYGB7cn0NCm1vZGVsbzMgPC0gdHJhaW4oQ2xhc3MgfiAuLCBkYXRhID0gZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1Qb2x5IiwNCiAgICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsICJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCksDQogICAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGRhdGEuZnJhbWUoZGVncmVlID0gMSwgc2NhbGUgPSAxLCBDID0gMSkpICAjIEFkanVzdCB2YWx1ZXMgYXMgbmVlZGVkDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMyA8LSBwcmVkaWN0KG1vZGVsbzMsIGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMyA8LSBwcmVkaWN0KG1vZGVsbzMsIHBydWViYSkNCg0KI01hdHJpeiBkZSBDb25zdWZpw7NuIA0KbWNyZTMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMyxlbnRyZW5hbWllbnRvJENsYXNzKSAjTWF0cml6IGRlIGNvbmZ1c2lvbiBkZSByZXN1bHRhZG8gZGUgZW50cmVuYW1pZW50bw0KbWNyZTMNCm1jcnAzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMywgcHJ1ZWJhJENsYXNzKSAgI01hdHJpeiBkZSBjb25mdXNpb24gZGUgcmVzdWx0YWRvIGRlIHBydWViYQ0KbWNycDMNCmBgYA0KIyMgKio0LioqIE1vZGVsbyBjb24gZWwgbcOpdG9kbyBycGFydA0KYGBge3J9DQptb2RlbG80IDwtIHRyYWluKENsYXNzIH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLCANCiAgICAgICAgICAgICAgICBtZXRob2QgPSAicnBhcnQiLCANCiAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCAiY2VudGVyIiksDQogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgIHR1bmVMZW5ndGggPSAxMCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG80IDwtIHByZWRpY3QobW9kZWxvNCwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE0IDwtIHByZWRpY3QobW9kZWxvNCwgcHJ1ZWJhKQ0KDQojTWF0cml6IGRlIENvbnN1ZmnDs24gDQptY3JlNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG80LGVudHJlbmFtaWVudG8kQ2xhc3MpICNNYXRyaXogZGUgY29uZnVzaW9uIGRlIHJlc3VsdGFkbyBkZSBlbnRyZW5hbWllbnRvDQptY3JlNA0KbWNycDQgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE0LCBwcnVlYmEkQ2xhc3MpICAjTWF0cml6IGRlIGNvbmZ1c2lvbiBkZSByZXN1bHRhZG8gZGUgcHJ1ZWJhDQptY3JwNA0KYGBgDQoNCiMjICoqNS4qKiBNb2RlbG8gY29uIGVsIG1ldG9kbyBubmV0DQpgYGB7cn0NCm1vZGVsbzUgPC0gdHJhaW4oQ2xhc3MgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sIA0KICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJubmV0IiwgDQogICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwgImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKQ0KICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG81IDwtIHByZWRpY3QobW9kZWxvNSwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE1IDwtIHByZWRpY3QobW9kZWxvNSwgcHJ1ZWJhKQ0KDQojTWF0cml6IGRlIENvbnN1ZmnDs24gDQptY3JlNSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG81LGVudHJlbmFtaWVudG8kQ2xhc3MpICNNYXRyaXogZGUgY29uZnVzaW9uIGRlIHJlc3VsdGFkbyBkZSBlbnRyZW5hbWllbnRvDQptY3JlNQ0KbWNycDUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE1LCBwcnVlYmEkQ2xhc3MpICAjTWF0cml6IGRlIGNvbmZ1c2lvbiBkZSByZXN1bHRhZG8gZGUgcHJ1ZWJhDQptY3JwNQ0KYGBgDQoNCiMjICoqNi4qKiBNb2RlbG8gY29uIGVsIG3DqXRvZG8gcmYNCmBgYHtyfQ0KbW9kZWxvNiA8LSB0cmFpbihDbGFzcyB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywgDQogICAgICAgICAgICAgICAgbWV0aG9kID0gInJmIiwgDQogICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwgImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGV4cGFuZC5ncmlkKG10cnk9YygyLDQsNikpDQogICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYgPC0gcHJlZGljdChtb2RlbG82LCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTYgPC0gcHJlZGljdChtb2RlbG82LCBwcnVlYmEpDQoNCiNNYXRyaXogZGUgQ29uc3VmacOzbiANCm1jcmU2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYsZW50cmVuYW1pZW50byRDbGFzcykgI01hdHJpeiBkZSBjb25mdXNpb24gZGUgcmVzdWx0YWRvIGRlIGVudHJlbmFtaWVudG8NCm1jcmU2DQptY3JwNiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTYsIHBydWViYSRDbGFzcykgICNNYXRyaXogZGUgY29uZnVzaW9uIGRlIHJlc3VsdGFkbyBkZSBwcnVlYmENCm1jcnA2DQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6I0UwNjZGRiI+KipQYXNvIDYuKio8L3NwYW4+IFJlc3VtZW4gZGUgcmVzdWx0YWRvcyAgDQpgYGB7cn0NCnJlc3VsdGFkb3MgPC0gZGF0YS5mcmFtZSgNCiAgInN2bUxpbmVhciIgPSBjKG1jcmUxJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAxJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAic3ZtUmFkaWFsIiA9IGMobWNyZTIkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDIkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJzdm1Qb2x5IiA9IGMobWNyZTMkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDMkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJycGFydCIgPSBjKG1jcmU0JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA0JG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAibm5ldCIgPSBjKG1jcmU1JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA1JG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAicmYiID0gYyhtY3JlNiRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNiRvdmVyYWxsWyJBY2N1cmFjeSJdKQ0KKQ0Kcm93bmFtZXMocmVzdWx0YWRvcykgPC0gYygiUHJlY2lzaW9uIGRlIGVudHJlbmFtaWVudG8iLCAiUHJlY2lzaW9uIGRlIHBydWViYSIpDQpyZXN1bHRhZG9zDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6I0UwNjZGRiI+KipDb25jbHVzaW9uZXMqKjwvc3Bhbj4gDQpFbCBtb2RlbG8gY29uIGVsIG3DqXRvZG8gZGUgYm9zcXVlcyBhbGVhdG9yaW9zIHByZXNlbnRhIHNvYnJlYWp1c3RlLCB5YSBxdWUgdGllbmUgdW5hIGFsdGEgcHJlY2lzacOzbiBlbiBlbnRyZW5hbWllbnRvLCBwZXJvIGJhamEgZW4gcHJ1ZWJhLiAgDQpBY29yZGUgYWwgcmVzdW1lbiBkZSByZXN1bHRhZG9zLCBlbCBtZWpvciBtb2RlbG8gZXMgZWwgZGUgKipSZWRlcyBOZXVyb25hbGVzKiogZGViaWRvIGEgbGEgcG9jYSB2YXJpYWNpw7NuIGVudHJlIHJlc3VsdGFkb3MgeSB1biB2YWxvciBtYXlvciBlbiBsYSBwcnVlYmEu