Instalar paquetes y llamar librerias

#install.packages("caret") # Algoritmos de aprendizaje automatico
library(caret)
#install.packages("ggplot2") # Graficas
library(ggplot2)
#install.packages("lattice") # crear graficos
library(lattice)
#install.packages("DataExplorer") # Analisis descriptivo
library(DataExplorer)
#install.packages("kernlab")
library(kernlab)
#install.packages("randomForest")
library(randomForest)
#install.packages("nnet")
library(nnet)

Crear base de datos

#file.choose()
df <- read.csv("/Users/eurielgomeztamez/Library/Mobile Documents/com~apple~CloudDocs/Tec/7/M2/heart.csv")
df$target <- factor(df$target,
                    levels = c(0, 1),
                    labels = c("No", "Si"))

Entender la 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   No:499  
##  1st Qu.:2.000   Si:526  
##  Median :2.000           
##  Mean   :2.324           
##  3rd Qu.:3.000           
##  Max.   :3.000
str(df)
## 'data.frame':    1025 obs. of  14 variables:
##  $ age     : int  52 53 70 61 62 58 58 55 46 54 ...
##  $ sex     : int  1 1 1 1 0 0 1 1 1 1 ...
##  $ cp      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ trestbps: int  125 140 145 148 138 100 114 160 120 122 ...
##  $ chol    : int  212 203 174 203 294 248 318 289 249 286 ...
##  $ fbs     : int  0 1 0 0 1 0 0 0 0 0 ...
##  $ restecg : int  1 0 1 1 1 0 2 0 0 0 ...
##  $ thalach : int  168 155 125 161 106 122 140 145 144 116 ...
##  $ exang   : int  0 1 1 0 0 0 0 1 0 1 ...
##  $ oldpeak : num  1 3.1 2.6 0 1.9 1 4.4 0.8 0.8 3.2 ...
##  $ slope   : int  2 0 0 2 1 1 0 1 2 1 ...
##  $ ca      : int  2 0 0 1 3 0 3 1 0 2 ...
##  $ thal    : int  3 3 3 3 2 2 1 3 3 2 ...
##  $ target  : Factor w/ 2 levels "No","Si": 1 1 1 1 1 2 1 1 1 1 ...
#create_report(df)
plot_missing(df)

plot_histogram(df)

plot_correlation(df)

table(df$target)
## 
##  No  Si 
## 499 526
prop.table(table(df$target))
## 
##        No        Si 
## 0.4868293 0.5131707

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, ]
prueba <- df[-renglones_entrenamiento, ]

Distintos tipos de metodos para modelar

Los metodos mas utilizados para modelar aprendizaje automatico son:

  • SVM: Support Vector Machine o Maquina de Vectores de Soporte. Hay varios subtipos: Lineal (svmLinear), Radial (svmRadial), Polinomico (svmPoly), etc.
  • Arbol de Decision: rpart
  • Redes Neuronales: nnet
  • Random Forest: o Bosques Aleatorios: rf

Modelo 1. SVM Lineal

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

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

# Matriz de confusion
# Es una tabla de evaluacion que desglosa el rendimiento del modelo de clasificacion

# Matriz de confusion del resultado del entrenamiento
mcre1 <- confusionMatrix(resultado_entrenamiento1,entrenamiento$target)
mcre1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No  Si
##         No 301  37
##         Si  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 : No              
## 
# Matriz de Confusion del Resultado de la Prueba
mcrp1 <- confusionMatrix(resultado_prueba1, prueba$target)
mcrp1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Si
##         No 78 10
##         Si 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 : No              
## 

Modelo 2. SVM Radial

set.seed(123)
modelo2 <- train(target~., data=entrenamiento,
                 method = "svmRadial", #Cambiar
                 preProcess = c("center", "scale"),
                 trControl = trainControl(method="cv", number=10),
                 tuneGrid = expand.grid(sigma = c(0.01, 0.05, 0.1), C = c(0.5, 1, 2)) # Cambiar
                 )

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

# Matriz de confusion
# Es una tabla de evaluacion que desglosa el rendimiento del modelo de clasificacion

# Matriz de confusion del resultado del entrenamiento
mcre2 <- confusionMatrix(resultado_entrenamiento2,entrenamiento$target)
mcre2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No  Si
##         No 387   2
##         Si  13 419
##                                         
##                Accuracy : 0.9817        
##                  95% CI : (0.97, 0.9897)
##     No Information Rate : 0.5128        
##     P-Value [Acc > NIR] : < 2.2e-16     
##                                         
##                   Kappa : 0.9634        
##                                         
##  Mcnemar's Test P-Value : 0.009823      
##                                         
##             Sensitivity : 0.9675        
##             Specificity : 0.9952        
##          Pos Pred Value : 0.9949        
##          Neg Pred Value : 0.9699        
##              Prevalence : 0.4872        
##          Detection Rate : 0.4714        
##    Detection Prevalence : 0.4738        
##       Balanced Accuracy : 0.9814        
##                                         
##        'Positive' Class : No            
## 
# Matriz de Confusion del Resultado de la Prueba
mcrp2 <- confusionMatrix(resultado_prueba2, prueba$target)
mcrp2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No  Si
##         No  96   4
##         Si   3 101
##                                           
##                Accuracy : 0.9657          
##                  95% CI : (0.9306, 0.9861)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9313          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9697          
##             Specificity : 0.9619          
##          Pos Pred Value : 0.9600          
##          Neg Pred Value : 0.9712          
##              Prevalence : 0.4853          
##          Detection Rate : 0.4706          
##    Detection Prevalence : 0.4902          
##       Balanced Accuracy : 0.9658          
##                                           
##        'Positive' Class : No              
## 

Modelo 3. SVM Polinomico

set.seed(123)
modelo3 <- train(target~., data=entrenamiento,
                 method = "svmPoly", #Cambiar
                 preProcess = c("center", "scale"),
                 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 confusion
# Es una tabla de evaluacion que desglosa el rendimiento del modelo de clasificacion

# Matriz de confusion del resultado del entrenamiento
mcre3 <- confusionMatrix(resultado_entrenamiento3,entrenamiento$target)
mcre3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No  Si
##         No 301  37
##         Si  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 : No              
## 
# Matriz de Confusion del Resultado de la Prueba
mcrp3 <- confusionMatrix(resultado_prueba3, prueba$target)
mcrp3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Si
##         No 78 10
##         Si 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 : No              
## 

Modelo 4. Arbol de Decision

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

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

# Matriz de confusion
# Es una tabla de evaluacion que desglosa el rendimiento del modelo de clasificacion

# Matriz de confusion del resultado del entrenamiento
mcre4 <- confusionMatrix(resultado_entrenamiento4,entrenamiento$target, positive = "Si")
mcre4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No  Si
##         No 360  29
##         Si  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.9311         
##             Specificity : 0.9000         
##          Pos Pred Value : 0.9074         
##          Neg Pred Value : 0.9254         
##              Prevalence : 0.5128         
##          Detection Rate : 0.4775         
##    Detection Prevalence : 0.5262         
##       Balanced Accuracy : 0.9156         
##                                          
##        'Positive' Class : Si             
## 
# Matriz de Confusion del Resultado de la Prueba
mcrp4 <- confusionMatrix(resultado_prueba4, prueba$target, positive = "Si")
mcrp4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Si
##         No 81  7
##         Si 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.9333          
##             Specificity : 0.8182          
##          Pos Pred Value : 0.8448          
##          Neg Pred Value : 0.9205          
##              Prevalence : 0.5147          
##          Detection Rate : 0.4804          
##    Detection Prevalence : 0.5686          
##       Balanced Accuracy : 0.8758          
##                                           
##        'Positive' Class : Si              
## 

Modelo 5. Bosques Aleatorios

set.seed(123)
modelo5 <- train(target~., data=entrenamiento,
                 method = "rf", #Cambiar
                 preProcess = c("center", "scale"),
                 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 confusion
# Es una tabla de evaluacion que desglosa el rendimiento del modelo de clasificacion

# Matriz de confusion del resultado del entrenamiento
mcre5 <- confusionMatrix(resultado_entrenamiento5,entrenamiento$target)
mcre5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No  Si
##         No 400   0
##         Si   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 : No         
## 
# Matriz de Confusion del Resultado de la Prueba
mcrp5 <- confusionMatrix(resultado_prueba5, prueba$target)
mcrp5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No  Si
##         No  99   0
##         Si   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 : No         
## 

Modelo 6. Redes Neuronales

set.seed(123)
modelo6 <- train(target~., data=entrenamiento,
                 method = "nnet", #Cambiar
                 preProcess = c("center", "scale"),
                 trControl = trainControl(method="cv", number=10)
                 )
## # weights:  16
## initial  value 598.070003 
## iter  10 value 369.745971
## iter  20 value 318.586618
## iter  30 value 312.047898
## iter  40 value 304.935000
## iter  50 value 302.142315
## iter  60 value 296.238554
## final  value 296.222794 
## converged
## # weights:  46
## initial  value 550.224059 
## iter  10 value 268.823209
## iter  20 value 225.165901
## iter  30 value 193.153855
## iter  40 value 179.245619
## iter  50 value 170.942276
## iter  60 value 165.359565
## iter  70 value 157.940144
## iter  80 value 152.277720
## iter  90 value 147.482218
## iter 100 value 141.495594
## final  value 141.495594 
## stopped after 100 iterations
## # weights:  76
## initial  value 536.833408 
## iter  10 value 219.569845
## iter  20 value 153.584987
## iter  30 value 130.967001
## iter  40 value 122.345628
## iter  50 value 120.473804
## iter  60 value 120.297283
## iter  70 value 120.281506
## iter  80 value 120.277832
## iter  90 value 120.247801
## iter 100 value 120.246144
## final  value 120.246144 
## stopped after 100 iterations
## # weights:  16
## initial  value 525.623338 
## iter  10 value 304.914662
## iter  20 value 279.434364
## iter  30 value 277.319242
## iter  40 value 277.067746
## iter  50 value 277.050035
## final  value 277.049441 
## converged
## # weights:  46
## initial  value 574.688908 
## iter  10 value 276.688037
## iter  20 value 228.319483
## iter  30 value 210.521476
## iter  40 value 201.503214
## iter  50 value 199.233552
## iter  60 value 198.664496
## iter  70 value 198.533576
## iter  80 value 198.528591
## final  value 198.528568 
## converged
## # weights:  76
## initial  value 527.017829 
## iter  10 value 308.841406
## iter  20 value 241.757792
## iter  30 value 208.504036
## iter  40 value 194.581932
## iter  50 value 163.084901
## iter  60 value 149.942872
## iter  70 value 144.216264
## iter  80 value 130.866051
## iter  90 value 124.436207
## iter 100 value 122.191241
## final  value 122.191241 
## stopped after 100 iterations
## # weights:  16
## initial  value 510.998588 
## iter  10 value 335.029777
## iter  20 value 282.512037
## iter  30 value 271.138625
## iter  40 value 258.214949
## iter  50 value 256.811723
## iter  60 value 255.095382
## iter  70 value 254.650475
## final  value 254.649650 
## converged
## # weights:  46
## initial  value 512.723239 
## iter  10 value 261.318128
## iter  20 value 222.904127
## iter  30 value 194.384537
## iter  40 value 172.077650
## iter  50 value 161.612508
## iter  60 value 160.954519
## iter  70 value 160.602346
## iter  80 value 160.494174
## iter  90 value 160.464360
## iter 100 value 160.301069
## final  value 160.301069 
## stopped after 100 iterations
## # weights:  76
## initial  value 624.472372 
## iter  10 value 245.613905
## iter  20 value 159.726065
## iter  30 value 87.564374
## iter  40 value 77.874231
## iter  50 value 76.216511
## iter  60 value 76.208404
## iter  70 value 75.205269
## final  value 75.205267 
## converged
## # weights:  16
## initial  value 597.543804 
## iter  10 value 375.567096
## iter  20 value 331.975090
## iter  30 value 317.547859
## iter  40 value 309.965252
## iter  50 value 264.521795
## iter  60 value 253.219036
## iter  70 value 251.080674
## iter  80 value 250.796268
## iter  90 value 239.884035
## iter 100 value 235.477333
## final  value 235.477333 
## stopped after 100 iterations
## # weights:  46
## initial  value 519.229350 
## iter  10 value 245.727991
## iter  20 value 208.593311
## iter  30 value 182.489489
## iter  40 value 164.683898
## iter  50 value 155.086050
## iter  60 value 154.085157
## iter  70 value 153.787158
## iter  80 value 153.494413
## iter  90 value 153.409485
## iter 100 value 153.265089
## final  value 153.265089 
## stopped after 100 iterations
## # weights:  76
## initial  value 553.124948 
## iter  10 value 248.374621
## iter  20 value 178.204451
## iter  30 value 137.636141
## iter  40 value 117.984361
## iter  50 value 111.926890
## iter  60 value 106.118993
## iter  70 value 105.368824
## iter  80 value 105.352372
## final  value 105.352275 
## converged
## # weights:  16
## initial  value 519.421691 
## iter  10 value 357.253452
## iter  20 value 280.841586
## iter  30 value 265.913348
## iter  40 value 265.789233
## iter  50 value 265.688796
## final  value 265.676671 
## converged
## # weights:  46
## initial  value 549.659739 
## iter  10 value 239.435364
## iter  20 value 210.100672
## iter  30 value 193.656080
## iter  40 value 188.992620
## iter  50 value 184.912178
## iter  60 value 183.936353
## iter  70 value 183.046886
## iter  80 value 180.929472
## iter  90 value 180.907122
## final  value 180.907069 
## converged
## # weights:  76
## initial  value 526.805872 
## iter  10 value 311.868585
## iter  20 value 234.199189
## iter  30 value 208.468186
## iter  40 value 182.747602
## iter  50 value 165.086903
## iter  60 value 155.596843
## iter  70 value 150.671804
## iter  80 value 148.783976
## iter  90 value 147.840567
## iter 100 value 147.221202
## final  value 147.221202 
## stopped after 100 iterations
## # weights:  16
## initial  value 530.039011 
## iter  10 value 333.676337
## iter  20 value 265.183656
## iter  30 value 253.744059
## iter  40 value 252.422804
## iter  50 value 251.228788
## iter  60 value 244.253125
## iter  70 value 241.865251
## iter  80 value 238.391713
## iter  90 value 238.104172
## iter 100 value 237.873161
## final  value 237.873161 
## stopped after 100 iterations
## # weights:  46
## initial  value 545.253415 
## iter  10 value 261.786577
## iter  20 value 214.991932
## iter  30 value 190.136493
## iter  40 value 172.080623
## iter  50 value 165.164837
## iter  60 value 164.837425
## iter  70 value 164.694755
## iter  80 value 164.345638
## iter  90 value 164.249619
## iter 100 value 164.114532
## final  value 164.114532 
## stopped after 100 iterations
## # weights:  76
## initial  value 612.678745 
## iter  10 value 231.840036
## iter  20 value 135.141711
## iter  30 value 99.891461
## iter  40 value 64.348560
## iter  50 value 59.434500
## iter  60 value 58.092818
## iter  70 value 57.712663
## iter  80 value 57.534188
## iter  90 value 57.258844
## iter 100 value 56.831574
## final  value 56.831574 
## stopped after 100 iterations
## # weights:  16
## initial  value 511.270745 
## iter  10 value 258.143794
## iter  20 value 250.677944
## iter  30 value 243.946459
## iter  40 value 234.714506
## iter  50 value 234.213035
## iter  60 value 233.751989
## iter  70 value 233.175586
## iter  80 value 233.173842
## iter  90 value 233.172514
## final  value 233.172281 
## converged
## # weights:  46
## initial  value 519.715161 
## iter  10 value 236.000048
## iter  20 value 201.423670
## iter  30 value 168.884214
## iter  40 value 142.289505
## iter  50 value 134.221297
## iter  60 value 131.062194
## iter  70 value 128.961351
## iter  80 value 125.653791
## iter  90 value 124.992525
## iter 100 value 124.948102
## final  value 124.948102 
## stopped after 100 iterations
## # weights:  76
## initial  value 577.709701 
## iter  10 value 226.850697
## iter  20 value 155.580977
## iter  30 value 117.796563
## iter  40 value 95.540703
## iter  50 value 89.885866
## iter  60 value 87.827414
## iter  70 value 87.655896
## iter  80 value 87.349938
## iter  90 value 87.122429
## iter 100 value 86.927929
## final  value 86.927929 
## stopped after 100 iterations
## # weights:  16
## initial  value 577.101653 
## iter  10 value 268.153204
## iter  20 value 258.493182
## iter  30 value 255.006264
## final  value 255.005814 
## converged
## # weights:  46
## initial  value 504.550115 
## iter  10 value 254.425186
## iter  20 value 199.316613
## iter  30 value 191.840853
## iter  40 value 189.940875
## iter  50 value 189.493410
## iter  60 value 189.435932
## iter  70 value 189.132683
## iter  80 value 185.033122
## iter  90 value 183.481166
## iter 100 value 183.379845
## final  value 183.379845 
## stopped after 100 iterations
## # weights:  76
## initial  value 532.792234 
## iter  10 value 227.788559
## iter  20 value 182.001295
## iter  30 value 155.668789
## iter  40 value 139.694448
## iter  50 value 134.690627
## iter  60 value 132.366190
## iter  70 value 131.586089
## iter  80 value 131.005888
## iter  90 value 130.755486
## iter 100 value 130.703433
## final  value 130.703433 
## stopped after 100 iterations
## # weights:  16
## initial  value 524.278519 
## iter  10 value 330.903940
## iter  20 value 249.768811
## iter  30 value 248.956147
## iter  40 value 248.878522
## iter  50 value 248.874485
## iter  60 value 248.854993
## iter  60 value 248.854993
## iter  60 value 248.854993
## final  value 248.854993 
## converged
## # weights:  46
## initial  value 492.145523 
## iter  10 value 242.055945
## iter  20 value 206.513376
## iter  30 value 189.313322
## iter  40 value 174.696103
## iter  50 value 173.673015
## iter  60 value 173.368292
## iter  70 value 172.719971
## iter  80 value 172.328604
## iter  90 value 172.164532
## iter 100 value 171.750128
## final  value 171.750128 
## stopped after 100 iterations
## # weights:  76
## initial  value 474.983875 
## iter  10 value 215.081049
## iter  20 value 147.163345
## iter  30 value 123.706663
## iter  40 value 101.559163
## iter  50 value 94.280383
## iter  60 value 92.703741
## iter  70 value 92.601423
## iter  80 value 92.542354
## iter  90 value 92.488784
## iter 100 value 92.382269
## final  value 92.382269 
## stopped after 100 iterations
## # weights:  16
## initial  value 519.575163 
## iter  10 value 326.298166
## iter  20 value 264.127615
## iter  30 value 252.998101
## iter  40 value 251.112753
## iter  50 value 244.288317
## iter  60 value 233.760864
## iter  70 value 233.542937
## iter  80 value 233.535723
## iter  90 value 233.532679
## final  value 233.532526 
## converged
## # weights:  46
## initial  value 501.969253 
## iter  10 value 274.379068
## iter  20 value 232.024844
## iter  30 value 203.337640
## iter  40 value 158.583898
## iter  50 value 143.138313
## iter  60 value 136.480698
## iter  70 value 132.721364
## iter  80 value 131.564162
## iter  90 value 127.960561
## iter 100 value 127.362562
## final  value 127.362562 
## stopped after 100 iterations
## # weights:  76
## initial  value 538.002227 
## iter  10 value 249.989275
## iter  20 value 162.983632
## iter  30 value 127.447620
## iter  40 value 100.371908
## iter  50 value 85.459497
## iter  60 value 82.795332
## iter  70 value 82.410730
## iter  80 value 82.292053
## iter  90 value 82.058922
## iter 100 value 82.023676
## final  value 82.023676 
## stopped after 100 iterations
## # weights:  16
## initial  value 515.686369 
## iter  10 value 294.264042
## iter  20 value 262.768850
## iter  30 value 262.333618
## iter  40 value 262.332744
## final  value 262.332716 
## converged
## # weights:  46
## initial  value 562.881857 
## iter  10 value 236.588172
## iter  20 value 209.280850
## iter  30 value 203.879700
## iter  40 value 202.082676
## iter  50 value 199.101101
## iter  60 value 197.104671
## iter  70 value 195.526605
## iter  80 value 192.366409
## iter  90 value 192.046320
## iter 100 value 192.009452
## final  value 192.009452 
## stopped after 100 iterations
## # weights:  76
## initial  value 504.776201 
## iter  10 value 230.424302
## iter  20 value 183.114864
## iter  30 value 166.615283
## iter  40 value 150.378716
## iter  50 value 142.185779
## iter  60 value 128.008827
## iter  70 value 122.324242
## iter  80 value 116.183414
## iter  90 value 113.352549
## iter 100 value 110.998493
## final  value 110.998493 
## stopped after 100 iterations
## # weights:  16
## initial  value 518.973512 
## iter  10 value 306.369696
## iter  20 value 258.823915
## iter  30 value 247.246092
## iter  40 value 238.601191
## iter  50 value 237.613340
## iter  60 value 237.350545
## iter  70 value 237.182172
## iter  80 value 237.140490
## iter  90 value 237.129932
## iter 100 value 237.128096
## final  value 237.128096 
## stopped after 100 iterations
## # weights:  46
## initial  value 542.493039 
## iter  10 value 236.912376
## iter  20 value 184.792884
## iter  30 value 157.188751
## iter  40 value 144.215086
## iter  50 value 137.532633
## iter  60 value 136.935194
## iter  70 value 136.773416
## iter  80 value 136.698131
## iter  90 value 136.627905
## iter 100 value 136.573329
## final  value 136.573329 
## stopped after 100 iterations
## # weights:  76
## initial  value 540.079354 
## iter  10 value 222.316849
## iter  20 value 127.795016
## iter  30 value 97.465520
## iter  40 value 88.142920
## iter  50 value 81.902969
## iter  60 value 80.972972
## iter  70 value 79.732584
## iter  80 value 74.669612
## iter  90 value 74.416066
## iter 100 value 74.362102
## final  value 74.362102 
## stopped after 100 iterations
## # weights:  16
## initial  value 535.056293 
## iter  10 value 360.764071
## iter  20 value 286.874569
## iter  30 value 280.670607
## iter  40 value 279.208411
## iter  50 value 269.477561
## iter  60 value 268.716914
## final  value 268.715864 
## converged
## # weights:  46
## initial  value 516.684715 
## iter  10 value 295.426984
## iter  20 value 247.769635
## iter  30 value 200.961561
## iter  40 value 180.853544
## iter  50 value 163.729716
## iter  60 value 153.021257
## iter  70 value 150.764499
## iter  80 value 149.968706
## iter  90 value 147.225904
## iter 100 value 146.858637
## final  value 146.858637 
## stopped after 100 iterations
## # weights:  76
## initial  value 566.396754 
## iter  10 value 231.937693
## iter  20 value 128.162936
## iter  30 value 104.689544
## iter  40 value 100.574544
## iter  50 value 93.724091
## iter  60 value 91.421004
## iter  70 value 89.612849
## iter  80 value 88.822296
## iter  90 value 88.491288
## iter 100 value 88.440221
## final  value 88.440221 
## stopped after 100 iterations
## # weights:  16
## initial  value 521.982778 
## iter  10 value 325.337616
## iter  20 value 300.327197
## iter  30 value 287.183311
## iter  40 value 273.865830
## iter  50 value 273.705959
## iter  60 value 273.695922
## final  value 273.695716 
## converged
## # weights:  46
## initial  value 516.690643 
## iter  10 value 262.729916
## iter  20 value 215.648008
## iter  30 value 200.762615
## iter  40 value 195.110716
## iter  50 value 193.930862
## iter  60 value 193.842163
## iter  70 value 193.830463
## final  value 193.830359 
## converged
## # weights:  76
## initial  value 523.624449 
## iter  10 value 244.067075
## iter  20 value 192.247221
## iter  30 value 160.853326
## iter  40 value 150.031059
## iter  50 value 142.568617
## iter  60 value 139.883459
## iter  70 value 139.259914
## iter  80 value 136.956951
## iter  90 value 133.590956
## iter 100 value 124.109851
## final  value 124.109851 
## stopped after 100 iterations
## # weights:  16
## initial  value 559.344720 
## iter  10 value 289.875476
## iter  20 value 266.623123
## iter  30 value 264.502802
## iter  40 value 263.638888
## iter  50 value 263.587730
## iter  60 value 263.280580
## iter  70 value 263.230741
## iter  80 value 263.219008
## iter  90 value 263.207610
## iter 100 value 263.194204
## final  value 263.194204 
## stopped after 100 iterations
## # weights:  46
## initial  value 497.310159 
## iter  10 value 246.782377
## iter  20 value 200.301468
## iter  30 value 172.473982
## iter  40 value 160.203264
## iter  50 value 153.912949
## iter  60 value 143.658645
## iter  70 value 141.978803
## iter  80 value 141.508152
## iter  90 value 141.093662
## iter 100 value 140.904183
## final  value 140.904183 
## stopped after 100 iterations
## # weights:  76
## initial  value 571.814988 
## iter  10 value 234.664943
## iter  20 value 166.454739
## iter  30 value 117.269555
## iter  40 value 93.206784
## iter  50 value 85.501113
## iter  60 value 81.593973
## iter  70 value 79.010873
## iter  80 value 77.718919
## iter  90 value 77.334193
## iter 100 value 77.155927
## final  value 77.155927 
## stopped after 100 iterations
## # weights:  16
## initial  value 544.057584 
## iter  10 value 339.698304
## iter  20 value 272.876739
## iter  30 value 262.237030
## iter  40 value 256.712282
## iter  50 value 251.307907
## iter  60 value 233.603008
## iter  70 value 230.821387
## iter  80 value 230.789163
## iter  90 value 230.782674
## iter 100 value 230.776365
## final  value 230.776365 
## stopped after 100 iterations
## # weights:  46
## initial  value 573.722435 
## iter  10 value 288.539258
## iter  20 value 228.819903
## iter  30 value 217.993006
## iter  40 value 209.842231
## iter  50 value 200.307312
## iter  60 value 193.026626
## iter  70 value 192.470396
## final  value 192.469819 
## converged
## # weights:  76
## initial  value 489.110225 
## iter  10 value 224.746603
## iter  20 value 158.734722
## iter  30 value 101.281323
## iter  40 value 87.697010
## iter  50 value 82.812457
## iter  60 value 78.645045
## iter  70 value 77.666229
## iter  80 value 77.646864
## iter  90 value 77.646091
## iter 100 value 77.629206
## final  value 77.629206 
## stopped after 100 iterations
## # weights:  16
## initial  value 512.907700 
## iter  10 value 317.756755
## iter  20 value 279.227186
## iter  30 value 274.561592
## iter  40 value 273.163108
## iter  50 value 272.372615
## iter  60 value 269.736829
## iter  70 value 269.406694
## iter  80 value 269.404720
## final  value 269.404234 
## converged
## # weights:  46
## initial  value 515.117361 
## iter  10 value 287.593807
## iter  20 value 223.175112
## iter  30 value 205.065914
## iter  40 value 189.841805
## iter  50 value 183.638025
## iter  60 value 180.902032
## iter  70 value 177.561093
## iter  80 value 173.418652
## iter  90 value 173.070700
## iter 100 value 173.069523
## final  value 173.069523 
## stopped after 100 iterations
## # weights:  76
## initial  value 558.969073 
## iter  10 value 225.879094
## iter  20 value 190.930927
## iter  30 value 163.870598
## iter  40 value 150.374852
## iter  50 value 143.371431
## iter  60 value 135.879318
## iter  70 value 126.983755
## iter  80 value 124.863513
## iter  90 value 124.140903
## iter 100 value 123.991933
## final  value 123.991933 
## stopped after 100 iterations
## # weights:  16
## initial  value 484.566800 
## iter  10 value 273.183420
## iter  20 value 269.378786
## iter  30 value 253.745624
## iter  40 value 252.623909
## iter  50 value 252.535209
## iter  60 value 252.516859
## iter  70 value 252.494014
## iter  80 value 252.491030
## iter  90 value 252.487843
## iter 100 value 252.486586
## final  value 252.486586 
## stopped after 100 iterations
## # weights:  46
## initial  value 492.073227 
## iter  10 value 236.394969
## iter  20 value 203.015391
## iter  30 value 191.795754
## iter  40 value 182.716617
## iter  50 value 180.445831
## iter  60 value 179.586274
## iter  70 value 179.448074
## iter  80 value 179.351384
## iter  90 value 178.780399
## iter 100 value 178.696053
## final  value 178.696053 
## stopped after 100 iterations
## # weights:  76
## initial  value 712.162821 
## iter  10 value 223.179422
## iter  20 value 142.397214
## iter  30 value 125.021825
## iter  40 value 111.895519
## iter  50 value 106.584364
## iter  60 value 105.444668
## iter  70 value 105.241079
## iter  80 value 105.026093
## iter  90 value 104.650053
## iter 100 value 104.333381
## final  value 104.333381 
## stopped after 100 iterations
## # weights:  16
## initial  value 526.401719 
## iter  10 value 286.470125
## iter  20 value 257.094393
## iter  30 value 252.519335
## iter  40 value 249.308407
## iter  50 value 246.397726
## iter  60 value 236.088510
## iter  70 value 235.839650
## final  value 235.838698 
## converged
## # weights:  46
## initial  value 531.411429 
## iter  10 value 245.024569
## iter  20 value 180.217740
## iter  30 value 155.205243
## iter  40 value 137.940949
## iter  50 value 133.335364
## iter  60 value 132.800519
## iter  70 value 132.792962
## final  value 132.792949 
## converged
## # weights:  76
## initial  value 502.072156 
## iter  10 value 216.514670
## iter  20 value 141.985317
## iter  30 value 103.799975
## iter  40 value 88.035673
## iter  50 value 79.114921
## iter  60 value 77.312636
## iter  70 value 76.477030
## iter  80 value 75.291396
## iter  90 value 75.221855
## iter 100 value 75.219492
## final  value 75.219492 
## stopped after 100 iterations
## # weights:  16
## initial  value 508.761236 
## iter  10 value 300.073920
## iter  20 value 268.672660
## iter  30 value 266.462211
## iter  40 value 265.751267
## iter  50 value 265.513857
## final  value 265.490234 
## converged
## # weights:  46
## initial  value 513.166894 
## iter  10 value 243.015458
## iter  20 value 214.898951
## iter  30 value 204.031770
## iter  40 value 201.631728
## iter  50 value 200.517973
## iter  60 value 199.150062
## iter  70 value 197.769060
## iter  80 value 197.492737
## iter  90 value 197.432622
## iter 100 value 197.428399
## final  value 197.428399 
## stopped after 100 iterations
## # weights:  76
## initial  value 574.132331 
## iter  10 value 238.392797
## iter  20 value 187.996935
## iter  30 value 154.007496
## iter  40 value 142.959360
## iter  50 value 139.142084
## iter  60 value 138.448262
## iter  70 value 138.016469
## iter  80 value 137.595035
## iter  90 value 136.888571
## iter 100 value 136.098228
## final  value 136.098228 
## stopped after 100 iterations
## # weights:  16
## initial  value 522.286374 
## iter  10 value 297.837777
## iter  20 value 267.586182
## iter  30 value 263.946660
## iter  40 value 263.814777
## iter  50 value 263.488030
## iter  60 value 263.011011
## final  value 263.010601 
## converged
## # weights:  46
## initial  value 515.509802 
## iter  10 value 251.676246
## iter  20 value 198.813299
## iter  30 value 168.558400
## iter  40 value 154.212496
## iter  50 value 147.731995
## iter  60 value 136.599438
## iter  70 value 135.618004
## iter  80 value 133.475880
## iter  90 value 131.888375
## iter 100 value 131.781912
## final  value 131.781912 
## stopped after 100 iterations
## # weights:  76
## initial  value 658.885449 
## iter  10 value 246.144070
## iter  20 value 180.571942
## iter  30 value 135.936579
## iter  40 value 108.613725
## iter  50 value 96.893821
## iter  60 value 92.950900
## iter  70 value 91.741527
## iter  80 value 91.371402
## iter  90 value 91.074766
## iter 100 value 90.130708
## final  value 90.130708 
## stopped after 100 iterations
## # weights:  16
## initial  value 543.017564 
## iter  10 value 284.704742
## iter  20 value 272.601672
## iter  30 value 266.170262
## iter  40 value 262.532545
## iter  50 value 251.757859
## iter  60 value 247.562507
## final  value 247.553985 
## converged
## # weights:  46
## initial  value 493.112831 
## iter  10 value 250.124276
## iter  20 value 198.804020
## iter  30 value 164.453446
## iter  40 value 145.064824
## iter  50 value 127.554226
## iter  60 value 122.678992
## iter  70 value 122.562191
## final  value 122.561900 
## converged
## # weights:  76
## initial  value 597.476932 
## iter  10 value 218.652655
## iter  20 value 137.027841
## iter  30 value 113.319862
## iter  40 value 105.829968
## iter  50 value 102.423122
## iter  60 value 98.657770
## iter  70 value 97.908099
## iter  80 value 96.352002
## iter  90 value 93.656138
## iter 100 value 91.167981
## final  value 91.167981 
## stopped after 100 iterations
## # weights:  16
## initial  value 555.624762 
## iter  10 value 308.568661
## iter  20 value 272.358904
## iter  30 value 271.784584
## final  value 271.784478 
## converged
## # weights:  46
## initial  value 507.999447 
## iter  10 value 252.556507
## iter  20 value 221.586348
## iter  30 value 192.884281
## iter  40 value 181.898839
## iter  50 value 180.150668
## iter  60 value 180.034271
## iter  70 value 180.017198
## final  value 180.016420 
## converged
## # weights:  76
## initial  value 523.619842 
## iter  10 value 267.895034
## iter  20 value 210.784682
## iter  30 value 180.369929
## iter  40 value 158.170228
## iter  50 value 148.828936
## iter  60 value 146.469802
## iter  70 value 135.702736
## iter  80 value 132.098146
## iter  90 value 129.617292
## iter 100 value 128.593589
## final  value 128.593589 
## stopped after 100 iterations
## # weights:  16
## initial  value 543.410454 
## iter  10 value 291.271218
## iter  20 value 269.500195
## iter  30 value 267.870014
## iter  40 value 266.155467
## iter  50 value 265.370430
## iter  60 value 264.377480
## iter  70 value 264.117634
## iter  80 value 264.111524
## iter  90 value 264.038814
## iter 100 value 263.992240
## final  value 263.992240 
## stopped after 100 iterations
## # weights:  46
## initial  value 486.222234 
## iter  10 value 262.874130
## iter  20 value 232.561992
## iter  30 value 197.622836
## iter  40 value 183.263919
## iter  50 value 180.029607
## iter  60 value 178.379966
## iter  70 value 177.175007
## iter  80 value 175.286274
## iter  90 value 173.745620
## iter 100 value 172.596562
## final  value 172.596562 
## stopped after 100 iterations
## # weights:  76
## initial  value 538.144545 
## iter  10 value 254.116809
## iter  20 value 197.804817
## iter  30 value 144.812444
## iter  40 value 107.623542
## iter  50 value 97.757835
## iter  60 value 93.777643
## iter  70 value 91.131354
## iter  80 value 90.075144
## iter  90 value 89.893878
## iter 100 value 89.733324
## final  value 89.733324 
## stopped after 100 iterations
## # weights:  16
## initial  value 554.616048 
## iter  10 value 270.446289
## iter  20 value 260.535619
## iter  30 value 259.912498
## iter  40 value 258.628532
## iter  50 value 251.533929
## iter  60 value 232.470013
## iter  70 value 231.399297
## iter  80 value 231.395414
## iter  90 value 231.394926
## iter 100 value 231.394522
## final  value 231.394522 
## stopped after 100 iterations
## # weights:  46
## initial  value 534.040075 
## iter  10 value 251.615241
## iter  20 value 200.260807
## iter  30 value 190.243403
## iter  40 value 178.683721
## iter  50 value 170.628780
## iter  60 value 169.232415
## iter  70 value 169.226711
## final  value 169.226683 
## converged
## # weights:  76
## initial  value 546.404181 
## iter  10 value 223.651947
## iter  20 value 132.781766
## iter  30 value 78.350904
## iter  40 value 65.450404
## iter  50 value 61.739757
## iter  60 value 58.533604
## iter  70 value 57.760801
## iter  80 value 57.378527
## iter  90 value 57.297908
## iter 100 value 57.283364
## final  value 57.283364 
## stopped after 100 iterations
## # weights:  16
## initial  value 517.816287 
## iter  10 value 302.081578
## iter  20 value 271.614641
## iter  30 value 265.535689
## iter  40 value 264.846687
## iter  50 value 264.207620
## iter  60 value 264.009279
## iter  70 value 263.428571
## iter  80 value 263.132960
## final  value 263.131759 
## converged
## # weights:  46
## initial  value 490.807651 
## iter  10 value 250.091687
## iter  20 value 219.911949
## iter  30 value 200.903718
## iter  40 value 194.184350
## iter  50 value 191.330393
## iter  60 value 190.301147
## iter  70 value 183.570751
## iter  80 value 183.371938
## iter  90 value 183.368529
## final  value 183.368500 
## converged
## # weights:  76
## initial  value 499.634305 
## iter  10 value 245.756517
## iter  20 value 183.191953
## iter  30 value 162.763992
## iter  40 value 155.941538
## iter  50 value 148.712176
## iter  60 value 145.177770
## iter  70 value 141.551277
## iter  80 value 140.345077
## iter  90 value 139.712118
## iter 100 value 138.199861
## final  value 138.199861 
## stopped after 100 iterations
## # weights:  16
## initial  value 507.252289 
## iter  10 value 261.767452
## iter  20 value 259.927194
## iter  30 value 248.078356
## iter  40 value 241.428885
## iter  50 value 240.880350
## iter  60 value 237.883655
## iter  70 value 237.595150
## iter  80 value 237.430944
## iter  90 value 237.150631
## iter 100 value 237.051428
## final  value 237.051428 
## stopped after 100 iterations
## # weights:  46
## initial  value 497.524468 
## iter  10 value 260.689443
## iter  20 value 210.732494
## iter  30 value 185.068257
## iter  40 value 163.252759
## iter  50 value 149.791817
## iter  60 value 143.800415
## iter  70 value 140.493912
## iter  80 value 140.290468
## iter  90 value 140.185323
## iter 100 value 140.102216
## final  value 140.102216 
## stopped after 100 iterations
## # weights:  76
## initial  value 469.656948 
## iter  10 value 195.104958
## iter  20 value 137.509551
## iter  30 value 94.100642
## iter  40 value 79.079544
## iter  50 value 69.740200
## iter  60 value 66.687543
## iter  70 value 66.296918
## iter  80 value 66.177071
## iter  90 value 66.081333
## iter 100 value 65.952797
## final  value 65.952797 
## stopped after 100 iterations
## # weights:  16
## initial  value 526.617147 
## iter  10 value 272.427932
## iter  20 value 249.606758
## iter  30 value 246.997534
## iter  40 value 238.910347
## iter  50 value 238.546090
## iter  60 value 231.285404
## final  value 231.129242 
## converged
## # weights:  46
## initial  value 516.145516 
## iter  10 value 237.320669
## iter  20 value 207.220398
## iter  30 value 188.303685
## iter  40 value 174.420447
## iter  50 value 171.544797
## iter  60 value 169.245419
## iter  70 value 167.844293
## iter  80 value 167.039725
## iter  90 value 166.476626
## iter 100 value 166.390644
## final  value 166.390644 
## stopped after 100 iterations
## # weights:  76
## initial  value 483.660251 
## iter  10 value 228.173675
## iter  20 value 168.638415
## iter  30 value 107.156258
## iter  40 value 79.375633
## iter  50 value 72.399523
## iter  60 value 66.855990
## iter  70 value 65.074131
## iter  80 value 64.815776
## iter  90 value 64.784612
## final  value 64.783706 
## converged
## # weights:  16
## initial  value 525.459400 
## iter  10 value 266.335204
## iter  20 value 261.709806
## iter  30 value 261.454454
## final  value 261.454220 
## converged
## # weights:  46
## initial  value 505.487459 
## iter  10 value 254.944076
## iter  20 value 216.643057
## iter  30 value 206.817589
## iter  40 value 203.429390
## iter  50 value 197.943270
## iter  60 value 194.357575
## iter  70 value 193.607056
## iter  80 value 192.974605
## iter  90 value 192.145781
## iter 100 value 192.073737
## final  value 192.073737 
## stopped after 100 iterations
## # weights:  76
## initial  value 481.703118 
## iter  10 value 217.127308
## iter  20 value 165.979950
## iter  30 value 143.087932
## iter  40 value 126.955919
## iter  50 value 120.676013
## iter  60 value 117.823827
## iter  70 value 115.179357
## iter  80 value 114.746836
## iter  90 value 114.710898
## iter 100 value 114.710235
## final  value 114.710235 
## stopped after 100 iterations
## # weights:  16
## initial  value 566.870627 
## iter  10 value 300.789058
## iter  20 value 256.909569
## iter  30 value 256.026418
## iter  40 value 255.884158
## iter  50 value 255.867644
## iter  60 value 255.821489
## final  value 255.821191 
## converged
## # weights:  46
## initial  value 552.625121 
## iter  10 value 255.726379
## iter  20 value 214.744624
## iter  30 value 189.463014
## iter  40 value 180.784945
## iter  50 value 176.596250
## iter  60 value 175.854284
## iter  70 value 175.508912
## iter  80 value 175.097244
## iter  90 value 175.040210
## iter 100 value 174.942240
## final  value 174.942240 
## stopped after 100 iterations
## # weights:  76
## initial  value 527.856982 
## iter  10 value 242.159342
## iter  20 value 154.611355
## iter  30 value 113.587789
## iter  40 value 104.416855
## iter  50 value 86.705452
## iter  60 value 69.254427
## iter  70 value 64.336762
## iter  80 value 63.081194
## iter  90 value 56.240239
## iter 100 value 53.503057
## final  value 53.503057 
## stopped after 100 iterations
## # weights:  76
## initial  value 693.075834 
## iter  10 value 267.041699
## iter  20 value 202.453773
## iter  30 value 184.754282
## iter  40 value 173.751178
## iter  50 value 162.977504
## iter  60 value 153.693060
## iter  70 value 142.942397
## iter  80 value 134.630020
## iter  90 value 133.739501
## iter 100 value 133.343228
## final  value 133.343228 
## stopped after 100 iterations
resultado_entrenamiento6 <- predict(modelo6,entrenamiento)
resultado_prueba6 <- predict(modelo6,prueba)

# Matriz de confusion
# Es una tabla de evaluacion que desglosa el rendimiento del modelo de clasificacion

# Matriz de confusion del resultado del entrenamiento
mcre6 <- confusionMatrix(resultado_entrenamiento6,entrenamiento$target)
mcre6
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No  Si
##         No 395   9
##         Si   5 412
##                                           
##                Accuracy : 0.9829          
##                  95% CI : (0.9716, 0.9906)
##     No Information Rate : 0.5128          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9659          
##                                           
##  Mcnemar's Test P-Value : 0.4227          
##                                           
##             Sensitivity : 0.9875          
##             Specificity : 0.9786          
##          Pos Pred Value : 0.9777          
##          Neg Pred Value : 0.9880          
##              Prevalence : 0.4872          
##          Detection Rate : 0.4811          
##    Detection Prevalence : 0.4921          
##       Balanced Accuracy : 0.9831          
##                                           
##        'Positive' Class : No              
## 
# Matriz de Confusion del Resultado de la Prueba
mcrp6 <- confusionMatrix(resultado_prueba6, prueba$target)
mcrp6
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Si
##         No 97  6
##         Si  2 99
##                                           
##                Accuracy : 0.9608          
##                  95% CI : (0.9242, 0.9829)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9216          
##                                           
##  Mcnemar's Test P-Value : 0.2888          
##                                           
##             Sensitivity : 0.9798          
##             Specificity : 0.9429          
##          Pos Pred Value : 0.9417          
##          Neg Pred Value : 0.9802          
##              Prevalence : 0.4853          
##          Detection Rate : 0.4755          
##    Detection Prevalence : 0.5049          
##       Balanced Accuracy : 0.9613          
##                                           
##        'Positive' Class : No              
## 

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"])
)
rownames(resultados) <- c("Entrenamiento", "Prueba")
resultados
##               svmLinear svmRadial   svmPoly     rpart rf      nnet
## Entrenamiento 0.8343484 0.9817296 0.8343484 0.9159562  1 0.9829476
## Prueba        0.8480392 0.9656863 0.8480392 0.8774510  1 0.9607843

Conclusion

El modelo Random Forest es el mejor modelo para la clasificacion de si una persona tiene problemas cardiacos o no, seguido del modelo svmRadial.

LS0tCnRpdGxlOiAiSGVhcnQiCmF1dGhvcjogIkV1cmllbCBHb21leiIKZGF0ZTogIjIwMjYtMDgtMjkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogc2FuZHN0b25lCi0tLQoKIVtdKGh0dHBzOi8vaS5waW5pbWcuY29tL29yaWdpbmFscy82Ny8zNy85My82NzM3OTM2NmNiMmYxYzVmOWFkNGNmNGY5ZTUyOTgwOS5naWYpCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5JbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXJpYXM8L3NwYW4+CmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpICMgQWxnb3JpdG1vcyBkZSBhcHJlbmRpemFqZSBhdXRvbWF0aWNvCmxpYnJhcnkoY2FyZXQpCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgIyBHcmFmaWNhcwpsaWJyYXJ5KGdncGxvdDIpCiNpbnN0YWxsLnBhY2thZ2VzKCJsYXR0aWNlIikgIyBjcmVhciBncmFmaWNvcwpsaWJyYXJ5KGxhdHRpY2UpCiNpbnN0YWxsLnBhY2thZ2VzKCJEYXRhRXhwbG9yZXIiKSAjIEFuYWxpc2lzIGRlc2NyaXB0aXZvCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQojaW5zdGFsbC5wYWNrYWdlcygia2VybmxhYiIpCmxpYnJhcnkoa2VybmxhYikKI2luc3RhbGwucGFja2FnZXMoInJhbmRvbUZvcmVzdCIpCmxpYnJhcnkocmFuZG9tRm9yZXN0KQojaW5zdGFsbC5wYWNrYWdlcygibm5ldCIpCmxpYnJhcnkobm5ldCkKYGBgCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPkNyZWFyIGJhc2UgZGUgZGF0b3M8L3NwYW4+CmBgYHtyfQojZmlsZS5jaG9vc2UoKQpkZiA8LSByZWFkLmNzdigiL1VzZXJzL2V1cmllbGdvbWV6dGFtZXovTGlicmFyeS9Nb2JpbGUgRG9jdW1lbnRzL2NvbX5hcHBsZX5DbG91ZERvY3MvVGVjLzcvTTIvaGVhcnQuY3N2IikKZGYkdGFyZ2V0IDwtIGZhY3RvcihkZiR0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygwLCAxKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJObyIsICJTaSIpKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPkVudGVuZGVyIGxhIGJhc2UgZGUgZGF0b3M8L3NwYW4+CmBgYHtyfQpzdW1tYXJ5KGRmKQpzdHIoZGYpCiNjcmVhdGVfcmVwb3J0KGRmKQpwbG90X21pc3NpbmcoZGYpCnBsb3RfaGlzdG9ncmFtKGRmKQpwbG90X2NvcnJlbGF0aW9uKGRmKQp0YWJsZShkZiR0YXJnZXQpCnByb3AudGFibGUodGFibGUoZGYkdGFyZ2V0KSkKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5QYXJ0aXIgbGEgYmFzZSBkZSBkYXRvczwvc3Bhbj4KYGBge3J9CiMgbm9ybWFsbWVudGUgODAtMjAgbyA3MC0zMApzZXQuc2VlZCgxMjMpCnJlbmdsb25lc19lbnRyZW5hbWllbnRvIDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oZGYkdGFyZ2V0LCBwPTAuOCwgbGlzdD1GQUxTRSkKZW50cmVuYW1pZW50byA8LSBkZltyZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQpwcnVlYmEgPC0gZGZbLXJlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+RGlzdGludG9zIHRpcG9zIGRlIG1ldG9kb3MgcGFyYSBtb2RlbGFyPC9zcGFuPgpMb3MgbWV0b2RvcyBtYXMgdXRpbGl6YWRvcyBwYXJhIG1vZGVsYXIgYXByZW5kaXphamUgYXV0b21hdGljbyBzb246CgoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE1hcXVpbmEgZGUgVmVjdG9yZXMgZGUgU29wb3J0ZS4gSGF5IHZhcmlvcyBzdWJ0aXBvczogTGluZWFsIChzdm1MaW5lYXIpLCBSYWRpYWwgKHN2bVJhZGlhbCksIFBvbGlub21pY28gKHN2bVBvbHkpLCBldGMuICAKKiAqKkFyYm9sIGRlIERlY2lzaW9uKio6IHJwYXJ0ICAKKiAqKlJlZGVzIE5ldXJvbmFsZXMqKjogbm5ldCAgCiogKipSYW5kb20gRm9yZXN0Kio6IG8gQm9zcXVlcyBBbGVhdG9yaW9zOiByZiAgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5Nb2RlbG8gMS4gU1ZNIExpbmVhbDwvc3Bhbj4KYGBge3J9CnNldC5zZWVkKDEyMykKbW9kZWxvMSA8LSB0cmFpbih0YXJnZXR+LiwgZGF0YT1lbnRyZW5hbWllbnRvLAogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1MaW5lYXIiLCAjQ2FtYmlhcgogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJjZW50ZXIiLCAic2NhbGUiKSwKICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksCiAgICAgICAgICAgICAgICAgdHVuZUdyaWQgPSBkYXRhLmZyYW1lKEM9MSkgIyBDYW1iaWFyCiAgICAgICAgICAgICAgICAgKQoKcmVzdWx0YWRvX2VudHJlbmFtaWVudG8xIDwtIHByZWRpY3QobW9kZWxvMSxlbnRyZW5hbWllbnRvKQpyZXN1bHRhZG9fcHJ1ZWJhMSA8LSBwcmVkaWN0KG1vZGVsbzEscHJ1ZWJhKQoKIyBNYXRyaXogZGUgY29uZnVzaW9uCiMgRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpb24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2lvbgoKIyBNYXRyaXogZGUgY29uZnVzaW9uIGRlbCByZXN1bHRhZG8gZGVsIGVudHJlbmFtaWVudG8KbWNyZTEgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSxlbnRyZW5hbWllbnRvJHRhcmdldCkKbWNyZTEKCiMgTWF0cml6IGRlIENvbmZ1c2lvbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQptY3JwMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTEsIHBydWViYSR0YXJnZXQpCm1jcnAxCgpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPk1vZGVsbyAyLiBTVk0gUmFkaWFsPC9zcGFuPgpgYGB7cn0Kc2V0LnNlZWQoMTIzKQptb2RlbG8yIDwtIHRyYWluKHRhcmdldH4uLCBkYXRhPWVudHJlbmFtaWVudG8sCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bVJhZGlhbCIsICNDYW1iaWFyCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoImNlbnRlciIsICJzY2FsZSIpLAogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwKICAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGV4cGFuZC5ncmlkKHNpZ21hID0gYygwLjAxLCAwLjA1LCAwLjEpLCBDID0gYygwLjUsIDEsIDIpKSAjIENhbWJpYXIKICAgICAgICAgICAgICAgICApCgpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzIgPC0gcHJlZGljdChtb2RlbG8yLGVudHJlbmFtaWVudG8pCnJlc3VsdGFkb19wcnVlYmEyIDwtIHByZWRpY3QobW9kZWxvMixwcnVlYmEpCgojIE1hdHJpeiBkZSBjb25mdXNpb24KIyBFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2lvbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjaW9uCgojIE1hdHJpeiBkZSBjb25mdXNpb24gZGVsIHJlc3VsdGFkbyBkZWwgZW50cmVuYW1pZW50bwptY3JlMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8yLGVudHJlbmFtaWVudG8kdGFyZ2V0KQptY3JlMgoKIyBNYXRyaXogZGUgQ29uZnVzaW9uIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhCm1jcnAyIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMiwgcHJ1ZWJhJHRhcmdldCkKbWNycDIKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5Nb2RlbG8gMy4gU1ZNIFBvbGlub21pY288L3NwYW4+CmBgYHtyfQpzZXQuc2VlZCgxMjMpCm1vZGVsbzMgPC0gdHJhaW4odGFyZ2V0fi4sIGRhdGE9ZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtUG9seSIsICNDYW1iaWFyCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoImNlbnRlciIsICJzY2FsZSIpLAogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwKICAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGRhdGEuZnJhbWUoZGVncmVlPTEsIHNjYWxlPTEsIEM9MSkgIyBDYW1iaWFyCiAgICAgICAgICAgICAgICAgKQoKcmVzdWx0YWRvX2VudHJlbmFtaWVudG8zIDwtIHByZWRpY3QobW9kZWxvMyxlbnRyZW5hbWllbnRvKQpyZXN1bHRhZG9fcHJ1ZWJhMyA8LSBwcmVkaWN0KG1vZGVsbzMscHJ1ZWJhKQoKIyBNYXRyaXogZGUgY29uZnVzaW9uCiMgRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpb24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2lvbgoKIyBNYXRyaXogZGUgY29uZnVzaW9uIGRlbCByZXN1bHRhZG8gZGVsIGVudHJlbmFtaWVudG8KbWNyZTMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMyxlbnRyZW5hbWllbnRvJHRhcmdldCkKbWNyZTMKCiMgTWF0cml6IGRlIENvbmZ1c2lvbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQptY3JwMyA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTMsIHBydWViYSR0YXJnZXQpCm1jcnAzCmBgYAojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5Nb2RlbG8gNC4gQXJib2wgZGUgRGVjaXNpb248L3NwYW4+CmBgYHtyfQpzZXQuc2VlZCgxMjMpCm1vZGVsbzQgPC0gdHJhaW4odGFyZ2V0fi4sIGRhdGE9ZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgICBtZXRob2QgPSAicnBhcnQiLCAjQ2FtYmlhcgogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJjZW50ZXIiLCAic2NhbGUiKSwKICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksCiAgICAgICAgICAgICAgICAgdHVuZUxlbmd0aCA9IDEwICMgQ2FtYmlhcgogICAgICAgICAgICAgICAgICkKCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNCA8LSBwcmVkaWN0KG1vZGVsbzQsZW50cmVuYW1pZW50bykKcmVzdWx0YWRvX3BydWViYTQgPC0gcHJlZGljdChtb2RlbG80LHBydWViYSkKCiMgTWF0cml6IGRlIGNvbmZ1c2lvbgojIEVzIHVuYSB0YWJsYSBkZSBldmFsdWFjaW9uIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpb24KCiMgTWF0cml6IGRlIGNvbmZ1c2lvbiBkZWwgcmVzdWx0YWRvIGRlbCBlbnRyZW5hbWllbnRvCm1jcmU0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQsZW50cmVuYW1pZW50byR0YXJnZXQsIHBvc2l0aXZlID0gIlNpIikKbWNyZTQKCiMgTWF0cml6IGRlIENvbmZ1c2lvbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQptY3JwNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTQsIHBydWViYSR0YXJnZXQsIHBvc2l0aXZlID0gIlNpIikKbWNycDQKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5Nb2RlbG8gNS4gQm9zcXVlcyBBbGVhdG9yaW9zPC9zcGFuPgpgYGB7cn0Kc2V0LnNlZWQoMTIzKQptb2RlbG81IDwtIHRyYWluKHRhcmdldH4uLCBkYXRhPWVudHJlbmFtaWVudG8sCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInJmIiwgI0NhbWJpYXIKICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygiY2VudGVyIiwgInNjYWxlIiksCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLAogICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gZXhwYW5kLmdyaWQobXRyeT1jKDIsNCw2KSkgIyBDYW1iaWFyCiAgICAgICAgICAgICAgICAgKQoKcmVzdWx0YWRvX2VudHJlbmFtaWVudG81IDwtIHByZWRpY3QobW9kZWxvNSxlbnRyZW5hbWllbnRvKQpyZXN1bHRhZG9fcHJ1ZWJhNSA8LSBwcmVkaWN0KG1vZGVsbzUscHJ1ZWJhKQoKIyBNYXRyaXogZGUgY29uZnVzaW9uCiMgRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpb24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2lvbgoKIyBNYXRyaXogZGUgY29uZnVzaW9uIGRlbCByZXN1bHRhZG8gZGVsIGVudHJlbmFtaWVudG8KbWNyZTUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSxlbnRyZW5hbWllbnRvJHRhcmdldCkKbWNyZTUKCiMgTWF0cml6IGRlIENvbmZ1c2lvbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQptY3JwNSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTUsIHBydWViYSR0YXJnZXQpCm1jcnA1CmBgYAoKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPk1vZGVsbyA2LiBSZWRlcyBOZXVyb25hbGVzPC9zcGFuPgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzZXQuc2VlZCgxMjMpCm1vZGVsbzYgPC0gdHJhaW4odGFyZ2V0fi4sIGRhdGE9ZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgICBtZXRob2QgPSAibm5ldCIsICNDYW1iaWFyCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoImNlbnRlciIsICJzY2FsZSIpLAogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKQogICAgICAgICAgICAgICAgICkKCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNiA8LSBwcmVkaWN0KG1vZGVsbzYsZW50cmVuYW1pZW50bykKcmVzdWx0YWRvX3BydWViYTYgPC0gcHJlZGljdChtb2RlbG82LHBydWViYSkKCiMgTWF0cml6IGRlIGNvbmZ1c2lvbgojIEVzIHVuYSB0YWJsYSBkZSBldmFsdWFjaW9uIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpb24KCiMgTWF0cml6IGRlIGNvbmZ1c2lvbiBkZWwgcmVzdWx0YWRvIGRlbCBlbnRyZW5hbWllbnRvCm1jcmU2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYsZW50cmVuYW1pZW50byR0YXJnZXQpCm1jcmU2CgojIE1hdHJpeiBkZSBDb25mdXNpb24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmEKbWNycDYgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE2LCBwcnVlYmEkdGFyZ2V0KQptY3JwNgpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPlRhYmxhIGRlIFJlc3VsdGFkb3M8L3NwYW4+CgpgYGB7cn0KcmVzdWx0YWRvcyA8LSBkYXRhLmZyYW1lKAogICJzdm1MaW5lYXIiID0gYyhtY3JlMSRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMSRvdmVyYWxsWyJBY2N1cmFjeSJdKSwKICAic3ZtUmFkaWFsIiA9IGMobWNyZTIkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDIkb3ZlcmFsbFsiQWNjdXJhY3kiXSksCiAgInN2bVBvbHkiID0gYyhtY3JlMyRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMyRvdmVyYWxsWyJBY2N1cmFjeSJdKSwKICAicnBhcnQiID0gYyhtY3JlNCRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNCRvdmVyYWxsWyJBY2N1cmFjeSJdKSwKICAicmYiID0gYyhtY3JlNSRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNSRvdmVyYWxsWyJBY2N1cmFjeSJdKSwKICAibm5ldCIgPSBjKG1jcmU2JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA2JG92ZXJhbGxbIkFjY3VyYWN5Il0pCikKcm93bmFtZXMocmVzdWx0YWRvcykgPC0gYygiRW50cmVuYW1pZW50byIsICJQcnVlYmEiKQpyZXN1bHRhZG9zCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+Q29uY2x1c2lvbjwvc3Bhbj4KRWwgbW9kZWxvICoqUmFuZG9tIEZvcmVzdCoqIGVzIGVsIG1lam9yIG1vZGVsbyBwYXJhIGxhIGNsYXNpZmljYWNpb24gZGUgc2kgdW5hIHBlcnNvbmEgdGllbmUgcHJvYmxlbWFzIGNhcmRpYWNvcyBvIG5vLCBzZWd1aWRvIGRlbCBtb2RlbG8gKipzdm1SYWRpYWwqKi4=