Teoría

Es el paquete CARET (Classification and Regression Training), 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
library(caret)

#install.packages("ggplot2") # graficas
library(ggplot2)

#install.packages("lattice") #crear gráficos
library(lattice)

#install.packages("datasets") # usas datasets cargados
library(datasets)

#install.packages("DataExplorer") #análisis descriptivo
library(DataExplorer) 

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

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

#install.packages("readxl") # leer archivos de Excel
library(readxl)

Crear base de datos

# file.choose()
df <- read_excel("C:\\Users\\usuario1\\Downloads\\heart.xlsx")

# La variable que queremos predecir debe ser factor en modelos de clasificación
df$target <- as.factor(df$target)

Entender base de datos

summary(df)
##       age             sex               cp            trestbps    
##  Min.   :29.00   Min.   :0.0000   Min.   :0.0000   Min.   : 94.0  
##  1st Qu.:48.00   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:120.0  
##  Median :56.00   Median :1.0000   Median :1.0000   Median :130.0  
##  Mean   :54.43   Mean   :0.6956   Mean   :0.9424   Mean   :131.6  
##  3rd Qu.:61.00   3rd Qu.:1.0000   3rd Qu.:2.0000   3rd Qu.:140.0  
##  Max.   :77.00   Max.   :1.0000   Max.   :3.0000   Max.   :200.0  
##       chol          fbs            restecg          thalach     
##  Min.   :126   Min.   :0.0000   Min.   :0.0000   Min.   : 71.0  
##  1st Qu.:211   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:132.0  
##  Median :240   Median :0.0000   Median :1.0000   Median :152.0  
##  Mean   :246   Mean   :0.1493   Mean   :0.5298   Mean   :149.1  
##  3rd Qu.:275   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:166.0  
##  Max.   :564   Max.   :1.0000   Max.   :2.0000   Max.   :202.0  
##      exang           oldpeak          slope             ca        
##  Min.   :0.0000   Min.   :0.000   Min.   :0.000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.000   1st Qu.:1.000   1st Qu.:0.0000  
##  Median :0.0000   Median :0.800   Median :1.000   Median :0.0000  
##  Mean   :0.3366   Mean   :1.072   Mean   :1.385   Mean   :0.7541  
##  3rd Qu.:1.0000   3rd Qu.:1.800   3rd Qu.:2.000   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :6.200   Max.   :2.000   Max.   :4.0000  
##       thal       target 
##  Min.   :0.000   0:499  
##  1st Qu.:2.000   1:526  
##  Median :2.000          
##  Mean   :2.324          
##  3rd Qu.:3.000          
##  Max.   :3.000
str(df)
## tibble [1,025 × 14] (S3: tbl_df/tbl/data.frame)
##  $ age     : num [1:1025] 52 53 70 61 62 58 58 55 46 54 ...
##  $ sex     : num [1:1025] 1 1 1 1 0 0 1 1 1 1 ...
##  $ cp      : num [1:1025] 0 0 0 0 0 0 0 0 0 0 ...
##  $ trestbps: num [1:1025] 125 140 145 148 138 100 114 160 120 122 ...
##  $ chol    : num [1:1025] 212 203 174 203 294 248 318 289 249 286 ...
##  $ fbs     : num [1:1025] 0 1 0 0 1 0 0 0 0 0 ...
##  $ restecg : num [1:1025] 1 0 1 1 1 0 2 0 0 0 ...
##  $ thalach : num [1:1025] 168 155 125 161 106 122 140 145 144 116 ...
##  $ exang   : num [1:1025] 0 1 1 0 0 0 0 1 0 1 ...
##  $ oldpeak : num [1:1025] 1 3.1 2.6 0 1.9 1 4.4 0.8 0.8 3.2 ...
##  $ slope   : num [1:1025] 2 0 0 2 1 1 0 1 2 1 ...
##  $ ca      : num [1:1025] 2 0 0 1 3 0 3 1 0 2 ...
##  $ thal    : num [1:1025] 3 3 3 3 2 2 1 3 3 2 ...
##  $ target  : Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 1 1 1 ...
#create_report(df) 
plot_missing(df) # estos se hacen con dataexplorer

plot_histogram(df)

plot_correlation(df) 

NOTA: en modelos de clasificacion, la variable que queremos predecir debe tener formato de FACTOR

Partir la base de datos

# Normalmente 80-20 o 70-30
set.seed(123)
renglones_entrenamiento <- createDataPartition(df$target, p=0.8, list= FALSE) 
entrenamiento <- df[renglones_entrenamiento, ] #cuando despues de la coma no hay nada, considera todos los valores 
prueba <- df[-renglones_entrenamiento, ] 

Distintos tipos de 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 (svmLinear), Radial (svmRadial), Polinómico (svmPoly), etc.
  • Árbol de decisión: rpart
  • Random Forest o bosques aleatorios: rf

Modelo 1. SVM Lineal

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

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

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

#Matriz de confusion del resultado de entrenamiento 
mcre1 <- confusionMatrix(resultado_entrenamiento1, entrenamiento$target)
mcre1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 301  37
##          1  99 384
##                                           
##                Accuracy : 0.8343          
##                  95% CI : (0.8071, 0.8592)
##     No Information Rate : 0.5128          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.6672          
##                                           
##  Mcnemar's Test P-Value : 1.689e-07       
##                                           
##             Sensitivity : 0.7525          
##             Specificity : 0.9121          
##          Pos Pred Value : 0.8905          
##          Neg Pred Value : 0.7950          
##              Prevalence : 0.4872          
##          Detection Rate : 0.3666          
##    Detection Prevalence : 0.4117          
##       Balanced Accuracy : 0.8323          
##                                           
##        'Positive' Class : 0               
## 
#Matriz de confusion del resultado de la prueba
mcrp1 <- confusionMatrix(resultado_prueba1, prueba$target)
mcrp1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 78 10
##          1 21 95
##                                           
##                Accuracy : 0.848           
##                  95% CI : (0.7913, 0.8944)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.6948          
##                                           
##  Mcnemar's Test P-Value : 0.07249         
##                                           
##             Sensitivity : 0.7879          
##             Specificity : 0.9048          
##          Pos Pred Value : 0.8864          
##          Neg Pred Value : 0.8190          
##              Prevalence : 0.4853          
##          Detection Rate : 0.3824          
##    Detection Prevalence : 0.4314          
##       Balanced Accuracy : 0.8463          
##                                           
##        'Positive' Class : 0               
## 

Modelo 2. SVM Radial

modelo2 <- train(target~.,data = entrenamiento,
                 method="svmRadial", #Cambiar 
                 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 confusión 
# Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación

#Matriz de confusion del resultado de entrenamiento 
mcre2 <- confusionMatrix(resultado_entrenamiento2, entrenamiento$target)
mcre2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 400   0
##          1   0 421
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9955, 1)
##     No Information Rate : 0.5128     
##     P-Value [Acc > NIR] : < 2.2e-16  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 1.0000     
##              Prevalence : 0.4872     
##          Detection Rate : 0.4872     
##    Detection Prevalence : 0.4872     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : 0          
## 
#Matriz de confusion del resultado de la prueba
mcrp2 <- confusionMatrix(resultado_prueba2, prueba$target)
mcrp2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  99   0
##          1   0 105
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9821, 1)
##     No Information Rate : 0.5147     
##     P-Value [Acc > NIR] : < 2.2e-16  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 1.0000     
##              Prevalence : 0.4853     
##          Detection Rate : 0.4853     
##    Detection Prevalence : 0.4853     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : 0          
## 

Modelo 3. SVM Polinómico

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

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

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

#Matriz de confusion del resultado de entrenamiento 
mcre3 <- confusionMatrix(resultado_entrenamiento3, entrenamiento$target)
mcre3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 301  37
##          1  99 384
##                                           
##                Accuracy : 0.8343          
##                  95% CI : (0.8071, 0.8592)
##     No Information Rate : 0.5128          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.6672          
##                                           
##  Mcnemar's Test P-Value : 1.689e-07       
##                                           
##             Sensitivity : 0.7525          
##             Specificity : 0.9121          
##          Pos Pred Value : 0.8905          
##          Neg Pred Value : 0.7950          
##              Prevalence : 0.4872          
##          Detection Rate : 0.3666          
##    Detection Prevalence : 0.4117          
##       Balanced Accuracy : 0.8323          
##                                           
##        'Positive' Class : 0               
## 
#Matriz de confusion del resultado de la prueba
mcrp3 <- confusionMatrix(resultado_prueba3, prueba$target)
mcrp3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 78 10
##          1 21 95
##                                           
##                Accuracy : 0.848           
##                  95% CI : (0.7913, 0.8944)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.6948          
##                                           
##  Mcnemar's Test P-Value : 0.07249         
##                                           
##             Sensitivity : 0.7879          
##             Specificity : 0.9048          
##          Pos Pred Value : 0.8864          
##          Neg Pred Value : 0.8190          
##              Prevalence : 0.4853          
##          Detection Rate : 0.3824          
##    Detection Prevalence : 0.4314          
##       Balanced Accuracy : 0.8463          
##                                           
##        'Positive' Class : 0               
## 

Modelo 4. Árbol de decisión

modelo4 <- train(target~.,data = entrenamiento,
                 method="rpart", #Cambiar 
                 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 confusión 
# Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación

#Matriz de confusion del resultado de entrenamiento 
mcre4 <- confusionMatrix(resultado_entrenamiento4, entrenamiento$target)
mcre4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 360  29
##          1  40 392
##                                          
##                Accuracy : 0.916          
##                  95% CI : (0.8948, 0.934)
##     No Information Rate : 0.5128         
##     P-Value [Acc > NIR] : <2e-16         
##                                          
##                   Kappa : 0.8317         
##                                          
##  Mcnemar's Test P-Value : 0.2286         
##                                          
##             Sensitivity : 0.9000         
##             Specificity : 0.9311         
##          Pos Pred Value : 0.9254         
##          Neg Pred Value : 0.9074         
##              Prevalence : 0.4872         
##          Detection Rate : 0.4385         
##    Detection Prevalence : 0.4738         
##       Balanced Accuracy : 0.9156         
##                                          
##        'Positive' Class : 0              
## 
#Matriz de confusion del resultado de la prueba
mcrp4 <- confusionMatrix(resultado_prueba4, prueba$target)
mcrp4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 81  7
##          1 18 98
##                                           
##                Accuracy : 0.8775          
##                  95% CI : (0.8244, 0.9191)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.7539          
##                                           
##  Mcnemar's Test P-Value : 0.0455          
##                                           
##             Sensitivity : 0.8182          
##             Specificity : 0.9333          
##          Pos Pred Value : 0.9205          
##          Neg Pred Value : 0.8448          
##              Prevalence : 0.4853          
##          Detection Rate : 0.3971          
##    Detection Prevalence : 0.4314          
##       Balanced Accuracy : 0.8758          
##                                           
##        'Positive' Class : 0               
## 

Modelo 5. Bosques Aleatorios

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

resultado_entrenamiento5 <- predict(modelo5, entrenamiento)
resultado_prueba5 <- predict(modelo5,prueba) 

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

#Matriz de confusion del resultado de entrenamiento 
mcre5 <- confusionMatrix(resultado_entrenamiento5, entrenamiento$target)
mcre5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 400   0
##          1   0 421
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9955, 1)
##     No Information Rate : 0.5128     
##     P-Value [Acc > NIR] : < 2.2e-16  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 1.0000     
##              Prevalence : 0.4872     
##          Detection Rate : 0.4872     
##    Detection Prevalence : 0.4872     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : 0          
## 
#Matriz de confusion del resultado de la prueba
mcrp5 <- confusionMatrix(resultado_prueba5, prueba$target)
mcrp5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  99   0
##          1   0 105
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9821, 1)
##     No Information Rate : 0.5147     
##     P-Value [Acc > NIR] : < 2.2e-16  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 1.0000     
##              Prevalence : 0.4853     
##          Detection Rate : 0.4853     
##    Detection Prevalence : 0.4853     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : 0          
## 

Modelo 6. Redes neuronales

modelo6 <- train(target~.,data = entrenamiento,
                 method="nnet", #Cambiar 
                 preProcess= c("scale","center"),
                 trControl= trainControl(method = "cv", number = 10)
                 #Cambiar
                 ) 
## # weights:  16
## initial  value 540.324593 
## iter  10 value 317.878132
## iter  20 value 262.232999
## iter  30 value 253.860851
## iter  40 value 250.451133
## iter  50 value 245.192697
## iter  60 value 236.824289
## iter  70 value 232.410757
## iter  80 value 232.256369
## iter  90 value 232.217384
## iter 100 value 232.208757
## final  value 232.208757 
## stopped after 100 iterations
## # weights:  46
## initial  value 526.638545 
## iter  10 value 218.747384
## iter  20 value 170.338354
## iter  30 value 132.029166
## iter  40 value 110.763763
## iter  50 value 100.708242
## iter  60 value 96.770091
## iter  70 value 96.395587
## iter  80 value 96.357181
## final  value 96.356819 
## converged
## # weights:  76
## initial  value 579.278106 
## iter  10 value 239.398233
## iter  20 value 180.231232
## iter  30 value 141.869790
## iter  40 value 92.919961
## iter  50 value 75.958187
## iter  60 value 72.186273
## iter  70 value 66.127720
## iter  80 value 64.615123
## iter  90 value 63.941715
## iter 100 value 63.502334
## final  value 63.502334 
## stopped after 100 iterations
## # weights:  16
## initial  value 513.269741 
## iter  10 value 282.283472
## iter  20 value 260.136311
## iter  30 value 259.037873
## final  value 259.037566 
## converged
## # weights:  46
## initial  value 582.683111 
## iter  10 value 242.676448
## iter  20 value 225.216001
## iter  30 value 204.784653
## iter  40 value 193.242982
## iter  50 value 188.883345
## iter  60 value 187.076451
## iter  70 value 186.336833
## iter  80 value 186.180912
## iter  90 value 186.177279
## final  value 186.177142 
## converged
## # weights:  76
## initial  value 656.974283 
## iter  10 value 267.065687
## iter  20 value 228.212004
## iter  30 value 200.964174
## iter  40 value 175.348518
## iter  50 value 167.185553
## iter  60 value 158.081111
## iter  70 value 153.399381
## iter  80 value 151.821241
## iter  90 value 150.291401
## iter 100 value 149.775247
## final  value 149.775247 
## stopped after 100 iterations
## # weights:  16
## initial  value 516.957111 
## iter  10 value 261.500747
## iter  20 value 255.717949
## iter  30 value 254.340344
## iter  40 value 253.032245
## iter  50 value 252.725081
## iter  60 value 252.106899
## iter  70 value 251.997377
## iter  80 value 251.988920
## iter  90 value 251.982843
## iter 100 value 251.973744
## final  value 251.973744 
## stopped after 100 iterations
## # weights:  46
## initial  value 490.266186 
## iter  10 value 237.057964
## iter  20 value 196.884622
## iter  30 value 169.815977
## iter  40 value 142.013403
## iter  50 value 125.354020
## iter  60 value 122.925405
## iter  70 value 122.138001
## iter  80 value 121.797777
## iter  90 value 121.557784
## iter 100 value 121.352184
## final  value 121.352184 
## stopped after 100 iterations
## # weights:  76
## initial  value 527.329732 
## iter  10 value 218.656113
## iter  20 value 138.705428
## iter  30 value 108.757458
## iter  40 value 97.029515
## iter  50 value 92.442168
## iter  60 value 88.035112
## iter  70 value 87.448813
## iter  80 value 87.374907
## iter  90 value 87.304159
## iter 100 value 87.236276
## final  value 87.236276 
## stopped after 100 iterations
## # weights:  16
## initial  value 521.862375 
## iter  10 value 269.697214
## iter  20 value 265.635147
## iter  30 value 265.553222
## iter  40 value 265.311173
## iter  50 value 264.327972
## iter  60 value 263.936572
## iter  70 value 263.903465
## iter  80 value 263.860360
## iter  90 value 263.799820
## iter 100 value 263.790660
## final  value 263.790660 
## stopped after 100 iterations
## # weights:  46
## initial  value 581.496609 
## iter  10 value 250.133759
## iter  20 value 202.935440
## iter  30 value 168.983658
## iter  40 value 148.890379
## iter  50 value 138.096982
## iter  60 value 123.994486
## iter  70 value 118.480462
## iter  80 value 112.580930
## iter  90 value 111.565375
## iter 100 value 111.524615
## final  value 111.524615 
## stopped after 100 iterations
## # weights:  76
## initial  value 600.713333 
## iter  10 value 237.544465
## iter  20 value 162.121087
## iter  30 value 124.128066
## iter  40 value 103.915181
## iter  50 value 99.518687
## iter  60 value 94.943572
## iter  70 value 89.927939
## iter  80 value 88.609566
## iter  90 value 88.158551
## iter 100 value 87.322140
## final  value 87.322140 
## stopped after 100 iterations
## # weights:  16
## initial  value 564.911389 
## iter  10 value 275.271566
## iter  20 value 271.968184
## iter  30 value 270.034053
## final  value 269.979116 
## converged
## # weights:  46
## initial  value 492.540822 
## iter  10 value 269.768085
## iter  20 value 239.278806
## iter  30 value 232.810684
## iter  40 value 228.818724
## iter  50 value 228.247709
## iter  60 value 225.799098
## iter  70 value 221.124559
## iter  80 value 217.743839
## iter  90 value 215.397345
## iter 100 value 210.339628
## final  value 210.339628 
## stopped after 100 iterations
## # weights:  76
## initial  value 539.278726 
## iter  10 value 238.061314
## iter  20 value 187.190221
## iter  30 value 168.052597
## iter  40 value 157.224292
## iter  50 value 155.007379
## iter  60 value 153.769087
## iter  70 value 153.585096
## iter  80 value 153.555606
## iter  90 value 153.551240
## final  value 153.551169 
## converged
## # weights:  16
## initial  value 647.545792 
## iter  10 value 295.526855
## iter  20 value 269.604617
## iter  30 value 263.943856
## iter  40 value 255.725190
## iter  50 value 249.448512
## iter  60 value 241.807156
## iter  70 value 240.517853
## iter  80 value 240.485586
## final  value 240.484969 
## converged
## # weights:  46
## initial  value 464.098198 
## iter  10 value 243.068614
## iter  20 value 203.552817
## iter  30 value 188.390602
## iter  40 value 176.991536
## iter  50 value 175.639694
## iter  60 value 175.326836
## iter  70 value 175.105723
## iter  80 value 174.995917
## iter  90 value 174.771568
## iter 100 value 174.602245
## final  value 174.602245 
## stopped after 100 iterations
## # weights:  76
## initial  value 557.917358 
## iter  10 value 237.557129
## iter  20 value 185.661365
## iter  30 value 137.406099
## iter  40 value 88.309580
## iter  50 value 66.830474
## iter  60 value 60.519782
## iter  70 value 59.481399
## iter  80 value 58.893033
## iter  90 value 58.421316
## iter 100 value 58.353460
## final  value 58.353460 
## stopped after 100 iterations
## # weights:  16
## initial  value 534.121413 
## iter  10 value 307.817472
## iter  20 value 261.242502
## iter  30 value 257.801855
## iter  40 value 257.789536
## iter  50 value 257.326942
## iter  60 value 240.734217
## iter  70 value 239.696763
## iter  80 value 239.684309
## iter  90 value 239.683058
## iter 100 value 239.681627
## final  value 239.681627 
## stopped after 100 iterations
## # weights:  46
## initial  value 497.025209 
## iter  10 value 243.532006
## iter  20 value 195.220495
## iter  30 value 164.983049
## iter  40 value 154.476135
## iter  50 value 146.273765
## iter  60 value 145.864029
## iter  70 value 145.862760
## iter  70 value 145.862759
## iter  70 value 145.862759
## final  value 145.862759 
## converged
## # weights:  76
## initial  value 512.071434 
## iter  10 value 223.728008
## iter  20 value 135.153627
## iter  30 value 109.995352
## iter  40 value 99.804695
## iter  50 value 92.894990
## iter  60 value 85.595335
## iter  70 value 82.142688
## iter  80 value 81.638679
## iter  90 value 81.543028
## iter 100 value 81.541464
## final  value 81.541464 
## stopped after 100 iterations
## # weights:  16
## initial  value 537.307116 
## iter  10 value 296.977099
## iter  20 value 264.046553
## iter  30 value 262.745768
## final  value 262.734089 
## converged
## # weights:  46
## initial  value 525.815985 
## iter  10 value 311.794321
## iter  20 value 240.542519
## iter  30 value 215.745411
## iter  40 value 194.991024
## iter  50 value 182.145501
## iter  60 value 179.845639
## iter  70 value 178.293093
## iter  80 value 174.613853
## iter  90 value 173.792140
## iter 100 value 173.272611
## final  value 173.272611 
## stopped after 100 iterations
## # weights:  76
## initial  value 519.292272 
## iter  10 value 228.802431
## iter  20 value 172.809891
## iter  30 value 147.959693
## iter  40 value 136.834481
## iter  50 value 129.838569
## iter  60 value 123.559851
## iter  70 value 122.773277
## iter  80 value 122.685649
## iter  90 value 122.672396
## iter 100 value 122.671818
## final  value 122.671818 
## stopped after 100 iterations
## # weights:  16
## initial  value 547.722753 
## iter  10 value 456.729497
## iter  20 value 338.899112
## iter  30 value 301.327661
## iter  40 value 291.262959
## iter  50 value 287.035620
## iter  60 value 275.140591
## iter  70 value 275.027858
## iter  80 value 275.026297
## final  value 275.026064 
## converged
## # weights:  46
## initial  value 485.154184 
## iter  10 value 251.029823
## iter  20 value 214.980439
## iter  30 value 191.135196
## iter  40 value 176.702996
## iter  50 value 158.898700
## iter  60 value 155.617472
## iter  70 value 155.134097
## iter  80 value 154.745874
## iter  90 value 154.474721
## iter 100 value 154.302097
## final  value 154.302097 
## stopped after 100 iterations
## # weights:  76
## initial  value 498.504761 
## iter  10 value 210.712007
## iter  20 value 139.420708
## iter  30 value 108.342570
## iter  40 value 102.043575
## iter  50 value 101.416399
## iter  60 value 99.448168
## iter  70 value 98.565127
## iter  80 value 98.346439
## iter  90 value 98.112982
## iter 100 value 97.466446
## final  value 97.466446 
## stopped after 100 iterations
## # weights:  16
## initial  value 597.630264 
## iter  10 value 316.340451
## iter  20 value 299.330401
## iter  30 value 292.539419
## iter  40 value 289.168864
## iter  50 value 289.097109
## iter  60 value 289.055029
## iter  70 value 289.025112
## iter  80 value 289.020325
## iter  90 value 289.011649
## iter 100 value 288.971748
## final  value 288.971748 
## stopped after 100 iterations
## # weights:  46
## initial  value 537.932157 
## iter  10 value 251.634308
## iter  20 value 209.038496
## iter  30 value 186.129515
## iter  40 value 170.719608
## iter  50 value 160.473507
## iter  60 value 158.114704
## iter  70 value 158.076139
## iter  80 value 158.059400
## final  value 158.059102 
## converged
## # weights:  76
## initial  value 534.032117 
## iter  10 value 252.586858
## iter  20 value 180.344813
## iter  30 value 147.854605
## iter  40 value 117.061761
## iter  50 value 107.244455
## iter  60 value 102.411467
## iter  70 value 98.922270
## iter  80 value 89.021368
## iter  90 value 87.337685
## iter 100 value 85.775009
## final  value 85.775009 
## stopped after 100 iterations
## # weights:  16
## initial  value 615.660264 
## iter  10 value 274.968216
## iter  20 value 271.206242
## iter  30 value 270.924529
## final  value 270.905597 
## converged
## # weights:  46
## initial  value 601.636936 
## iter  10 value 324.612572
## iter  20 value 251.407923
## iter  30 value 229.291007
## iter  40 value 218.983025
## iter  50 value 211.920117
## iter  60 value 207.846188
## iter  70 value 203.714379
## iter  80 value 203.079925
## iter  90 value 203.056388
## iter 100 value 203.055621
## final  value 203.055621 
## stopped after 100 iterations
## # weights:  76
## initial  value 500.268159 
## iter  10 value 253.945704
## iter  20 value 203.573930
## iter  30 value 169.015749
## iter  40 value 148.433058
## iter  50 value 133.457977
## iter  60 value 128.274258
## iter  70 value 125.247807
## iter  80 value 122.217119
## iter  90 value 115.395019
## iter 100 value 111.754520
## final  value 111.754520 
## stopped after 100 iterations
## # weights:  16
## initial  value 520.001270 
## iter  10 value 268.624339
## iter  20 value 264.517158
## iter  30 value 247.042454
## iter  40 value 245.675993
## iter  50 value 245.576709
## iter  60 value 245.562912
## iter  70 value 245.558571
## iter  80 value 245.555112
## iter  90 value 245.544585
## iter 100 value 245.535537
## final  value 245.535537 
## stopped after 100 iterations
## # weights:  46
## initial  value 512.228420 
## iter  10 value 246.290055
## iter  20 value 216.932604
## iter  30 value 180.663661
## iter  40 value 165.232545
## iter  50 value 156.597763
## iter  60 value 143.331973
## iter  70 value 141.444385
## iter  80 value 140.644045
## iter  90 value 140.346950
## iter 100 value 140.236706
## final  value 140.236706 
## stopped after 100 iterations
## # weights:  76
## initial  value 475.521402 
## iter  10 value 220.643496
## iter  20 value 150.008702
## iter  30 value 116.845233
## iter  40 value 103.633791
## iter  50 value 99.635383
## iter  60 value 94.342974
## iter  70 value 94.051597
## iter  80 value 93.860902
## iter  90 value 93.706857
## iter 100 value 93.422063
## final  value 93.422063 
## stopped after 100 iterations
## # weights:  16
## initial  value 542.655836 
## iter  10 value 347.152465
## iter  20 value 266.088565
## iter  30 value 260.811420
## iter  40 value 260.729351
## iter  50 value 260.667690
## iter  60 value 260.392360
## iter  70 value 260.318820
## iter  80 value 260.314032
## iter  90 value 260.298109
## iter 100 value 260.262651
## final  value 260.262651 
## stopped after 100 iterations
## # weights:  46
## initial  value 507.819986 
## iter  10 value 248.096720
## iter  20 value 199.782892
## iter  30 value 178.986993
## iter  40 value 170.744068
## iter  50 value 158.615773
## iter  60 value 156.818426
## iter  70 value 156.548626
## iter  80 value 156.403653
## iter  90 value 156.400938
## iter 100 value 156.366770
## final  value 156.366770 
## stopped after 100 iterations
## # weights:  76
## initial  value 646.265085 
## iter  10 value 227.782005
## iter  20 value 172.486238
## iter  30 value 141.521385
## iter  40 value 127.693916
## iter  50 value 114.476565
## iter  60 value 111.240601
## iter  70 value 110.836415
## iter  80 value 110.760842
## iter  90 value 110.713583
## iter 100 value 110.704543
## final  value 110.704543 
## stopped after 100 iterations
## # weights:  16
## initial  value 532.402477 
## iter  10 value 289.268621
## iter  20 value 274.401551
## iter  30 value 268.518082
## iter  40 value 267.950829
## iter  50 value 267.827042
## iter  60 value 267.779781
## final  value 267.777519 
## converged
## # weights:  46
## initial  value 545.192605 
## iter  10 value 253.502325
## iter  20 value 231.988092
## iter  30 value 224.207923
## iter  40 value 220.281753
## iter  50 value 207.516652
## iter  60 value 204.431173
## iter  70 value 198.081064
## iter  80 value 189.785913
## iter  90 value 185.914992
## iter 100 value 185.880792
## final  value 185.880792 
## stopped after 100 iterations
## # weights:  76
## initial  value 689.790228 
## iter  10 value 242.738928
## iter  20 value 202.752766
## iter  30 value 183.479874
## iter  40 value 167.954963
## iter  50 value 143.281308
## iter  60 value 132.527962
## iter  70 value 129.132860
## iter  80 value 127.486667
## iter  90 value 125.641855
## iter 100 value 121.595688
## final  value 121.595688 
## stopped after 100 iterations
## # weights:  16
## initial  value 512.778779 
## iter  10 value 310.182652
## iter  20 value 261.213893
## iter  30 value 257.150286
## iter  40 value 254.786922
## iter  50 value 250.142002
## iter  60 value 246.169324
## iter  70 value 246.001465
## iter  80 value 245.984487
## iter  90 value 245.982432
## iter 100 value 245.980915
## final  value 245.980915 
## stopped after 100 iterations
## # weights:  46
## initial  value 542.554264 
## iter  10 value 229.982068
## iter  20 value 185.000206
## iter  30 value 155.275516
## iter  40 value 141.225778
## iter  50 value 135.284394
## iter  60 value 134.285110
## iter  70 value 133.891209
## iter  80 value 133.689570
## iter  90 value 133.569198
## iter 100 value 133.442363
## final  value 133.442363 
## stopped after 100 iterations
## # weights:  76
## initial  value 660.423551 
## iter  10 value 235.144669
## iter  20 value 154.664416
## iter  30 value 103.794053
## iter  40 value 95.797488
## iter  50 value 92.652612
## iter  60 value 91.532616
## iter  70 value 91.219230
## iter  80 value 90.922783
## iter  90 value 90.608308
## iter 100 value 89.743376
## final  value 89.743376 
## stopped after 100 iterations
## # weights:  16
## initial  value 511.882557 
## iter  10 value 396.614783
## iter  20 value 363.666402
## iter  30 value 276.212497
## iter  40 value 260.822599
## iter  50 value 256.260445
## iter  60 value 252.161444
## iter  70 value 252.139530
## iter  80 value 252.137484
## iter  90 value 252.088532
## iter 100 value 252.064317
## final  value 252.064317 
## stopped after 100 iterations
## # weights:  46
## initial  value 506.186916 
## iter  10 value 225.413615
## iter  20 value 176.153268
## iter  30 value 157.824529
## iter  40 value 145.304481
## iter  50 value 142.787812
## iter  60 value 142.772653
## final  value 142.772629 
## converged
## # weights:  76
## initial  value 520.061693 
## iter  10 value 228.445422
## iter  20 value 153.015809
## iter  30 value 101.309545
## iter  40 value 74.262652
## iter  50 value 67.444658
## iter  60 value 63.155770
## iter  70 value 62.976778
## iter  80 value 62.941845
## iter  90 value 62.934969
## iter 100 value 62.932205
## final  value 62.932205 
## stopped after 100 iterations
## # weights:  16
## initial  value 518.578806 
## iter  10 value 263.635121
## iter  20 value 258.674646
## final  value 258.156985 
## converged
## # weights:  46
## initial  value 529.975000 
## iter  10 value 248.586217
## iter  20 value 223.997265
## iter  30 value 205.497607
## iter  40 value 197.230114
## iter  50 value 191.540049
## iter  60 value 190.783156
## iter  70 value 190.696906
## iter  80 value 190.696746
## iter  90 value 190.695895
## iter 100 value 190.695561
## final  value 190.695561 
## stopped after 100 iterations
## # weights:  76
## initial  value 582.122637 
## iter  10 value 208.283950
## iter  20 value 154.915738
## iter  30 value 144.246702
## iter  40 value 138.885545
## iter  50 value 132.129703
## iter  60 value 127.947886
## iter  70 value 124.562271
## iter  80 value 123.379885
## iter  90 value 123.066657
## iter 100 value 122.985825
## final  value 122.985825 
## stopped after 100 iterations
## # weights:  16
## initial  value 521.546758 
## iter  10 value 290.920284
## iter  20 value 256.713458
## iter  30 value 249.771807
## iter  40 value 239.457613
## iter  50 value 237.613143
## iter  60 value 236.883883
## iter  70 value 236.870020
## iter  80 value 236.865711
## final  value 236.865183 
## converged
## # weights:  46
## initial  value 506.185230 
## iter  10 value 244.867362
## iter  20 value 191.275470
## iter  30 value 165.843350
## iter  40 value 157.239923
## iter  50 value 152.715498
## iter  60 value 138.163460
## iter  70 value 136.849715
## iter  80 value 136.501260
## iter  90 value 136.104135
## iter 100 value 135.891283
## final  value 135.891283 
## stopped after 100 iterations
## # weights:  76
## initial  value 521.178303 
## iter  10 value 234.910649
## iter  20 value 177.480070
## iter  30 value 132.024891
## iter  40 value 116.861190
## iter  50 value 105.585993
## iter  60 value 102.766207
## iter  70 value 102.365864
## iter  80 value 102.027159
## iter  90 value 101.900662
## iter 100 value 101.845288
## final  value 101.845288 
## stopped after 100 iterations
## # weights:  16
## initial  value 558.818008 
## iter  10 value 277.797276
## iter  20 value 255.208095
## iter  30 value 250.588187
## iter  40 value 249.475807
## iter  50 value 249.183460
## iter  60 value 248.592238
## iter  70 value 248.537452
## iter  80 value 248.536303
## final  value 248.536272 
## converged
## # weights:  46
## initial  value 523.739877 
## iter  10 value 265.309590
## iter  20 value 223.441590
## iter  30 value 207.961465
## iter  40 value 194.999484
## iter  50 value 184.405164
## iter  60 value 176.562972
## iter  70 value 173.934014
## iter  80 value 172.209256
## iter  90 value 172.208173
## iter 100 value 172.207964
## final  value 172.207964 
## stopped after 100 iterations
## # weights:  76
## initial  value 521.576314 
## iter  10 value 234.408307
## iter  20 value 145.180218
## iter  30 value 90.445400
## iter  40 value 61.079630
## iter  50 value 56.101066
## iter  60 value 55.833196
## iter  70 value 55.778612
## iter  80 value 55.724352
## iter  90 value 55.722748
## iter 100 value 55.722627
## final  value 55.722627 
## stopped after 100 iterations
## # weights:  16
## initial  value 531.429970 
## iter  10 value 270.097348
## iter  20 value 257.883637
## iter  30 value 256.396383
## final  value 256.395725 
## converged
## # weights:  46
## initial  value 509.584241 
## iter  10 value 232.923410
## iter  20 value 208.210955
## iter  30 value 195.897209
## iter  40 value 192.245468
## iter  50 value 187.007962
## iter  60 value 186.770713
## iter  70 value 186.748993
## iter  80 value 186.729546
## iter  90 value 184.690912
## iter 100 value 181.214464
## final  value 181.214464 
## stopped after 100 iterations
## # weights:  76
## initial  value 569.192403 
## iter  10 value 224.543694
## iter  20 value 190.429254
## iter  30 value 163.861269
## iter  40 value 155.352992
## iter  50 value 151.817341
## iter  60 value 142.990249
## iter  70 value 136.645401
## iter  80 value 134.078251
## iter  90 value 128.212210
## iter 100 value 123.665896
## final  value 123.665896 
## stopped after 100 iterations
## # weights:  16
## initial  value 517.487109 
## iter  10 value 343.564309
## iter  20 value 272.873041
## iter  30 value 262.337086
## iter  40 value 259.217270
## iter  50 value 247.937583
## iter  60 value 247.723127
## iter  70 value 247.713820
## iter  80 value 247.710533
## iter  80 value 247.710530
## iter  80 value 247.710530
## final  value 247.710530 
## converged
## # weights:  46
## initial  value 480.008479 
## iter  10 value 217.267360
## iter  20 value 178.015054
## iter  30 value 150.644036
## iter  40 value 140.122838
## iter  50 value 134.480882
## iter  60 value 133.918307
## iter  70 value 133.445577
## iter  80 value 132.937895
## iter  90 value 132.805391
## iter 100 value 132.690798
## final  value 132.690798 
## stopped after 100 iterations
## # weights:  76
## initial  value 505.969787 
## iter  10 value 216.506574
## iter  20 value 126.003145
## iter  30 value 85.632150
## iter  40 value 69.068739
## iter  50 value 65.196365
## iter  60 value 63.884057
## iter  70 value 63.473327
## iter  80 value 63.401853
## iter  90 value 63.370137
## iter 100 value 63.331548
## final  value 63.331548 
## stopped after 100 iterations
## # weights:  16
## initial  value 521.078921 
## iter  10 value 314.217637
## iter  20 value 276.789043
## iter  30 value 270.996308
## iter  40 value 262.977474
## iter  50 value 260.647469
## iter  60 value 253.935863
## iter  70 value 253.679452
## final  value 253.679079 
## converged
## # weights:  46
## initial  value 561.528361 
## iter  10 value 283.941427
## iter  20 value 219.836282
## iter  30 value 201.919185
## iter  40 value 177.890568
## iter  50 value 162.929602
## iter  60 value 161.641316
## iter  70 value 161.627199
## final  value 161.627107 
## converged
## # weights:  76
## initial  value 536.787222 
## iter  10 value 266.453761
## iter  20 value 184.895137
## iter  30 value 144.861292
## iter  40 value 131.188909
## iter  50 value 123.002078
## iter  60 value 109.706365
## iter  70 value 95.395510
## iter  80 value 93.728864
## iter  90 value 92.383074
## iter 100 value 91.971293
## final  value 91.971293 
## stopped after 100 iterations
## # weights:  16
## initial  value 523.343915 
## iter  10 value 328.005109
## iter  20 value 285.496574
## iter  30 value 276.648039
## iter  40 value 276.645851
## iter  50 value 276.645478
## final  value 276.645444 
## converged
## # weights:  46
## initial  value 511.433716 
## iter  10 value 276.456663
## iter  20 value 233.528730
## iter  30 value 214.353812
## iter  40 value 203.534107
## iter  50 value 197.623183
## iter  60 value 197.395259
## iter  70 value 197.379564
## final  value 197.379278 
## converged
## # weights:  76
## initial  value 633.686567 
## iter  10 value 281.141507
## iter  20 value 209.468249
## iter  30 value 179.408033
## iter  40 value 157.084087
## iter  50 value 150.093281
## iter  60 value 146.478879
## iter  70 value 142.903766
## iter  80 value 141.861574
## iter  90 value 139.514122
## iter 100 value 139.034925
## final  value 139.034925 
## stopped after 100 iterations
## # weights:  16
## initial  value 547.345761 
## iter  10 value 332.999044
## iter  20 value 283.267821
## iter  30 value 271.235980
## iter  40 value 268.641857
## iter  50 value 267.546156
## iter  60 value 265.960285
## iter  70 value 265.609228
## iter  80 value 265.571090
## iter  90 value 265.432189
## iter 100 value 265.363833
## final  value 265.363833 
## stopped after 100 iterations
## # weights:  46
## initial  value 580.909675 
## iter  10 value 238.816643
## iter  20 value 187.514857
## iter  30 value 164.255701
## iter  40 value 149.168330
## iter  50 value 119.670987
## iter  60 value 109.107817
## iter  70 value 108.529105
## iter  80 value 108.384946
## iter  90 value 108.281583
## iter 100 value 108.146817
## final  value 108.146817 
## stopped after 100 iterations
## # weights:  76
## initial  value 642.453403 
## iter  10 value 244.319511
## iter  20 value 180.559054
## iter  30 value 142.590718
## iter  40 value 130.435449
## iter  50 value 122.058774
## iter  60 value 119.778883
## iter  70 value 112.781167
## iter  80 value 111.886892
## iter  90 value 111.606368
## iter 100 value 111.509094
## final  value 111.509094 
## stopped after 100 iterations
## # weights:  16
## initial  value 503.772377 
## iter  10 value 271.873471
## iter  20 value 261.811700
## iter  30 value 244.074511
## iter  40 value 241.403843
## iter  50 value 241.337745
## iter  60 value 241.329640
## iter  70 value 241.315467
## iter  80 value 241.312334
## iter  90 value 241.307098
## iter 100 value 241.295797
## final  value 241.295797 
## stopped after 100 iterations
## # weights:  46
## initial  value 490.882013 
## iter  10 value 217.373082
## iter  20 value 180.246741
## iter  30 value 155.464478
## iter  40 value 147.126816
## iter  50 value 145.651931
## iter  60 value 143.760419
## iter  70 value 141.090644
## iter  80 value 139.262623
## iter  90 value 139.208686
## final  value 139.205840 
## converged
## # weights:  76
## initial  value 497.057454 
## iter  10 value 227.796170
## iter  20 value 159.601471
## iter  30 value 130.272452
## iter  40 value 125.021975
## iter  50 value 116.374147
## iter  60 value 110.018148
## iter  70 value 109.225402
## iter  80 value 109.207248
## final  value 109.207222 
## converged
## # weights:  16
## initial  value 516.126422 
## iter  10 value 326.040313
## iter  20 value 274.256464
## iter  30 value 269.179905
## iter  40 value 268.705641
## iter  50 value 268.632234
## final  value 268.631781 
## converged
## # weights:  46
## initial  value 521.223661 
## iter  10 value 315.337374
## iter  20 value 262.741144
## iter  30 value 237.132100
## iter  40 value 232.328477
## iter  50 value 222.476095
## iter  60 value 214.617739
## iter  70 value 214.072661
## iter  80 value 214.063866
## iter  90 value 214.057805
## final  value 214.057496 
## converged
## # weights:  76
## initial  value 502.915007 
## iter  10 value 236.227832
## iter  20 value 178.155649
## iter  30 value 157.946579
## iter  40 value 142.874459
## iter  50 value 137.413910
## iter  60 value 135.134474
## iter  70 value 134.978850
## iter  80 value 134.954170
## iter  90 value 134.939719
## final  value 134.939498 
## converged
## # weights:  16
## initial  value 518.134263 
## iter  10 value 336.702845
## iter  20 value 270.441308
## iter  30 value 257.553529
## iter  40 value 252.667716
## iter  50 value 250.244861
## iter  60 value 238.589635
## iter  70 value 238.505632
## iter  80 value 238.499911
## iter  90 value 238.499020
## final  value 238.498353 
## converged
## # weights:  46
## initial  value 553.912001 
## iter  10 value 292.641135
## iter  20 value 252.617452
## iter  30 value 236.693190
## iter  40 value 209.054685
## iter  50 value 191.602005
## iter  60 value 184.516535
## iter  70 value 180.053280
## iter  80 value 177.015516
## iter  90 value 174.504128
## iter 100 value 174.001705
## final  value 174.001705 
## stopped after 100 iterations
## # weights:  76
## initial  value 605.048421 
## iter  10 value 236.415900
## iter  20 value 173.009308
## iter  30 value 133.987288
## iter  40 value 105.942524
## iter  50 value 97.392195
## iter  60 value 92.025802
## iter  70 value 89.802861
## iter  80 value 89.699985
## iter  90 value 89.659414
## iter 100 value 89.643695
## final  value 89.643695 
## stopped after 100 iterations
## # weights:  16
## initial  value 512.631749 
## iter  10 value 318.768447
## iter  20 value 274.618832
## iter  30 value 265.412849
## iter  40 value 265.087516
## iter  50 value 265.026576
## iter  60 value 264.721854
## iter  70 value 264.612653
## iter  80 value 264.601267
## iter  90 value 264.587677
## iter 100 value 264.543703
## final  value 264.543703 
## stopped after 100 iterations
## # weights:  46
## initial  value 513.870189 
## iter  10 value 267.660228
## iter  20 value 239.934751
## iter  30 value 195.757403
## iter  40 value 174.981385
## iter  50 value 156.675863
## iter  60 value 149.380738
## iter  70 value 148.689007
## iter  80 value 148.682656
## final  value 148.682547 
## converged
## # weights:  76
## initial  value 544.818104 
## iter  10 value 247.006722
## iter  20 value 176.276583
## iter  30 value 128.262820
## iter  40 value 116.002045
## iter  50 value 110.166166
## iter  60 value 106.570682
## iter  70 value 105.462764
## iter  80 value 103.542530
## iter  90 value 102.927538
## iter 100 value 102.662198
## final  value 102.662198 
## stopped after 100 iterations
## # weights:  16
## initial  value 518.028417 
## iter  10 value 309.940189
## iter  20 value 274.273225
## iter  30 value 273.674754
## final  value 273.664294 
## converged
## # weights:  46
## initial  value 524.908023 
## iter  10 value 248.726361
## iter  20 value 208.560397
## iter  30 value 192.021692
## iter  40 value 188.075119
## iter  50 value 187.740205
## iter  60 value 187.713135
## iter  70 value 187.711529
## final  value 187.711516 
## converged
## # weights:  76
## initial  value 568.375251 
## iter  10 value 242.206230
## iter  20 value 185.840540
## iter  30 value 158.551606
## iter  40 value 140.345350
## iter  50 value 131.845012
## iter  60 value 128.429472
## iter  70 value 123.641523
## iter  80 value 121.164028
## iter  90 value 119.730181
## iter 100 value 117.924842
## final  value 117.924842 
## stopped after 100 iterations
## # weights:  16
## initial  value 560.710793 
## iter  10 value 347.877897
## iter  20 value 311.815860
## iter  30 value 301.911077
## iter  40 value 279.432127
## iter  50 value 270.094138
## iter  60 value 256.254343
## iter  70 value 256.053465
## iter  80 value 256.003636
## iter  90 value 256.000755
## final  value 256.000582 
## converged
## # weights:  46
## initial  value 518.312414 
## iter  10 value 244.090722
## iter  20 value 189.952488
## iter  30 value 172.577092
## iter  40 value 158.088364
## iter  50 value 142.411024
## iter  60 value 141.814489
## iter  70 value 141.618076
## iter  80 value 141.180044
## iter  90 value 140.782598
## iter 100 value 140.469324
## final  value 140.469324 
## stopped after 100 iterations
## # weights:  76
## initial  value 529.307477 
## iter  10 value 221.160858
## iter  20 value 139.031792
## iter  30 value 100.091424
## iter  40 value 82.167996
## iter  50 value 78.265889
## iter  60 value 76.242376
## iter  70 value 75.779159
## iter  80 value 75.562337
## iter  90 value 75.462204
## iter 100 value 75.064118
## final  value 75.064118 
## stopped after 100 iterations
## # weights:  76
## initial  value 537.836650 
## iter  10 value 250.670307
## iter  20 value 194.657220
## iter  30 value 165.799581
## iter  40 value 150.282207
## iter  50 value 141.276764
## iter  60 value 135.446469
## iter  70 value 131.854287
## iter  80 value 130.626526
## iter  90 value 130.105768
## iter 100 value 129.939226
## final  value 129.939226 
## stopped after 100 iterations
resultado_entrenamiento6 <- predict(modelo6, entrenamiento)
resultado_prueba6 <- predict(modelo6,prueba) 

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

#Matriz de confusion del resultado de entrenamiento 
mcre6 <- confusionMatrix(resultado_entrenamiento6, entrenamiento$target)
mcre6
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 382   1
##          1  18 420
##                                          
##                Accuracy : 0.9769         
##                  95% CI : (0.9641, 0.986)
##     No Information Rate : 0.5128         
##     P-Value [Acc > NIR] : < 2.2e-16      
##                                          
##                   Kappa : 0.9536         
##                                          
##  Mcnemar's Test P-Value : 0.0002419      
##                                          
##             Sensitivity : 0.9550         
##             Specificity : 0.9976         
##          Pos Pred Value : 0.9974         
##          Neg Pred Value : 0.9589         
##              Prevalence : 0.4872         
##          Detection Rate : 0.4653         
##    Detection Prevalence : 0.4665         
##       Balanced Accuracy : 0.9763         
##                                          
##        'Positive' Class : 0              
## 
#Matriz de confusion del resultado de la prueba
mcrp6 <- confusionMatrix(resultado_prueba6, prueba$target)
mcrp6
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  95   2
##          1   4 103
##                                           
##                Accuracy : 0.9706          
##                  95% CI : (0.9371, 0.9891)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9411          
##                                           
##  Mcnemar's Test P-Value : 0.6831          
##                                           
##             Sensitivity : 0.9596          
##             Specificity : 0.9810          
##          Pos Pred Value : 0.9794          
##          Neg Pred Value : 0.9626          
##              Prevalence : 0.4853          
##          Detection Rate : 0.4657          
##    Detection Prevalence : 0.4755          
##       Balanced Accuracy : 0.9703          
##                                           
##        'Positive' Class : 0               
## 

Tabla 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"]),
  "rf" = c(mcre5$overall["Accuracy"], mcrp5$overall["Accuracy"]),
  "nnet" = c(mcre6$overall["Accuracy"], mcrp6$overall["Accuracy"])
)
row.names(resultados) <- c("Entrenamiento", "Prueba")
resultados 
##               svmLinear svmRadial   svmPoly     rpart rf      nnet
## Entrenamiento 0.8343484         1 0.8343484 0.9159562  1 0.9768575
## Prueba        0.8480392         1 0.8480392 0.8774510  1 0.9705882

Conclusión

En conclusión, se deben comparar los valores de Accuracy de la fila Prueba en la tabla de resultados. El modelo con el Accuracy más alto en los datos de prueba será el recomendado para clasificar la variable target de la base de datos Heart.

LS0tDQp0aXRsZTogIkhlYXJ0Ig0KYXV0aG9yOiAiS2FtaWwgTSINCmRhdGU6ICIyMDI2LTA4LTI3Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IGNvc21vDQotLS0NCg0KIyA8c3BhbiBzdHlsZT0gImNvbG9yOiBibHVlIj4gVGVvcsOtYSA8L3NwYW4+IA0KRXMgZWwgcGFxdWV0ZSAqKkNBUkVUIChDbGFzc2lmaWNhdGlvbiBhbmQgUmVncmVzc2lvbiBUcmFpbmluZykqKiwgdW4gcGFxdWV0ZSBpbnRlZ3JhbCBjb24gdW5hIGFtcGxpYSB2YXJpZWRhZCBkZSBhbGdvcml0bW9zIHBhcmEgZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28uIA0KDQojIDxzcGFuIHN0eWxlPSAiY29sb3I6IGJsdWUiPiBJbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzIDwvc3Bhbj4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKSAjIGFsZ29yaXRtb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28NCmxpYnJhcnkoY2FyZXQpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgIyBncmFmaWNhcw0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygibGF0dGljZSIpICNjcmVhciBncsOhZmljb3MNCmxpYnJhcnkobGF0dGljZSkNCg0KI2luc3RhbGwucGFja2FnZXMoImRhdGFzZXRzIikgIyB1c2FzIGRhdGFzZXRzIGNhcmdhZG9zDQpsaWJyYXJ5KGRhdGFzZXRzKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygiRGF0YUV4cGxvcmVyIikgI2Fuw6FsaXNpcyBkZXNjcmlwdGl2bw0KbGlicmFyeShEYXRhRXhwbG9yZXIpIA0KDQojaW5zdGFsbC5wYWNrYWdlcygia2VybmxhYiIpDQpsaWJyYXJ5KGtlcm5sYWIpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJyYW5kb21Gb3Jlc3QiKQ0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKSAjIGxlZXIgYXJjaGl2b3MgZGUgRXhjZWwNCmxpYnJhcnkocmVhZHhsKQ0KYGBgDQoNCg0KIyA8c3BhbiBzdHlsZT0gImNvbG9yOiBibHVlIj4gQ3JlYXIgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCiMgZmlsZS5jaG9vc2UoKQ0KZGYgPC0gcmVhZF9leGNlbCgiQzpcXFVzZXJzXFx1c3VhcmlvMVxcRG93bmxvYWRzXFxoZWFydC54bHN4IikNCg0KIyBMYSB2YXJpYWJsZSBxdWUgcXVlcmVtb3MgcHJlZGVjaXIgZGViZSBzZXIgZmFjdG9yIGVuIG1vZGVsb3MgZGUgY2xhc2lmaWNhY2nDs24NCmRmJHRhcmdldCA8LSBhcy5mYWN0b3IoZGYkdGFyZ2V0KQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ICJjb2xvcjogYmx1ZSI+IEVudGVuZGVyIGJhc2UgZGUgZGF0b3MgPC9zcGFuPg0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0Kc3RyKGRmKQ0KI2NyZWF0ZV9yZXBvcnQoZGYpIA0KcGxvdF9taXNzaW5nKGRmKSAjIGVzdG9zIHNlIGhhY2VuIGNvbiBkYXRhZXhwbG9yZXINCnBsb3RfaGlzdG9ncmFtKGRmKQ0KcGxvdF9jb3JyZWxhdGlvbihkZikgDQpgYGANCg0KKipOT1RBOiBlbiBtb2RlbG9zIGRlIGNsYXNpZmljYWNpb24sIGxhIHZhcmlhYmxlIHF1ZSBxdWVyZW1vcyBwcmVkZWNpciBkZWJlIHRlbmVyIGZvcm1hdG8gZGUgRkFDVE9SKioNCg0KDQojIDxzcGFuIHN0eWxlPSAiY29sb3I6IGJsdWUiPiBQYXJ0aXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCiMgTm9ybWFsbWVudGUgODAtMjAgbyA3MC0zMA0Kc2V0LnNlZWQoMTIzKQ0KcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8gPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihkZiR0YXJnZXQsIHA9MC44LCBsaXN0PSBGQUxTRSkgDQplbnRyZW5hbWllbnRvIDwtIGRmW3Jlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdICNjdWFuZG8gZGVzcHVlcyBkZSBsYSBjb21hIG5vIGhheSBuYWRhLCBjb25zaWRlcmEgdG9kb3MgbG9zIHZhbG9yZXMgDQpwcnVlYmEgPC0gZGZbLXJlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdIA0KDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0gImNvbG9yOiBibHVlIj4gRGlzdGludG9zIHRpcG9zIGRlIG3DqXRvZG9zIHBhcmEgTW9kZWxhciA8L3NwYW4+DQpMb3MgbcOpdG9kb3MgbcOhcyB1dGlsaXphZG9zIHBhcmEgbW9kZWxhciBhcHJlbmRpemFqZSBhdXRvbcOhdGljbyBzb246IA0KDQoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUuIEhheSB2YXJpb3Mgc3VidGlwb3M6IExpbmVhbCAoc3ZtTGluZWFyKSwgUmFkaWFsIChzdm1SYWRpYWwpLCBQb2xpbsOzbWljbyAoc3ZtUG9seSksIGV0Yy4gDQoqICoqw4FyYm9sIGRlIGRlY2lzacOzbioqOiBycGFydA0KKiAqKlJhbmRvbSBGb3Jlc3QqKiBvIGJvc3F1ZXMgYWxlYXRvcmlvczogcmYNCg0KIyA8c3BhbiBzdHlsZT0gImNvbG9yOiBibHVlIj4gTW9kZWxvIDEuIFNWTSBMaW5lYWwgPC9zcGFuPg0KYGBge3J9DQptb2RlbG8xIDwtIHRyYWluKHRhcmdldH4uLGRhdGEgPSBlbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2Q9InN2bUxpbmVhciIsICNDYW1iaWFyIA0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2w9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCksDQogICAgICAgICAgICAgICAgIHR1bmVHcmlkPSBkYXRhLmZyYW1lKEM9MSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgKSANCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8xIDwtIHByZWRpY3QobW9kZWxvMSwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmExIDwtIHByZWRpY3QobW9kZWxvMSxwcnVlYmEpIA0KDQojTWF0cml6IGRlIGNvbmZ1c2nDs24gDQojIEVzIHVuYSB0YWJsYSBkZSBldmFsdWFjacOzbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjacOzbg0KDQojTWF0cml6IGRlIGNvbmZ1c2lvbiBkZWwgcmVzdWx0YWRvIGRlIGVudHJlbmFtaWVudG8gDQptY3JlMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8xLCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCm1jcmUxDQoNCiNNYXRyaXogZGUgY29uZnVzaW9uIGRlbCByZXN1bHRhZG8gZGUgbGEgcHJ1ZWJhDQptY3JwMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTEsIHBydWViYSR0YXJnZXQpDQptY3JwMQ0KDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0gImNvbG9yOiBibHVlIj4gTW9kZWxvIDIuIFNWTSBSYWRpYWwgPC9zcGFuPg0KYGBge3J9DQptb2RlbG8yIDwtIHRyYWluKHRhcmdldH4uLGRhdGEgPSBlbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2Q9InN2bVJhZGlhbCIsICNDYW1iaWFyIA0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2w9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCksDQogICAgICAgICAgICAgICAgIHR1bmVHcmlkPSBkYXRhLmZyYW1lKHNpZ21hPTEsIEM9MSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgKSANCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8yIDwtIHByZWRpY3QobW9kZWxvMiwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEyIDwtIHByZWRpY3QobW9kZWxvMixwcnVlYmEpIA0KDQojTWF0cml6IGRlIGNvbmZ1c2nDs24gDQojIEVzIHVuYSB0YWJsYSBkZSBldmFsdWFjacOzbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjacOzbg0KDQojTWF0cml6IGRlIGNvbmZ1c2lvbiBkZWwgcmVzdWx0YWRvIGRlIGVudHJlbmFtaWVudG8gDQptY3JlMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8yLCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCm1jcmUyDQoNCiNNYXRyaXogZGUgY29uZnVzaW9uIGRlbCByZXN1bHRhZG8gZGUgbGEgcHJ1ZWJhDQptY3JwMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTIsIHBydWViYSR0YXJnZXQpDQptY3JwMg0KDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0gImNvbG9yOiBibHVlIj4gTW9kZWxvIDMuIFNWTSBQb2xpbsOzbWljbyA8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzMgPC0gdHJhaW4odGFyZ2V0fi4sZGF0YSA9IGVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZD0ic3ZtUG9seSIsICNDYW1iaWFyIA0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2w9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCksDQogICAgICAgICAgICAgICAgIHR1bmVHcmlkPSBkYXRhLmZyYW1lKGRlZ3JlZT0xLCBzY2FsZT0xLCBDPTEpICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICkgDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMyA8LSBwcmVkaWN0KG1vZGVsbzMsIGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMyA8LSBwcmVkaWN0KG1vZGVsbzMscHJ1ZWJhKSANCg0KI01hdHJpeiBkZSBjb25mdXNpw7NuIA0KIyBFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24NCg0KI01hdHJpeiBkZSBjb25mdXNpb24gZGVsIHJlc3VsdGFkbyBkZSBlbnRyZW5hbWllbnRvIA0KbWNyZTMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMywgZW50cmVuYW1pZW50byR0YXJnZXQpDQptY3JlMw0KDQojTWF0cml6IGRlIGNvbmZ1c2lvbiBkZWwgcmVzdWx0YWRvIGRlIGxhIHBydWViYQ0KbWNycDMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmEzLCBwcnVlYmEkdGFyZ2V0KQ0KbWNycDMNCg0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ICJjb2xvcjogYmx1ZSI+IE1vZGVsbyA0LiDDgXJib2wgZGUgZGVjaXNpw7NuIDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvNCA8LSB0cmFpbih0YXJnZXR+LixkYXRhID0gZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kPSJycGFydCIsICNDYW1iaWFyIA0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2w9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCksDQogICAgICAgICAgICAgICAgIHR1bmVMZW5ndGggPTEwICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICkgDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNCA8LSBwcmVkaWN0KG1vZGVsbzQsIGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhNCA8LSBwcmVkaWN0KG1vZGVsbzQscHJ1ZWJhKSANCg0KI01hdHJpeiBkZSBjb25mdXNpw7NuIA0KIyBFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24NCg0KI01hdHJpeiBkZSBjb25mdXNpb24gZGVsIHJlc3VsdGFkbyBkZSBlbnRyZW5hbWllbnRvIA0KbWNyZTQgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNCwgZW50cmVuYW1pZW50byR0YXJnZXQpDQptY3JlNA0KDQojTWF0cml6IGRlIGNvbmZ1c2lvbiBkZWwgcmVzdWx0YWRvIGRlIGxhIHBydWViYQ0KbWNycDQgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE0LCBwcnVlYmEkdGFyZ2V0KQ0KbWNycDQNCg0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ICJjb2xvcjogYmx1ZSI+IE1vZGVsbyA1LiBCb3NxdWVzIEFsZWF0b3Jpb3MgPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm1vZGVsbzUgPC0gdHJhaW4odGFyZ2V0fi4sZGF0YSA9IGVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZD0icmYiLCAjQ2FtYmlhciANCiAgICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz0gYygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyID0gMTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZD0gZXhwYW5kLmdyaWQobXRyeT1jKDIsNCw2KSkjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICApIA0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzUgPC0gcHJlZGljdChtb2RlbG81LCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTUgPC0gcHJlZGljdChtb2RlbG81LHBydWViYSkgDQoNCiNNYXRyaXogZGUgY29uZnVzacOzbiANCiMgRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuDQoNCiNNYXRyaXogZGUgY29uZnVzaW9uIGRlbCByZXN1bHRhZG8gZGUgZW50cmVuYW1pZW50byANCm1jcmU1IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzUsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KbWNyZTUNCg0KI01hdHJpeiBkZSBjb25mdXNpb24gZGVsIHJlc3VsdGFkbyBkZSBsYSBwcnVlYmENCm1jcnA1IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNSwgcHJ1ZWJhJHRhcmdldCkNCm1jcnA1DQoNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSAiY29sb3I6IGJsdWUiPiBNb2RlbG8gNi4gUmVkZXMgbmV1cm9uYWxlcyA8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbW9kZWxvNiA8LSB0cmFpbih0YXJnZXR+LixkYXRhID0gZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kPSJubmV0IiwgI0NhbWJpYXIgDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9IGMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbD0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsIG51bWJlciA9IDEwKQ0KICAgICAgICAgICAgICAgICAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICApIA0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYgPC0gcHJlZGljdChtb2RlbG82LCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTYgPC0gcHJlZGljdChtb2RlbG82LHBydWViYSkgDQoNCiNNYXRyaXogZGUgY29uZnVzacOzbiANCiMgRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuDQoNCiNNYXRyaXogZGUgY29uZnVzaW9uIGRlbCByZXN1bHRhZG8gZGUgZW50cmVuYW1pZW50byANCm1jcmU2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KbWNyZTYNCg0KI01hdHJpeiBkZSBjb25mdXNpb24gZGVsIHJlc3VsdGFkbyBkZSBsYSBwcnVlYmENCm1jcnA2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNiwgcHJ1ZWJhJHRhcmdldCkNCm1jcnA2DQoNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSAiY29sb3I6IGJsdWUiPiBUYWJsYSBkZSByZXN1bHRhZG9zIDwvc3Bhbj4NCmBgYHtyfQ0KcmVzdWx0YWRvcyA8LSBkYXRhLmZyYW1lKA0KICAic3ZtTGluZWFyIiA9IGMobWNyZTEkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDEkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJzdm1SYWRpYWwiID0gYyhtY3JlMiRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMiRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInN2bVBvbHkiID0gYyhtY3JlMyRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMyRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInJwYXJ0IiA9IGMobWNyZTQkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDQkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJyZiIgPSBjKG1jcmU1JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA1JG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAibm5ldCIgPSBjKG1jcmU2JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA2JG92ZXJhbGxbIkFjY3VyYWN5Il0pDQopDQpyb3cubmFtZXMocmVzdWx0YWRvcykgPC0gYygiRW50cmVuYW1pZW50byIsICJQcnVlYmEiKQ0KcmVzdWx0YWRvcyANCmBgYA0KDQojIDxzcGFuIHN0eWxlPSAiY29sb3I6IGJsdWUiPiBDb25jbHVzacOzbiA8L3NwYW4+DQpFbiBjb25jbHVzacOzbiwgc2UgZGViZW4gY29tcGFyYXIgbG9zIHZhbG9yZXMgZGUgKipBY2N1cmFjeSBkZSBsYSBmaWxhIFBydWViYSoqIGVuIGxhIHRhYmxhIGRlIHJlc3VsdGFkb3MuIEVsIG1vZGVsbyBjb24gZWwgQWNjdXJhY3kgbcOhcyBhbHRvIGVuIGxvcyBkYXRvcyBkZSBwcnVlYmEgc2Vyw6EgZWwgcmVjb21lbmRhZG8gcGFyYSBjbGFzaWZpY2FyIGxhIHZhcmlhYmxlICoqdGFyZ2V0KiogZGUgbGEgYmFzZSBkZSBkYXRvcyBIZWFydC4NCg==