Teoría

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

Instalar paquetes y llamar librerías

#install.packages("caret") # Algoritmos de aprendizaje automático
#install.packages("ggplot2") # Gráficas con mejor diseño
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.1
library(mlbench)
#install.packages("lattice") # Crear gráficos
library(lattice)
## Warning: package 'lattice' was built under R version 4.3.1
#install.packages("datasets") # Usar la base de datos "Iris"
library(datasets)
library(DataExplorer)
## Warning: package 'DataExplorer' was built under R version 4.3.1
library(caret)

Crear base de datos

data(BreastCancer)
df <- BreastCancer
df$Class <- as.factor(df$Class)

Análisis exploratorio

summary(df)
##       Id             Cl.thickness   Cell.size     Cell.shape  Marg.adhesion
##  Length:699         1      :145   1      :384   1      :353   1      :407  
##  Class :character   5      :130   10     : 67   2      : 59   2      : 58  
##  Mode  :character   3      :108   3      : 52   10     : 58   3      : 58  
##                     4      : 80   2      : 45   3      : 56   10     : 55  
##                     10     : 69   4      : 40   4      : 44   4      : 33  
##                     2      : 50   5      : 30   5      : 34   8      : 25  
##                     (Other):117   (Other): 81   (Other): 95   (Other): 63  
##   Epith.c.size  Bare.nuclei   Bl.cromatin  Normal.nucleoli    Mitoses   
##  2      :386   1      :402   2      :166   1      :443     1      :579  
##  3      : 72   10     :132   3      :165   10     : 61     2      : 35  
##  4      : 48   2      : 30   1      :152   3      : 44     3      : 33  
##  1      : 47   5      : 30   7      : 73   2      : 36     10     : 14  
##  6      : 41   3      : 28   4      : 40   8      : 24     4      : 12  
##  5      : 39   (Other): 61   5      : 34   6      : 22     7      :  9  
##  (Other): 66   NA's   : 16   (Other): 69   (Other): 69     (Other): 17  
##        Class    
##  benign   :458  
##  malignant:241  
##                 
##                 
##                 
##                 
## 
str(df)
## 'data.frame':    699 obs. of  11 variables:
##  $ Id             : chr  "1000025" "1002945" "1015425" "1016277" ...
##  $ Cl.thickness   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
create_report(df)
## 
## 
## processing file: report.rmd
## 
  |                                           
  |                                     |   0%
  |                                           
  |.                                    |   2%                                 
  |                                           
  |..                                   |   5% (global_options)                
  |                                           
  |...                                  |   7%                                 
  |                                           
  |....                                 |  10% (introduce)                     
  |                                           
  |....                                 |  12%                                 
  |                                           
  |.....                                |  14% (plot_intro)                    
  |                                           
  |......                               |  17%                                 
  |                                           
  |.......                              |  19% (data_structure)                
  |                                           
  |........                             |  21%                                 
  |                                           
  |.........                            |  24% (missing_profile)               
  |                                           
  |..........                           |  26%                                 
  |                                           
  |...........                          |  29% (univariate_distribution_header)
  |                                           
  |...........                          |  31%                                 
  |                                           
  |............                         |  33% (plot_histogram)                
  |                                           
  |.............                        |  36%                                 
  |                                           
  |..............                       |  38% (plot_density)                  
  |                                           
  |...............                      |  40%                                 
  |                                           
  |................                     |  43% (plot_frequency_bar)            
  |                                           
  |.................                    |  45%                                 
  |                                           
  |..................                   |  48% (plot_response_bar)             
  |                                           
  |..................                   |  50%                                 
  |                                           
  |...................                  |  52% (plot_with_bar)                 
  |                                           
  |....................                 |  55%                                 
  |                                           
  |.....................                |  57% (plot_normal_qq)                
  |                                           
  |......................               |  60%                                 
  |                                           
  |.......................              |  62% (plot_response_qq)              
  |                                           
  |........................             |  64%                                 
  |                                           
  |.........................            |  67% (plot_by_qq)                    
  |                                           
  |..........................           |  69%                                 
  |                                           
  |..........................           |  71% (correlation_analysis)          
  |                                           
  |...........................          |  74%                                 
  |                                           
  |............................         |  76% (principal_component_analysis)  
  |                                           
  |.............................        |  79%                                 
  |                                           
  |..............................       |  81% (bivariate_distribution_header) 
  |                                           
  |...............................      |  83%                                 
  |                                           
  |................................     |  86% (plot_response_boxplot)         
  |                                           
  |.................................    |  88%                                 
  |                                           
  |.................................    |  90% (plot_by_boxplot)               
  |                                           
  |..................................   |  93%                                 
  |                                           
  |...................................  |  95% (plot_response_scatterplot)     
  |                                           
  |.................................... |  98%                                 
  |                                           
  |.....................................| 100% (plot_by_scatterplot)           
## output file: /Users/genarorodriguezalcantara/Desktop/Tec/AI - Concentración/Módulo 2 - Machine Learning/Code/report.knit.md
## /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/pandoc +RTS -K512m -RTS '/Users/genarorodriguezalcantara/Desktop/Tec/AI - Concentración/Módulo 2 - Machine Learning/Code/report.knit.md' --to html4 --from markdown+autolink_bare_uris+tex_math_single_backslash --output pandoc1862f30a1deec.html --lua-filter /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library/rmarkdown/rmarkdown/lua/pagebreak.lua --lua-filter /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library/rmarkdown/rmarkdown/lua/latex-div.lua --embed-resources --standalone --variable bs3=TRUE --section-divs --table-of-contents --toc-depth 6 --template /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library/rmarkdown/rmd/h/default.html --no-highlight --variable highlightjs=1 --variable theme=yeti --mathjax --variable 'mathjax-url=https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML' --include-in-header /var/folders/p_/5232mt8908lbs1jpmzyjh8kh0000gn/T//Rtmpc6BbLJ/rmarkdown-str1862fda0b079.html
## 
## Output created: report.html
plot_missing(df)

#plot_histogram(df)
plot_correlation(df)
## 1 features with more than 20 categories ignored!
## Id: 645 categories

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

Partir datos 80-20

# Eliminar la columna ID del data frame df
df <- df[, !names(df) %in% "Id"]

set.seed(123)

renglones_entrenamiento <- createDataPartition(df$Class, p = 0.8, list = FALSE)
entrenamiento <- df[renglones_entrenamiento, ]
prueba <- df[-renglones_entrenamiento, ]

# Verificar si hay valores faltantes en el conjunto de entrenamiento
anyNA(entrenamiento)
## [1] TRUE
sum(is.na(entrenamiento))
## [1] 12
# Eliminar filas con valores faltantes
entrenamiento <- na.omit(entrenamiento)
prueba <- na.omit(entrenamiento)

Distintos tipos de Métodos para Modelar

Los métodos más utilizados para moelar aprendizaje automático son:

  • SVM: Support Vector Machine o Máquina de Vectores de Soporte. Hay varios subtipos: Linea (svmLineal)m Radial (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

# Define la cuadrícula de sintonización para el parámetro C
# Define la cuadrícula de sintonización para el parámetro C
tuneGrid <- expand.grid(C = c(0.1, 1, 10, 100))

# Entrenamiento del modelo
modelo <- train(Class ~ ., 
                data = entrenamiento,
                method = "svmLinear",
                preProcess = c("scale", "center"),
                trControl = trainControl(method = "cv", number = 10),
                tuneGrid = tuneGrid
)


# Predicción en datos de entrenamiento y prueba
resultado_entrenamiento <- predict(modelo, entrenamiento)
resultado_prueba <- predict(modelo, prueba)

# Matriz de Confusión
mcre <- confusionMatrix(resultado_entrenamiento, entrenamiento$Class)
mcre
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 
mcrp <- confusionMatrix(resultado_prueba, prueba$Class)
mcrp
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 

2. Modelo con el método svmRadial

# Define la cuadrícula de sintonización para los parámetros sigma y C
tuneGrid <- expand.grid(sigma = 0.1, C = 1)

# Entrenamiento del modelo
model2 <- train(Class ~ ., 
                data = entrenamiento,
                method = "svmRadial", 
                preProcess = c("scale", "center"),
                trControl = trainControl(method = "cv", number = 10),
                tuneGrid = tuneGrid
)

# Predicción en datos de entrenamiento y prueba
resultado_entrenamiento2 <- predict(model2, entrenamiento)
resultado_prueba2 <- predict(model2, prueba)

# Matriz de Confusión
mcre2 <- confusionMatrix(resultado_entrenamiento, entrenamiento$Class)
mcre2
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 
mcrp2 <- confusionMatrix(resultado_prueba, prueba$Class)
mcrp2
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 

3. Modelo con el método svmPoly

# Define la cuadrícula de sintonización para los parámetros degree, scale y C
tuneGrid <- expand.grid(degree = 1, scale = 1, C = 1)

# Entrenamiento del modelo
model3 <- train(Class ~ ., 
                data = entrenamiento,
                method = "svmPoly", 
                preProcess = c("scale", "center"),
                trControl = trainControl(method = "cv", number = 10),
                tuneGrid = tuneGrid
)

# Predicción en datos de entrenamiento y prueba
resultado_entrenamiento3 <- predict(model3, entrenamiento)
resultado_prueba3 <- predict(model3, prueba)

# Matriz de Confusión
mcre3 <- confusionMatrix(resultado_entrenamiento, entrenamiento$Class)
mcre3
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 
mcrp3 <- confusionMatrix(resultado_prueba, prueba$Class)
mcrp3
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 

4. Modelo con el método rpart

# Define la cuadrícula de sintonización para el parámetro cp
#tuneGrid <- expand.grid(cp = 0.01)

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

# Predicción en datos de entrenamiento y prueba
resultado_entrenamiento4 <- predict(model4, entrenamiento)
resultado_prueba4 <- predict(model4, prueba)

# Matriz de Confusión
mcre4 <- confusionMatrix(resultado_entrenamiento, entrenamiento$Class)
mcre4
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 
mcrp4 <- confusionMatrix(resultado_prueba, prueba$Class)
mcrp4
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 

5. Modelo con el método nnet

# Define la cuadrícula de sintonización para el parámetro cp
#tuneGrid <- expand.grid(cp = 0.01)

# Entrenamiento del modelo
model5 <- train(Class ~ ., 
                data = entrenamiento,
                method = "nnet", 
                preProcess = c("scale", "center"),
                trControl = trainControl(method = "cv", number = 10)
                
)
## # weights:  83
## initial  value 339.732616 
## iter  10 value 100.926725
## iter  20 value 76.216441
## iter  30 value 50.772807
## iter  40 value 50.727376
## iter  50 value 50.726862
## final  value 50.726787 
## converged
## # weights:  247
## initial  value 338.813594 
## iter  10 value 36.472228
## iter  20 value 25.244606
## iter  30 value 24.688318
## iter  40 value 24.581490
## iter  50 value 24.092892
## iter  60 value 24.040586
## iter  70 value 23.972617
## iter  80 value 23.868068
## iter  90 value 23.823945
## iter 100 value 23.762947
## final  value 23.762947 
## stopped after 100 iterations
## # weights:  411
## initial  value 379.387405 
## iter  10 value 26.752774
## iter  20 value 17.471172
## iter  30 value 7.425505
## iter  40 value 5.378711
## iter  50 value 2.401105
## iter  60 value 2.256164
## iter  70 value 1.918069
## iter  80 value 1.909687
## iter  90 value 1.909647
## iter 100 value 1.909639
## final  value 1.909639 
## stopped after 100 iterations
## # weights:  83
## initial  value 306.859555 
## iter  10 value 68.944729
## iter  20 value 52.347303
## iter  30 value 45.087148
## iter  40 value 34.278798
## iter  50 value 23.115200
## iter  60 value 19.236077
## iter  70 value 17.805629
## iter  80 value 17.696510
## iter  90 value 17.690828
## final  value 17.690765 
## converged
## # weights:  247
## initial  value 399.007815 
## iter  10 value 82.720322
## iter  20 value 40.417450
## iter  30 value 22.167000
## iter  40 value 14.097478
## iter  50 value 11.108854
## iter  60 value 10.532603
## iter  70 value 10.409762
## iter  80 value 10.392814
## iter  90 value 10.390052
## iter 100 value 10.388654
## final  value 10.388654 
## stopped after 100 iterations
## # weights:  411
## initial  value 385.645243 
## iter  10 value 39.434357
## iter  20 value 19.762137
## iter  30 value 14.379684
## iter  40 value 10.305221
## iter  50 value 9.131875
## iter  60 value 9.031854
## iter  70 value 8.895743
## iter  80 value 8.882066
## iter  90 value 8.878079
## iter 100 value 8.876480
## final  value 8.876480 
## stopped after 100 iterations
## # weights:  83
## initial  value 421.000331 
## iter  10 value 163.483579
## iter  20 value 90.494104
## iter  30 value 61.288384
## iter  40 value 39.895703
## iter  50 value 39.721966
## iter  60 value 39.716757
## iter  70 value 39.708896
## iter  80 value 35.147721
## iter  90 value 34.883263
## iter 100 value 29.553505
## final  value 29.553505 
## stopped after 100 iterations
## # weights:  247
## initial  value 320.723919 
## iter  10 value 57.711452
## iter  20 value 42.223006
## iter  30 value 34.267834
## iter  40 value 28.333419
## iter  50 value 23.830968
## iter  60 value 23.430184
## iter  70 value 23.301624
## iter  80 value 22.795307
## iter  90 value 22.654772
## iter 100 value 22.521669
## final  value 22.521669 
## stopped after 100 iterations
## # weights:  411
## initial  value 320.535116 
## iter  10 value 20.529550
## iter  20 value 13.697656
## iter  30 value 10.089026
## iter  40 value 9.456808
## iter  50 value 7.199692
## iter  60 value 4.098522
## iter  70 value 3.089207
## iter  80 value 3.059346
## iter  90 value 2.885574
## iter 100 value 2.873574
## final  value 2.873574 
## stopped after 100 iterations
## # weights:  83
## initial  value 342.848176 
## iter  10 value 90.820161
## iter  20 value 56.659425
## iter  30 value 56.312852
## iter  40 value 56.312252
## iter  50 value 56.311620
## iter  60 value 52.667000
## iter  70 value 52.341003
## iter  80 value 49.547522
## iter  90 value 49.547313
## iter 100 value 49.547210
## final  value 49.547210 
## stopped after 100 iterations
## # weights:  247
## initial  value 320.608770 
## iter  10 value 39.261106
## iter  20 value 23.831750
## iter  30 value 19.217713
## iter  40 value 18.401861
## iter  50 value 17.481300
## iter  60 value 17.293709
## iter  70 value 17.110775
## iter  80 value 17.035470
## iter  90 value 17.000693
## iter 100 value 16.231262
## final  value 16.231262 
## stopped after 100 iterations
## # weights:  411
## initial  value 380.867171 
## iter  10 value 18.364840
## iter  20 value 3.821277
## iter  30 value 2.005475
## iter  40 value 1.922251
## iter  50 value 1.910942
## iter  60 value 1.909973
## iter  70 value 1.909879
## iter  80 value 1.909411
## iter  90 value 1.409512
## iter 100 value 1.387350
## final  value 1.387350 
## stopped after 100 iterations
## # weights:  83
## initial  value 323.774693 
## iter  10 value 75.250150
## iter  20 value 47.660715
## iter  30 value 39.511788
## iter  40 value 33.347667
## iter  50 value 26.312549
## iter  60 value 21.863594
## iter  70 value 18.808030
## iter  80 value 17.820083
## iter  90 value 17.665635
## iter 100 value 17.663548
## final  value 17.663548 
## stopped after 100 iterations
## # weights:  247
## initial  value 440.470573 
## iter  10 value 73.150239
## iter  20 value 34.971708
## iter  30 value 21.198483
## iter  40 value 16.793630
## iter  50 value 13.115277
## iter  60 value 11.593911
## iter  70 value 11.545789
## iter  80 value 11.527587
## iter  90 value 11.526977
## final  value 11.526972 
## converged
## # weights:  411
## initial  value 339.603964 
## iter  10 value 53.781364
## iter  20 value 28.614391
## iter  30 value 21.059405
## iter  40 value 14.603766
## iter  50 value 10.984852
## iter  60 value 9.783236
## iter  70 value 9.570419
## iter  80 value 9.489933
## iter  90 value 9.438107
## iter 100 value 9.432460
## final  value 9.432460 
## stopped after 100 iterations
## # weights:  83
## initial  value 329.740194 
## iter  10 value 75.433699
## iter  20 value 42.746595
## iter  30 value 42.570565
## iter  40 value 42.514266
## iter  50 value 42.450103
## iter  60 value 33.023352
## iter  70 value 29.520946
## iter  80 value 29.511724
## iter  90 value 22.069377
## iter 100 value 21.947804
## final  value 21.947804 
## stopped after 100 iterations
## # weights:  247
## initial  value 317.347119 
## iter  10 value 50.702774
## iter  20 value 26.716097
## iter  30 value 23.819330
## iter  40 value 22.816413
## iter  50 value 20.513774
## iter  60 value 18.292960
## iter  70 value 17.706075
## iter  80 value 17.109225
## iter  90 value 17.059042
## iter 100 value 16.058009
## final  value 16.058009 
## stopped after 100 iterations
## # weights:  411
## initial  value 333.379956 
## iter  10 value 39.358142
## iter  20 value 20.497225
## iter  30 value 12.525165
## iter  40 value 11.149897
## iter  50 value 9.142610
## iter  60 value 5.514727
## iter  70 value 4.366777
## iter  80 value 4.183516
## iter  90 value 4.156895
## iter 100 value 4.126042
## final  value 4.126042 
## stopped after 100 iterations
## # weights:  83
## initial  value 390.292970 
## iter  10 value 96.420873
## iter  20 value 65.575536
## iter  30 value 58.872186
## iter  40 value 45.361878
## iter  50 value 42.479201
## iter  60 value 42.477934
## iter  70 value 39.944062
## iter  80 value 39.431854
## iter  90 value 39.429949
## iter 100 value 39.429918
## final  value 39.429918 
## stopped after 100 iterations
## # weights:  247
## initial  value 404.026870 
## iter  10 value 55.546233
## iter  20 value 52.839942
## iter  30 value 47.164863
## iter  40 value 47.147346
## iter  50 value 47.139100
## iter  60 value 46.995086
## iter  70 value 44.172434
## iter  80 value 43.985061
## iter  90 value 43.919431
## iter 100 value 43.856120
## final  value 43.856120 
## stopped after 100 iterations
## # weights:  411
## initial  value 306.412226 
## iter  10 value 16.630632
## iter  20 value 3.361342
## iter  30 value 1.972493
## iter  40 value 1.513087
## iter  50 value 0.313108
## iter  60 value 0.088926
## iter  70 value 0.033393
## iter  80 value 0.018952
## iter  90 value 0.010341
## iter 100 value 0.003185
## final  value 0.003185 
## stopped after 100 iterations
## # weights:  83
## initial  value 365.647570 
## iter  10 value 178.573578
## iter  20 value 141.062381
## iter  30 value 94.912334
## iter  40 value 68.778555
## iter  50 value 54.393616
## iter  60 value 40.579748
## iter  70 value 31.172998
## iter  80 value 26.371531
## iter  90 value 23.434043
## iter 100 value 21.762833
## final  value 21.762833 
## stopped after 100 iterations
## # weights:  247
## initial  value 345.787569 
## iter  10 value 78.886016
## iter  20 value 46.755638
## iter  30 value 25.301441
## iter  40 value 16.987977
## iter  50 value 13.790073
## iter  60 value 11.796603
## iter  70 value 11.347381
## iter  80 value 11.184345
## iter  90 value 11.106480
## iter 100 value 11.037415
## final  value 11.037415 
## stopped after 100 iterations
## # weights:  411
## initial  value 335.011490 
## iter  10 value 90.329279
## iter  20 value 37.202478
## iter  30 value 20.746522
## iter  40 value 12.311291
## iter  50 value 9.657425
## iter  60 value 8.976881
## iter  70 value 8.753030
## iter  80 value 8.725452
## iter  90 value 8.722161
## iter 100 value 8.721664
## final  value 8.721664 
## stopped after 100 iterations
## # weights:  83
## initial  value 322.031583 
## iter  10 value 105.330717
## iter  20 value 79.708296
## iter  30 value 61.652739
## iter  40 value 61.129860
## iter  50 value 56.802563
## iter  60 value 56.361634
## iter  70 value 47.396591
## iter  80 value 45.468944
## iter  90 value 45.462752
## iter 100 value 45.451946
## final  value 45.451946 
## stopped after 100 iterations
## # weights:  247
## initial  value 341.903716 
## iter  10 value 49.268582
## iter  20 value 16.336689
## iter  30 value 13.350364
## iter  40 value 12.364774
## iter  50 value 10.283284
## iter  60 value 10.250167
## iter  70 value 10.217308
## iter  80 value 8.971408
## iter  90 value 8.950631
## iter 100 value 8.931865
## final  value 8.931865 
## stopped after 100 iterations
## # weights:  411
## initial  value 373.650100 
## iter  10 value 28.164868
## iter  20 value 6.877536
## iter  30 value 2.730811
## iter  40 value 2.318668
## iter  50 value 0.444492
## iter  60 value 0.268713
## iter  70 value 0.252207
## iter  80 value 0.192324
## iter  90 value 0.172059
## iter 100 value 0.148143
## final  value 0.148143 
## stopped after 100 iterations
## # weights:  83
## initial  value 327.699704 
## iter  10 value 97.040074
## iter  20 value 49.736771
## iter  30 value 44.761395
## iter  40 value 39.450749
## iter  50 value 36.268408
## iter  60 value 36.265877
## final  value 36.265835 
## converged
## # weights:  247
## initial  value 405.608304 
## iter  10 value 22.394878
## iter  20 value 13.523224
## iter  30 value 8.974887
## iter  40 value 8.426480
## iter  50 value 8.057922
## iter  60 value 8.047061
## iter  70 value 8.043503
## iter  80 value 7.529781
## iter  90 value 7.522794
## iter 100 value 6.723123
## final  value 6.723123 
## stopped after 100 iterations
## # weights:  411
## initial  value 350.421962 
## iter  10 value 41.324328
## iter  20 value 18.846694
## iter  30 value 10.851655
## iter  40 value 7.213559
## iter  50 value 6.284408
## iter  60 value 5.377830
## iter  70 value 4.238231
## iter  80 value 4.202671
## iter  90 value 4.193306
## iter 100 value 4.189432
## final  value 4.189432 
## stopped after 100 iterations
## # weights:  83
## initial  value 312.738022 
## iter  10 value 95.481769
## iter  20 value 67.685265
## iter  30 value 54.378205
## iter  40 value 33.707717
## iter  50 value 27.501102
## iter  60 value 22.388011
## iter  70 value 18.116053
## iter  80 value 17.815265
## iter  90 value 17.800838
## iter 100 value 17.800165
## final  value 17.800165 
## stopped after 100 iterations
## # weights:  247
## initial  value 391.418869 
## iter  10 value 111.546173
## iter  20 value 44.098744
## iter  30 value 17.588702
## iter  40 value 12.319048
## iter  50 value 11.188652
## iter  60 value 10.823649
## iter  70 value 9.715204
## iter  80 value 9.545090
## iter  90 value 9.538975
## iter 100 value 9.538936
## final  value 9.538936 
## stopped after 100 iterations
## # weights:  411
## initial  value 317.559187 
## iter  10 value 53.446079
## iter  20 value 24.698998
## iter  30 value 12.102970
## iter  40 value 9.127654
## iter  50 value 8.708296
## iter  60 value 8.444610
## iter  70 value 8.243020
## iter  80 value 8.105324
## iter  90 value 8.067340
## iter 100 value 8.065581
## final  value 8.065581 
## stopped after 100 iterations
## # weights:  83
## initial  value 359.068257 
## iter  10 value 275.077952
## iter  20 value 81.738177
## iter  30 value 68.480788
## iter  40 value 56.436329
## iter  50 value 53.662146
## iter  60 value 53.636148
## iter  70 value 42.782358
## iter  80 value 42.549016
## iter  90 value 42.539321
## iter 100 value 42.531879
## final  value 42.531879 
## stopped after 100 iterations
## # weights:  247
## initial  value 300.154311 
## iter  10 value 15.055859
## iter  20 value 5.096175
## iter  30 value 2.411631
## iter  40 value 2.144831
## iter  50 value 2.081965
## iter  60 value 2.069863
## iter  70 value 2.021977
## iter  80 value 2.001702
## iter  90 value 0.127928
## iter 100 value 0.098381
## final  value 0.098381 
## stopped after 100 iterations
## # weights:  411
## initial  value 326.579784 
## iter  10 value 31.341952
## iter  20 value 9.370759
## iter  30 value 2.851914
## iter  40 value 2.741542
## iter  50 value 2.464219
## iter  60 value 2.441239
## iter  70 value 2.395381
## iter  80 value 2.048255
## iter  90 value 2.037726
## iter 100 value 0.215423
## final  value 0.215423 
## stopped after 100 iterations
## # weights:  83
## initial  value 317.637421 
## iter  10 value 69.616674
## iter  20 value 48.268143
## iter  30 value 48.266238
## iter  40 value 45.488007
## iter  50 value 45.419098
## final  value 45.419043 
## converged
## # weights:  247
## initial  value 292.093313 
## iter  10 value 76.206146
## iter  20 value 31.424797
## iter  30 value 25.746713
## iter  40 value 24.509579
## iter  50 value 24.210102
## iter  60 value 23.295214
## iter  70 value 23.281950
## iter  80 value 23.220335
## iter  90 value 23.076158
## iter 100 value 22.855181
## final  value 22.855181 
## stopped after 100 iterations
## # weights:  411
## initial  value 309.601820 
## iter  10 value 10.650438
## iter  20 value 3.087572
## iter  30 value 2.001493
## iter  40 value 1.934424
## iter  50 value 1.902231
## iter  60 value 1.387978
## iter  70 value 0.041214
## iter  80 value 0.005922
## iter  90 value 0.001557
## iter 100 value 0.000861
## final  value 0.000861 
## stopped after 100 iterations
## # weights:  83
## initial  value 331.163125 
## iter  10 value 103.329492
## iter  20 value 64.373445
## iter  30 value 40.954473
## iter  40 value 25.750137
## iter  50 value 18.562383
## iter  60 value 17.439325
## iter  70 value 17.360466
## iter  80 value 17.356909
## final  value 17.356877 
## converged
## # weights:  247
## initial  value 365.398703 
## iter  10 value 78.191420
## iter  20 value 40.110157
## iter  30 value 23.797869
## iter  40 value 14.417759
## iter  50 value 11.526298
## iter  60 value 10.716058
## iter  70 value 10.330288
## iter  80 value 10.149015
## iter  90 value 10.147428
## final  value 10.147420 
## converged
## # weights:  411
## initial  value 372.595294 
## iter  10 value 72.529448
## iter  20 value 44.782630
## iter  30 value 18.934642
## iter  40 value 10.536157
## iter  50 value 9.137754
## iter  60 value 8.914421
## iter  70 value 8.747610
## iter  80 value 8.408047
## iter  90 value 8.310906
## iter 100 value 8.250086
## final  value 8.250086 
## stopped after 100 iterations
## # weights:  83
## initial  value 318.548929 
## iter  10 value 80.709309
## iter  20 value 64.241111
## iter  30 value 61.345478
## iter  40 value 61.311853
## iter  50 value 60.279938
## iter  60 value 49.679353
## iter  70 value 46.527192
## iter  80 value 41.715788
## iter  90 value 36.345104
## iter 100 value 36.306746
## final  value 36.306746 
## stopped after 100 iterations
## # weights:  247
## initial  value 319.195944 
## iter  10 value 21.861340
## iter  20 value 15.413531
## iter  30 value 15.242581
## iter  40 value 15.235427
## iter  50 value 15.230741
## iter  60 value 15.227555
## iter  70 value 15.223566
## iter  80 value 15.220808
## iter  90 value 11.248512
## iter 100 value 6.753979
## final  value 6.753979 
## stopped after 100 iterations
## # weights:  411
## initial  value 323.012598 
## iter  10 value 9.883549
## iter  20 value 2.642070
## iter  30 value 2.158163
## iter  40 value 2.120154
## iter  50 value 2.087100
## iter  60 value 0.295144
## iter  70 value 0.221675
## iter  80 value 0.201098
## iter  90 value 0.191134
## iter 100 value 0.160753
## final  value 0.160753 
## stopped after 100 iterations
## # weights:  83
## initial  value 322.624573 
## iter  10 value 45.276627
## iter  20 value 33.707193
## iter  30 value 18.948351
## iter  40 value 15.213892
## iter  50 value 15.175213
## iter  60 value 15.172990
## iter  70 value 15.172708
## final  value 15.172692 
## converged
## # weights:  247
## initial  value 337.170400 
## iter  10 value 64.624710
## iter  20 value 41.509662
## iter  30 value 36.255910
## iter  40 value 35.605169
## iter  50 value 35.590046
## iter  60 value 35.531100
## iter  70 value 35.526537
## iter  80 value 35.421063
## iter  90 value 35.420308
## iter 100 value 35.367248
## final  value 35.367248 
## stopped after 100 iterations
## # weights:  411
## initial  value 341.933394 
## iter  10 value 24.155359
## iter  20 value 10.977926
## iter  30 value 7.128290
## iter  40 value 6.107837
## iter  50 value 5.809126
## iter  60 value 5.281913
## iter  70 value 4.288907
## iter  80 value 4.201779
## iter  90 value 4.104369
## iter 100 value 4.049056
## final  value 4.049056 
## stopped after 100 iterations
## # weights:  83
## initial  value 323.262182 
## iter  10 value 60.163601
## iter  20 value 44.056949
## iter  30 value 26.649437
## iter  40 value 21.997374
## iter  50 value 18.009073
## iter  60 value 17.793057
## iter  70 value 17.761880
## final  value 17.761733 
## converged
## # weights:  247
## initial  value 372.285214 
## iter  10 value 55.798318
## iter  20 value 31.962935
## iter  30 value 20.345140
## iter  40 value 14.905113
## iter  50 value 11.687984
## iter  60 value 10.632952
## iter  70 value 9.516863
## iter  80 value 9.431740
## iter  90 value 9.390572
## iter 100 value 9.380124
## final  value 9.380124 
## stopped after 100 iterations
## # weights:  411
## initial  value 376.085206 
## iter  10 value 39.065641
## iter  20 value 17.421265
## iter  30 value 10.495045
## iter  40 value 9.021282
## iter  50 value 8.560702
## iter  60 value 8.172413
## iter  70 value 8.049999
## iter  80 value 8.014558
## iter  90 value 7.940663
## iter 100 value 7.931032
## final  value 7.931032 
## stopped after 100 iterations
## # weights:  83
## initial  value 322.535661 
## iter  10 value 122.153090
## iter  20 value 56.929131
## iter  30 value 54.060473
## iter  40 value 53.813181
## iter  50 value 53.797633
## iter  60 value 45.570084
## iter  70 value 45.503720
## iter  80 value 45.493266
## iter  90 value 45.477563
## iter 100 value 45.473520
## final  value 45.473520 
## stopped after 100 iterations
## # weights:  247
## initial  value 397.872155 
## iter  10 value 54.565581
## iter  20 value 22.253059
## iter  30 value 19.972021
## iter  40 value 19.219221
## iter  50 value 17.335114
## iter  60 value 15.985356
## iter  70 value 15.180176
## iter  80 value 13.201614
## iter  90 value 11.856907
## iter 100 value 11.750346
## final  value 11.750346 
## stopped after 100 iterations
## # weights:  411
## initial  value 561.600994 
## iter  10 value 52.599108
## iter  20 value 34.432850
## iter  30 value 24.418149
## iter  40 value 21.916167
## iter  50 value 18.118324
## iter  60 value 17.493165
## iter  70 value 17.251588
## iter  80 value 12.592056
## iter  90 value 12.508752
## iter 100 value 11.464474
## final  value 11.464474 
## stopped after 100 iterations
## # weights:  83
## initial  value 354.058624 
## iter  10 value 82.818918
## iter  20 value 49.597236
## iter  30 value 47.014268
## iter  40 value 44.293882
## iter  50 value 44.292673
## final  value 44.292669 
## converged
## # weights:  247
## initial  value 401.520483 
## iter  10 value 52.580346
## iter  20 value 44.164039
## iter  30 value 43.851428
## iter  40 value 43.547275
## iter  50 value 42.289079
## iter  60 value 24.399163
## iter  70 value 24.291788
## iter  80 value 24.291102
## iter  90 value 23.766790
## iter 100 value 23.201467
## final  value 23.201467 
## stopped after 100 iterations
## # weights:  411
## initial  value 338.459032 
## iter  10 value 13.455666
## iter  20 value 5.730719
## iter  30 value 2.609874
## iter  40 value 0.529181
## iter  50 value 0.072542
## iter  60 value 0.038645
## iter  70 value 0.015284
## iter  80 value 0.008681
## iter  90 value 0.005231
## iter 100 value 0.002313
## final  value 0.002313 
## stopped after 100 iterations
## # weights:  83
## initial  value 410.865962 
## iter  10 value 57.062412
## iter  20 value 43.715098
## iter  30 value 28.810783
## iter  40 value 24.319874
## iter  50 value 22.247424
## iter  60 value 22.080214
## iter  70 value 22.040223
## iter  80 value 22.038917
## final  value 22.038874 
## converged
## # weights:  247
## initial  value 416.861767 
## iter  10 value 73.805160
## iter  20 value 41.514330
## iter  30 value 22.890348
## iter  40 value 13.527510
## iter  50 value 10.968948
## iter  60 value 10.780554
## iter  70 value 10.711860
## iter  80 value 10.705957
## iter  90 value 10.705846
## final  value 10.705846 
## converged
## # weights:  411
## initial  value 477.971849 
## iter  10 value 42.255813
## iter  20 value 21.827884
## iter  30 value 13.381926
## iter  40 value 10.538449
## iter  50 value 9.395567
## iter  60 value 8.873526
## iter  70 value 8.850700
## iter  80 value 8.849011
## iter  90 value 8.838002
## iter 100 value 8.837809
## final  value 8.837809 
## stopped after 100 iterations
## # weights:  83
## initial  value 396.230062 
## iter  10 value 92.549094
## iter  20 value 85.267300
## iter  30 value 81.047186
## iter  40 value 65.436824
## iter  50 value 59.648158
## iter  60 value 57.208582
## iter  70 value 57.154329
## iter  80 value 49.789382
## iter  90 value 49.639709
## iter 100 value 46.734005
## final  value 46.734005 
## stopped after 100 iterations
## # weights:  247
## initial  value 355.356394 
## iter  10 value 15.714548
## iter  20 value 7.769944
## iter  30 value 4.961588
## iter  40 value 2.444974
## iter  50 value 2.026529
## iter  60 value 1.508253
## iter  70 value 1.499693
## iter  80 value 1.494430
## iter  90 value 1.492026
## iter 100 value 1.484937
## final  value 1.484937 
## stopped after 100 iterations
## # weights:  411
## initial  value 473.863179 
## iter  10 value 20.999530
## iter  20 value 9.411438
## iter  30 value 3.938762
## iter  40 value 0.328262
## iter  50 value 0.252739
## iter  60 value 0.233742
## iter  70 value 0.209812
## iter  80 value 0.180023
## iter  90 value 0.153013
## iter 100 value 0.137071
## final  value 0.137071 
## stopped after 100 iterations
## # weights:  83
## initial  value 387.405134 
## iter  10 value 60.408721
## iter  20 value 42.492214
## iter  30 value 42.479378
## iter  40 value 42.478194
## iter  50 value 42.477730
## iter  60 value 42.477547
## final  value 42.477518 
## converged
## # weights:  247
## initial  value 309.022663 
## iter  10 value 25.117165
## iter  20 value 10.837833
## iter  30 value 5.892461
## iter  40 value 4.741928
## iter  50 value 4.087751
## iter  60 value 3.740920
## iter  70 value 3.740727
## iter  80 value 3.739988
## iter  90 value 3.735739
## iter 100 value 3.674024
## final  value 3.674024 
## stopped after 100 iterations
## # weights:  411
## initial  value 368.740002 
## iter  10 value 14.688377
## iter  20 value 7.322897
## iter  30 value 3.410640
## iter  40 value 0.333145
## iter  50 value 0.087230
## iter  60 value 0.005537
## iter  70 value 0.001141
## iter  80 value 0.000333
## iter  90 value 0.000230
## final  value 0.000048 
## converged
## # weights:  83
## initial  value 374.142076 
## iter  10 value 98.540896
## iter  20 value 60.425446
## iter  30 value 49.331192
## iter  40 value 37.872014
## iter  50 value 30.274757
## iter  60 value 27.060118
## iter  70 value 19.598644
## iter  80 value 18.412265
## iter  90 value 18.365587
## iter 100 value 18.365182
## final  value 18.365182 
## stopped after 100 iterations
## # weights:  247
## initial  value 357.808510 
## iter  10 value 64.071346
## iter  20 value 30.160775
## iter  30 value 16.472261
## iter  40 value 15.442750
## iter  50 value 15.049575
## iter  60 value 14.541144
## iter  70 value 14.192301
## iter  80 value 14.163769
## iter  90 value 14.160280
## iter 100 value 14.159773
## final  value 14.159773 
## stopped after 100 iterations
## # weights:  411
## initial  value 380.822714 
## iter  10 value 31.802105
## iter  20 value 13.648664
## iter  30 value 11.640508
## iter  40 value 11.088365
## iter  50 value 10.548592
## iter  60 value 10.350074
## iter  70 value 10.162652
## iter  80 value 10.117457
## iter  90 value 10.111842
## iter 100 value 10.111584
## final  value 10.111584 
## stopped after 100 iterations
## # weights:  83
## initial  value 320.723752 
## iter  10 value 87.403297
## iter  20 value 71.934166
## iter  30 value 67.211392
## iter  40 value 67.123223
## iter  50 value 62.967114
## iter  60 value 61.360763
## iter  70 value 60.122569
## iter  80 value 57.245425
## iter  90 value 57.138387
## iter 100 value 54.145247
## final  value 54.145247 
## stopped after 100 iterations
## # weights:  247
## initial  value 336.570493 
## iter  10 value 89.665490
## iter  20 value 61.215552
## iter  30 value 55.193924
## iter  40 value 46.617195
## iter  50 value 43.178705
## iter  60 value 39.931395
## iter  70 value 39.216842
## iter  80 value 38.408513
## iter  90 value 38.029687
## iter 100 value 37.352159
## final  value 37.352159 
## stopped after 100 iterations
## # weights:  411
## initial  value 321.404772 
## iter  10 value 10.653765
## iter  20 value 1.374470
## iter  30 value 0.216181
## iter  40 value 0.164565
## iter  50 value 0.157599
## iter  60 value 0.146277
## iter  70 value 0.127290
## iter  80 value 0.110938
## iter  90 value 0.098501
## iter 100 value 0.090566
## final  value 0.090566 
## stopped after 100 iterations
## # weights:  83
## initial  value 338.514473 
## iter  10 value 56.507454
## iter  20 value 51.076010
## iter  30 value 48.270942
## final  value 48.269303 
## converged
## # weights:  247
## initial  value 349.784766 
## iter  10 value 96.758746
## iter  20 value 31.132871
## iter  30 value 27.956879
## iter  40 value 26.395283
## iter  50 value 20.007069
## iter  60 value 18.469410
## iter  70 value 15.924356
## iter  80 value 15.402755
## iter  90 value 15.387993
## iter 100 value 14.884795
## final  value 14.884795 
## stopped after 100 iterations
## # weights:  411
## initial  value 351.972270 
## iter  10 value 26.852174
## iter  20 value 10.721950
## iter  30 value 9.187464
## iter  40 value 6.531935
## iter  50 value 6.490965
## iter  60 value 6.488084
## iter  70 value 6.314290
## iter  80 value 6.313104
## iter  90 value 6.311048
## iter 100 value 6.099418
## final  value 6.099418 
## stopped after 100 iterations
## # weights:  83
## initial  value 336.057771 
## iter  10 value 61.260298
## iter  20 value 44.116564
## iter  30 value 33.792561
## iter  40 value 28.634926
## iter  50 value 24.658789
## iter  60 value 18.839327
## iter  70 value 18.160666
## iter  80 value 18.103549
## iter  90 value 18.100172
## final  value 18.100125 
## converged
## # weights:  247
## initial  value 342.974309 
## iter  10 value 62.363716
## iter  20 value 30.056188
## iter  30 value 15.649794
## iter  40 value 10.799323
## iter  50 value 10.173413
## iter  60 value 10.048488
## iter  70 value 10.009948
## iter  80 value 9.909757
## iter  90 value 9.784249
## iter 100 value 9.771721
## final  value 9.771721 
## stopped after 100 iterations
## # weights:  411
## initial  value 303.172347 
## iter  10 value 50.556819
## iter  20 value 23.236861
## iter  30 value 14.092728
## iter  40 value 10.819680
## iter  50 value 9.716288
## iter  60 value 9.384775
## iter  70 value 9.161705
## iter  80 value 9.132781
## iter  90 value 9.125010
## iter 100 value 9.119344
## final  value 9.119344 
## stopped after 100 iterations
## # weights:  83
## initial  value 361.122998 
## iter  10 value 91.095770
## iter  20 value 54.426037
## iter  30 value 38.921620
## iter  40 value 35.940673
## iter  50 value 33.059171
## iter  60 value 33.046771
## iter  70 value 29.582029
## iter  80 value 29.567843
## iter  90 value 29.551815
## iter 100 value 29.540251
## final  value 29.540251 
## stopped after 100 iterations
## # weights:  247
## initial  value 339.376525 
## iter  10 value 48.665472
## iter  20 value 40.885051
## iter  30 value 38.486177
## iter  40 value 33.928778
## iter  50 value 28.696272
## iter  60 value 26.159312
## iter  70 value 25.752740
## iter  80 value 25.740857
## iter  90 value 25.587843
## iter 100 value 25.541767
## final  value 25.541767 
## stopped after 100 iterations
## # weights:  411
## initial  value 370.812423 
## iter  10 value 38.404154
## iter  20 value 26.429971
## iter  30 value 17.793763
## iter  40 value 12.636892
## iter  50 value 11.713392
## iter  60 value 4.036862
## iter  70 value 2.804308
## iter  80 value 2.187357
## iter  90 value 1.820133
## iter 100 value 1.584535
## final  value 1.584535 
## stopped after 100 iterations
## # weights:  83
## initial  value 329.216565 
## iter  10 value 55.114769
## iter  20 value 48.285661
## iter  30 value 42.490577
## iter  40 value 42.478771
## iter  50 value 42.477876
## iter  60 value 42.477543
## iter  70 value 42.477409
## final  value 42.477399 
## converged
## # weights:  247
## initial  value 373.613887 
## iter  10 value 229.441676
## iter  20 value 50.604305
## iter  30 value 47.016093
## iter  40 value 46.142710
## iter  50 value 45.989164
## iter  60 value 45.817925
## iter  70 value 45.698441
## iter  80 value 45.089649
## iter  90 value 45.088253
## iter 100 value 45.088090
## final  value 45.088090 
## stopped after 100 iterations
## # weights:  411
## initial  value 342.019939 
## iter  10 value 29.455498
## iter  20 value 16.760820
## iter  30 value 14.141542
## iter  40 value 13.208925
## iter  50 value 13.156474
## iter  60 value 12.985353
## iter  70 value 12.837134
## iter  80 value 11.570779
## iter  90 value 10.068192
## iter 100 value 8.789215
## final  value 8.789215 
## stopped after 100 iterations
## # weights:  83
## initial  value 352.148212 
## iter  10 value 94.332195
## iter  20 value 59.227890
## iter  30 value 44.431335
## iter  40 value 38.562176
## iter  50 value 32.055570
## iter  60 value 26.764239
## iter  70 value 22.785618
## iter  80 value 19.063101
## iter  90 value 18.404299
## iter 100 value 18.392684
## final  value 18.392684 
## stopped after 100 iterations
## # weights:  247
## initial  value 341.524464 
## iter  10 value 104.640464
## iter  20 value 74.413079
## iter  30 value 33.840626
## iter  40 value 17.374273
## iter  50 value 12.297783
## iter  60 value 10.629558
## iter  70 value 10.470805
## iter  80 value 10.431214
## iter  90 value 10.421969
## final  value 10.421927 
## converged
## # weights:  411
## initial  value 319.845159 
## iter  10 value 42.133951
## iter  20 value 15.831626
## iter  30 value 11.177438
## iter  40 value 9.639678
## iter  50 value 9.164601
## iter  60 value 9.100559
## iter  70 value 9.090308
## iter  80 value 9.088008
## final  value 9.087990 
## converged
## # weights:  83
## initial  value 374.859551 
## iter  10 value 53.463529
## iter  20 value 45.496281
## iter  30 value 45.488603
## iter  40 value 42.685227
## iter  50 value 42.531831
## iter  60 value 42.525883
## iter  70 value 42.517581
## iter  80 value 39.718228
## iter  90 value 39.466543
## iter 100 value 39.463263
## final  value 39.463263 
## stopped after 100 iterations
## # weights:  247
## initial  value 322.484274 
## iter  10 value 98.408016
## iter  20 value 97.647559
## final  value 97.647525 
## converged
## # weights:  411
## initial  value 440.471666 
## iter  10 value 34.426591
## iter  20 value 15.391160
## iter  30 value 12.395896
## iter  40 value 11.303793
## iter  50 value 8.045107
## iter  60 value 6.685209
## iter  70 value 5.035030
## iter  80 value 4.066666
## iter  90 value 4.057623
## iter 100 value 4.038722
## final  value 4.038722 
## stopped after 100 iterations
## # weights:  411
## initial  value 316.885830 
## iter  10 value 75.025675
## iter  20 value 24.511806
## iter  30 value 13.965069
## iter  40 value 10.655274
## iter  50 value 9.985452
## iter  60 value 9.668410
## iter  70 value 9.600093
## iter  80 value 9.583957
## iter  90 value 9.447033
## iter 100 value 9.395517
## final  value 9.395517 
## stopped after 100 iterations
# Predicción en datos de entrenamiento y prueba
resultado_entrenamiento5 <- predict(model5, entrenamiento)
resultado_prueba5 <- predict(model5, prueba)

# Matriz de Confusión
mcre5 <- confusionMatrix(resultado_entrenamiento, entrenamiento$Class)
mcre5
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 
mcrp5 <- confusionMatrix(resultado_prueba, prueba$Class)
mcrp5
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 

6. Modelo con el método rf

# Define la cuadrícula de sintonización para el parámetro cp
#tuneGrid <- expand.grid(cp = 0.01)

# Entrenamiento del modelo
model6 <- train(Class ~ ., 
                data = entrenamiento,
                method = "rf", 
                preProcess = c("scale", "center"),
                trControl = trainControl(method = "cv", number = 10),
                tuneGrid =expand.grid(mtry = c(2,4,6)) 
)
## Warning in preProcess.default(thresh = 0.95, k = 5, freqCut = 19, uniqueCut =
## 10, : These variables have zero variances: Mitoses6

## Warning in preProcess.default(thresh = 0.95, k = 5, freqCut = 19, uniqueCut =
## 10, : These variables have zero variances: Mitoses6

## Warning in preProcess.default(thresh = 0.95, k = 5, freqCut = 19, uniqueCut =
## 10, : These variables have zero variances: Mitoses6
# Predicción en datos de entrenamiento y prueba
resultado_entrenamiento6 <- predict(model6, entrenamiento)
resultado_prueba6 <- predict(model6, prueba)

# Matriz de Confusión
mcre6 <- confusionMatrix(resultado_entrenamiento, entrenamiento$Class)
mcre6
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 
mcrp6 <- confusionMatrix(resultado_prueba, prueba$Class)
mcrp6
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       357         3
##   malignant      0       188
##                                           
##                Accuracy : 0.9945          
##                  95% CI : (0.9841, 0.9989)
##     No Information Rate : 0.6515          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9879          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9843          
##          Pos Pred Value : 0.9917          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.6515          
##          Detection Rate : 0.6515          
##    Detection Prevalence : 0.6569          
##       Balanced Accuracy : 0.9921          
##                                           
##        'Positive' Class : benign          
## 

Resumen de Resultados

resultados <- data.frame(
  "svmLinear" = c(mcre$overall["Accuracy"], mcrp$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("Precisión de entrenamiento", "Precisión de prueba")
resultados
##                            svmLinear svmRadial   svmPoly     rpart      nnet
## Precisión de entrenamiento 0.9945255 0.9945255 0.9945255 0.9945255 0.9945255
## Precisión de prueba        0.9945255 0.9945255 0.9945255 0.9945255 0.9945255
##                                   rf
## Precisión de entrenamiento 0.9945255
## Precisión de prueba        0.9945255

Conclusiones

El modelo con el método de bosques aleatorios presenta sobreajustes, ya que tiene una alta precisión en entrenamiento, pero baja en prueba.

Acorde al resumen de resultados, el mejor modelo es el de Máquina de Vectores de Soporte Lineal.

LS0tCnRpdGxlOiAiTWFjaGluZSBMZWFybmluZzogQnJlYXN0IENhbmNlciIKYXV0aG9yOiAiR2VuYXJvIFJvZHLDrWd1ZXogQWxjw6FudGFyYSAtIEEwMDgzMzE3MiIKZGF0ZTogIjIwMjQtMDItMjkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCi0tLQoKIVtdKC9Vc2Vycy9nZW5hcm9yb2RyaWd1ZXphbGNhbnRhcmEvRGVza3RvcC9UZWMvQUkgLSBDb25jZW50cmFjaW/MgW4vTW/MgWR1bG8gMiAtIE1hY2hpbmUgTGVhcm5pbmcvQkQvUHVycGxlLUdvZXMtV2l0aC1Zb3VyLVBpbmstUmliYm9uLURvbWVzdGljLVZpb2xlbmNlLUlzLWEtV29tZW5zLUhlYWx0aC1Jc3N1ZS5naWYpCgojIFRlb3LDrWEKTGEgZnVuY2nDs24gKmNhcmV0IChDbGFzaWZpY2F0aW9uIEFuZCBSZWdyZXNzaW9uIFRyYWluaW5nKSogZXMgdW4gcGFxdWV0ZSBpbnRlZ3JhbCBjb24gdW5hIGFtcGxpYSB2YXJpZWRhZCBkZSBhbGdvcml0bW9zIHBhcmEgZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28uCgojIEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpICMgQWxnb3JpdG1vcyBkZSBhcHJlbmRpemFqZSBhdXRvbcOhdGljbwojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICMgR3LDoWZpY2FzIGNvbiBtZWpvciBkaXNlw7FvCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShtbGJlbmNoKQojaW5zdGFsbC5wYWNrYWdlcygibGF0dGljZSIpICMgQ3JlYXIgZ3LDoWZpY29zCmxpYnJhcnkobGF0dGljZSkKI2luc3RhbGwucGFja2FnZXMoImRhdGFzZXRzIikgIyBVc2FyIGxhIGJhc2UgZGUgZGF0b3MgIklyaXMiCmxpYnJhcnkoZGF0YXNldHMpCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQpsaWJyYXJ5KGNhcmV0KQpgYGAKCgoKIyBDcmVhciBiYXNlIGRlIGRhdG9zCmBgYHtyfQpkYXRhKEJyZWFzdENhbmNlcikKZGYgPC0gQnJlYXN0Q2FuY2VyCmRmJENsYXNzIDwtIGFzLmZhY3RvcihkZiRDbGFzcykKCmBgYAoKIyBBbsOhbGlzaXMgZXhwbG9yYXRvcmlvCmBgYHtyfQpzdW1tYXJ5KGRmKQpzdHIoZGYpCmNyZWF0ZV9yZXBvcnQoZGYpCnBsb3RfbWlzc2luZyhkZikKI3Bsb3RfaGlzdG9ncmFtKGRmKQpwbG90X2NvcnJlbGF0aW9uKGRmKQpgYGAKCioqIE5vdGE6IExhIHZhcmlhYmxlIHF1ZSBxdWVyZW1vcyBwcmVkZWNpciBkZWJlIHRlbmVyIGZvcm1hdG8gZGUgRkFDVE9SKioKCiMgUGFydGlyIGRhdG9zIDgwLTIwCmBgYHtyfQojIEVsaW1pbmFyIGxhIGNvbHVtbmEgSUQgZGVsIGRhdGEgZnJhbWUgZGYKZGYgPC0gZGZbLCAhbmFtZXMoZGYpICVpbiUgIklkIl0KCnNldC5zZWVkKDEyMykKCnJlbmdsb25lc19lbnRyZW5hbWllbnRvIDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oZGYkQ2xhc3MsIHAgPSAwLjgsIGxpc3QgPSBGQUxTRSkKZW50cmVuYW1pZW50byA8LSBkZltyZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQpwcnVlYmEgPC0gZGZbLXJlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdCgojIFZlcmlmaWNhciBzaSBoYXkgdmFsb3JlcyBmYWx0YW50ZXMgZW4gZWwgY29uanVudG8gZGUgZW50cmVuYW1pZW50bwphbnlOQShlbnRyZW5hbWllbnRvKQpzdW0oaXMubmEoZW50cmVuYW1pZW50bykpCiMgRWxpbWluYXIgZmlsYXMgY29uIHZhbG9yZXMgZmFsdGFudGVzCmVudHJlbmFtaWVudG8gPC0gbmEub21pdChlbnRyZW5hbWllbnRvKQpwcnVlYmEgPC0gbmEub21pdChlbnRyZW5hbWllbnRvKQoKYGBgCgojIERpc3RpbnRvcyB0aXBvcyBkZSBNw6l0b2RvcyBwYXJhIE1vZGVsYXIKTG9zIG3DqXRvZG9zIG3DoXMgdXRpbGl6YWRvcyBwYXJhIG1vZWxhciBhcHJlbmRpemFqZSBhdXRvbcOhdGljbyBzb246CgoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUuCkhheSB2YXJpb3Mgc3VidGlwb3M6IExpbmVhIChzdm1MaW5lYWwpbSBSYWRpYWwgKHN2bVJhZGlhbCksIFBvbGluw7NtaWNvIChzdm1Qb2x5KSwgZXRjLgoKKiAqKsOBcmJvbCBkZSBEZWNpc2nDs24qKjogcnBhcnQKKiAqKlJlZGVzIE5ldXJvbmFsZXMqKjogbm5ldAoqICoqUmFuZG9tIEZvcmVzdCoqIG8gQm9zcXVlcyBBbGVhdG9yaW9zOiByZgoKIyAxLiBNb2RlbG8gY29uIGVsIG3DqXRvZG8gc3ZtTGluZWFsCmBgYHtyfQojIERlZmluZSBsYSBjdWFkcsOtY3VsYSBkZSBzaW50b25pemFjacOzbiBwYXJhIGVsIHBhcsOhbWV0cm8gQwojIERlZmluZSBsYSBjdWFkcsOtY3VsYSBkZSBzaW50b25pemFjacOzbiBwYXJhIGVsIHBhcsOhbWV0cm8gQwp0dW5lR3JpZCA8LSBleHBhbmQuZ3JpZChDID0gYygwLjEsIDEsIDEwLCAxMDApKQoKIyBFbnRyZW5hbWllbnRvIGRlbCBtb2RlbG8KbW9kZWxvIDwtIHRyYWluKENsYXNzIH4gLiwgCiAgICAgICAgICAgICAgICBkYXRhID0gZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1MaW5lYXIiLAogICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwgImNlbnRlciIpLAogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsIG51bWJlciA9IDEwKSwKICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gdHVuZUdyaWQKKQoKCiMgUHJlZGljY2nDs24gZW4gZGF0b3MgZGUgZW50cmVuYW1pZW50byB5IHBydWViYQpyZXN1bHRhZG9fZW50cmVuYW1pZW50byA8LSBwcmVkaWN0KG1vZGVsbywgZW50cmVuYW1pZW50bykKcmVzdWx0YWRvX3BydWViYSA8LSBwcmVkaWN0KG1vZGVsbywgcHJ1ZWJhKQoKIyBNYXRyaXogZGUgQ29uZnVzacOzbgptY3JlIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bywgZW50cmVuYW1pZW50byRDbGFzcykKbWNyZQptY3JwIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhLCBwcnVlYmEkQ2xhc3MpCm1jcnAKYGBgCgojIDIuIE1vZGVsbyBjb24gZWwgbcOpdG9kbyBzdm1SYWRpYWwKYGBge3J9CiMgRGVmaW5lIGxhIGN1YWRyw61jdWxhIGRlIHNpbnRvbml6YWNpw7NuIHBhcmEgbG9zIHBhcsOhbWV0cm9zIHNpZ21hIHkgQwp0dW5lR3JpZCA8LSBleHBhbmQuZ3JpZChzaWdtYSA9IDAuMSwgQyA9IDEpCgojIEVudHJlbmFtaWVudG8gZGVsIG1vZGVsbwptb2RlbDIgPC0gdHJhaW4oQ2xhc3MgfiAuLCAKICAgICAgICAgICAgICAgIGRhdGEgPSBlbnRyZW5hbWllbnRvLAogICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bVJhZGlhbCIsIAogICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwgImNlbnRlciIpLAogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsIG51bWJlciA9IDEwKSwKICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gdHVuZUdyaWQKKQoKIyBQcmVkaWNjacOzbiBlbiBkYXRvcyBkZSBlbnRyZW5hbWllbnRvIHkgcHJ1ZWJhCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMiA8LSBwcmVkaWN0KG1vZGVsMiwgZW50cmVuYW1pZW50bykKcmVzdWx0YWRvX3BydWViYTIgPC0gcHJlZGljdChtb2RlbDIsIHBydWViYSkKCiMgTWF0cml6IGRlIENvbmZ1c2nDs24KbWNyZTIgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvLCBlbnRyZW5hbWllbnRvJENsYXNzKQptY3JlMgoKbWNycDIgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmEsIHBydWViYSRDbGFzcykKbWNycDIKYGBgCgojIDMuIE1vZGVsbyBjb24gZWwgbcOpdG9kbyBzdm1Qb2x5CmBgYHtyfQojIERlZmluZSBsYSBjdWFkcsOtY3VsYSBkZSBzaW50b25pemFjacOzbiBwYXJhIGxvcyBwYXLDoW1ldHJvcyBkZWdyZWUsIHNjYWxlIHkgQwp0dW5lR3JpZCA8LSBleHBhbmQuZ3JpZChkZWdyZWUgPSAxLCBzY2FsZSA9IDEsIEMgPSAxKQoKIyBFbnRyZW5hbWllbnRvIGRlbCBtb2RlbG8KbW9kZWwzIDwtIHRyYWluKENsYXNzIH4gLiwgCiAgICAgICAgICAgICAgICBkYXRhID0gZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1Qb2x5IiwgCiAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCAiY2VudGVyIiksCiAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyID0gMTApLAogICAgICAgICAgICAgICAgdHVuZUdyaWQgPSB0dW5lR3JpZAopCgojIFByZWRpY2Npw7NuIGVuIGRhdG9zIGRlIGVudHJlbmFtaWVudG8geSBwcnVlYmEKcmVzdWx0YWRvX2VudHJlbmFtaWVudG8zIDwtIHByZWRpY3QobW9kZWwzLCBlbnRyZW5hbWllbnRvKQpyZXN1bHRhZG9fcHJ1ZWJhMyA8LSBwcmVkaWN0KG1vZGVsMywgcHJ1ZWJhKQoKIyBNYXRyaXogZGUgQ29uZnVzacOzbgptY3JlMyA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8sIGVudHJlbmFtaWVudG8kQ2xhc3MpCm1jcmUzCm1jcnAzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhLCBwcnVlYmEkQ2xhc3MpCm1jcnAzCmBgYAoKIyA0LiBNb2RlbG8gY29uIGVsIG3DqXRvZG8gcnBhcnQKYGBge3J9CiMgRGVmaW5lIGxhIGN1YWRyw61jdWxhIGRlIHNpbnRvbml6YWNpw7NuIHBhcmEgZWwgcGFyw6FtZXRybyBjcAojdHVuZUdyaWQgPC0gZXhwYW5kLmdyaWQoY3AgPSAwLjAxKQoKIyBFbnRyZW5hbWllbnRvIGRlbCBtb2RlbG8KbW9kZWw0IDwtIHRyYWluKENsYXNzIH4gLiwgCiAgICAgICAgICAgICAgICBkYXRhID0gZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJycGFydCIsIAogICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwgImNlbnRlciIpLAogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsIG51bWJlciA9IDEwKSwKICAgICAgICAgICAgICAgIHR1bmVMZW5ndGggPSAKKQoKIyBQcmVkaWNjacOzbiBlbiBkYXRvcyBkZSBlbnRyZW5hbWllbnRvIHkgcHJ1ZWJhCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNCA8LSBwcmVkaWN0KG1vZGVsNCwgZW50cmVuYW1pZW50bykKcmVzdWx0YWRvX3BydWViYTQgPC0gcHJlZGljdChtb2RlbDQsIHBydWViYSkKCiMgTWF0cml6IGRlIENvbmZ1c2nDs24KbWNyZTQgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvLCBlbnRyZW5hbWllbnRvJENsYXNzKQptY3JlNAptY3JwNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYSwgcHJ1ZWJhJENsYXNzKQptY3JwNApgYGAKCiMgNS4gTW9kZWxvIGNvbiBlbCBtw6l0b2RvIG5uZXQKYGBge3J9CiMgRGVmaW5lIGxhIGN1YWRyw61jdWxhIGRlIHNpbnRvbml6YWNpw7NuIHBhcmEgZWwgcGFyw6FtZXRybyBjcAojdHVuZUdyaWQgPC0gZXhwYW5kLmdyaWQoY3AgPSAwLjAxKQoKIyBFbnRyZW5hbWllbnRvIGRlbCBtb2RlbG8KbW9kZWw1IDwtIHRyYWluKENsYXNzIH4gLiwgCiAgICAgICAgICAgICAgICBkYXRhID0gZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJubmV0IiwgCiAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCAiY2VudGVyIiksCiAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyID0gMTApCiAgICAgICAgICAgICAgICAKKQoKIyBQcmVkaWNjacOzbiBlbiBkYXRvcyBkZSBlbnRyZW5hbWllbnRvIHkgcHJ1ZWJhCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSA8LSBwcmVkaWN0KG1vZGVsNSwgZW50cmVuYW1pZW50bykKcmVzdWx0YWRvX3BydWViYTUgPC0gcHJlZGljdChtb2RlbDUsIHBydWViYSkKCiMgTWF0cml6IGRlIENvbmZ1c2nDs24KbWNyZTUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvLCBlbnRyZW5hbWllbnRvJENsYXNzKQptY3JlNQptY3JwNSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYSwgcHJ1ZWJhJENsYXNzKQptY3JwNQpgYGAKCiMgNi4gTW9kZWxvIGNvbiBlbCBtw6l0b2RvIHJmCmBgYHtyfQojIERlZmluZSBsYSBjdWFkcsOtY3VsYSBkZSBzaW50b25pemFjacOzbiBwYXJhIGVsIHBhcsOhbWV0cm8gY3AKI3R1bmVHcmlkIDwtIGV4cGFuZC5ncmlkKGNwID0gMC4wMSkKCiMgRW50cmVuYW1pZW50byBkZWwgbW9kZWxvCm1vZGVsNiA8LSB0cmFpbihDbGFzcyB+IC4sIAogICAgICAgICAgICAgICAgZGF0YSA9IGVudHJlbmFtaWVudG8sCiAgICAgICAgICAgICAgICBtZXRob2QgPSAicmYiLCAKICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsICJjZW50ZXIiKSwKICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCksCiAgICAgICAgICAgICAgICB0dW5lR3JpZCA9ZXhwYW5kLmdyaWQobXRyeSA9IGMoMiw0LDYpKSAKKQoKIyBQcmVkaWNjacOzbiBlbiBkYXRvcyBkZSBlbnRyZW5hbWllbnRvIHkgcHJ1ZWJhCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNiA8LSBwcmVkaWN0KG1vZGVsNiwgZW50cmVuYW1pZW50bykKcmVzdWx0YWRvX3BydWViYTYgPC0gcHJlZGljdChtb2RlbDYsIHBydWViYSkKCiMgTWF0cml6IGRlIENvbmZ1c2nDs24KbWNyZTYgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvLCBlbnRyZW5hbWllbnRvJENsYXNzKQptY3JlNgptY3JwNiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYSwgcHJ1ZWJhJENsYXNzKQptY3JwNgpgYGAKCiMgUmVzdW1lbiBkZSBSZXN1bHRhZG9zCmBgYHtyfQpyZXN1bHRhZG9zIDwtIGRhdGEuZnJhbWUoCiAgInN2bUxpbmVhciIgPSBjKG1jcmUkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycCRvdmVyYWxsWyJBY2N1cmFjeSJdKSwKICAic3ZtUmFkaWFsIiA9IGMobWNyZTIkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDIkb3ZlcmFsbFsiQWNjdXJhY3kiXSksCiAgInN2bVBvbHkiID0gYyhtY3JlMyRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMyRvdmVyYWxsWyJBY2N1cmFjeSJdKSwKICAicnBhcnQiID0gYyhtY3JlNCRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNCRvdmVyYWxsWyJBY2N1cmFjeSJdKSwKICAibm5ldCIgPSBjKG1jcmU1JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA1JG92ZXJhbGxbIkFjY3VyYWN5Il0pLAogICJyZiIgPSBjKG1jcmU2JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA2JG92ZXJhbGxbIkFjY3VyYWN5Il0pCikKcm93bmFtZXMocmVzdWx0YWRvcykgPC0gYygiUHJlY2lzacOzbiBkZSBlbnRyZW5hbWllbnRvIiwgIlByZWNpc2nDs24gZGUgcHJ1ZWJhIikKcmVzdWx0YWRvcwoKYGBgCiMgQ29uY2x1c2lvbmVzCkVsIG1vZGVsbyBjb24gZWwgbcOpdG9kbyBkZSBib3NxdWVzIGFsZWF0b3Jpb3MgcHJlc2VudGEgc29icmVhanVzdGVzLCB5YSBxdWUgdGllbmUgdW5hIGFsdGEgcHJlY2lzacOzbiBlbiBlbnRyZW5hbWllbnRvLCBwZXJvIGJhamEgZW4gcHJ1ZWJhLgoKQWNvcmRlIGFsIHJlc3VtZW4gZGUgcmVzdWx0YWRvcywgZWwgbWVqb3IgbW9kZWxvIGVzIGVsIGRlICoqTcOhcXVpbmEgZGUgVmVjdG9yZXMgZGUgU29wb3J0ZSBMaW5lYWwqKi4K