Teoría

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

Instalar paquetes y llamar librerías

#install.packages("caret") #Algoritmos de aprendizaje automático
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
#install.packages("ggplot2") #Gráficas
library(ggplot2)
#install.packages("lattice") #Crear gráficos
library(lattice)
#install.packages("datasets") #Usar bases de datos precargadas
library(datasets)
#install.packages("DataExplorer") #Análisis Descriptivo
library(DataExplorer)
#install.packages("kernlab") #
library(kernlab)
## 
## Attaching package: 'kernlab'
## The following object is masked from 'package:ggplot2':
## 
##     alpha
#install.packages("randomForest") #Árbol de decisiones
library(randomForest)
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin
#install.packages("readxl") # Leer Excel
library(readxl)

Crear la base de datos

#file.choose()
df <- read_excel("C:\\Users\\isemt\\Desktop\\IA en empresas\\M2\\R\\heart.xlsx")

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   Min.   :0.0000  
##  1st Qu.:2.000   1st Qu.:0.0000  
##  Median :2.000   Median :1.0000  
##  Mean   :2.324   Mean   :0.5132  
##  3rd Qu.:3.000   3rd Qu.:1.0000  
##  Max.   :3.000   Max.   :1.0000
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  : num [1:1025] 0 0 0 0 0 1 0 0 0 0 ...
#create_report(df)
plot_missing(df)

plot_histogram(df)

plot_correlation(df)

NOTA: En modelos de clasificación, 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, ]
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 (svnPoly), etc.
  • Árbol de Decisión: rpart
  • Reders Neuronales: nnet
  • Random Forest o Bosques Aleatorios: rf

Modelo 1. SVM Lineal

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

modelo1 <- train(target~., data=entrenamiento,
                 method="svmLinear", #Cambiar
                 preProcess = c("scale","center"),
                 trControl = trainControl(method="cv", number=10),
                 tuneGride = 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 Confusión del Resultado de Entrenamiento
mcre1 <- confusionMatrix(resultado_entrenamiento1,entrenamiento$target)
mcre1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 315  40
##          1  89 376
##                                           
##                Accuracy : 0.8427          
##                  95% CI : (0.8159, 0.8669)
##     No Information Rate : 0.5073          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.6847          
##                                           
##  Mcnemar's Test P-Value : 2.377e-05       
##                                           
##             Sensitivity : 0.7797          
##             Specificity : 0.9038          
##          Pos Pred Value : 0.8873          
##          Neg Pred Value : 0.8086          
##              Prevalence : 0.4927          
##          Detection Rate : 0.3841          
##    Detection Prevalence : 0.4329          
##       Balanced Accuracy : 0.8418          
##                                           
##        'Positive' Class : 0               
## 
#Matriz de Confusión del Resultado de la Prueba
mcrp1 <- confusionMatrix(resultado_prueba1, prueba$target)
mcrp1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  74   7
##          1  21 103
##                                           
##                Accuracy : 0.8634          
##                  95% CI : (0.8087, 0.9073)
##     No Information Rate : 0.5366          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.7226          
##                                           
##  Mcnemar's Test P-Value : 0.01402         
##                                           
##             Sensitivity : 0.7789          
##             Specificity : 0.9364          
##          Pos Pred Value : 0.9136          
##          Neg Pred Value : 0.8306          
##              Prevalence : 0.4634          
##          Detection Rate : 0.3610          
##    Detection Prevalence : 0.3951          
##       Balanced Accuracy : 0.8577          
##                                           
##        '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),
                 tuneGride = 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 Confusión del Resultado de Entrenamiento
mcre2 <- confusionMatrix(resultado_entrenamiento2,entrenamiento$target)
mcre2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 356  26
##          1  48 390
##                                          
##                Accuracy : 0.9098         
##                  95% CI : (0.888, 0.9285)
##     No Information Rate : 0.5073         
##     P-Value [Acc > NIR] : < 2e-16        
##                                          
##                   Kappa : 0.8193         
##                                          
##  Mcnemar's Test P-Value : 0.01464        
##                                          
##             Sensitivity : 0.8812         
##             Specificity : 0.9375         
##          Pos Pred Value : 0.9319         
##          Neg Pred Value : 0.8904         
##              Prevalence : 0.4927         
##          Detection Rate : 0.4341         
##    Detection Prevalence : 0.4659         
##       Balanced Accuracy : 0.9093         
##                                          
##        'Positive' Class : 0              
## 
#Matriz de Confusión del Resultado de la Prueba
mcrp2 <- confusionMatrix(resultado_prueba2, prueba$target)
mcrp2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  87   8
##          1   8 102
##                                           
##                Accuracy : 0.922           
##                  95% CI : (0.8763, 0.9547)
##     No Information Rate : 0.5366          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.8431          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9158          
##             Specificity : 0.9273          
##          Pos Pred Value : 0.9158          
##          Neg Pred Value : 0.9273          
##              Prevalence : 0.4634          
##          Detection Rate : 0.4244          
##    Detection Prevalence : 0.4634          
##       Balanced Accuracy : 0.9215          
##                                           
##        '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),
                 tuneGride = data.frame(degree=1,sigma=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 Confusión del Resultado de Entrenamiento
mcre3 <- confusionMatrix(resultado_entrenamiento3,entrenamiento$target)
mcre3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 399   1
##          1   5 415
##                                           
##                Accuracy : 0.9927          
##                  95% CI : (0.9841, 0.9973)
##     No Information Rate : 0.5073          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9854          
##                                           
##  Mcnemar's Test P-Value : 0.2207          
##                                           
##             Sensitivity : 0.9876          
##             Specificity : 0.9976          
##          Pos Pred Value : 0.9975          
##          Neg Pred Value : 0.9881          
##              Prevalence : 0.4927          
##          Detection Rate : 0.4866          
##    Detection Prevalence : 0.4878          
##       Balanced Accuracy : 0.9926          
##                                           
##        'Positive' Class : 0               
## 
#Matriz de Confusión del Resultado de la Prueba
mcrp3 <- confusionMatrix(resultado_prueba3, prueba$target)
mcrp3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  92   5
##          1   3 105
##                                          
##                Accuracy : 0.961          
##                  95% CI : (0.9246, 0.983)
##     No Information Rate : 0.5366         
##     P-Value [Acc > NIR] : <2e-16         
##                                          
##                   Kappa : 0.9216         
##                                          
##  Mcnemar's Test P-Value : 0.7237         
##                                          
##             Sensitivity : 0.9684         
##             Specificity : 0.9545         
##          Pos Pred Value : 0.9485         
##          Neg Pred Value : 0.9722         
##              Prevalence : 0.4634         
##          Detection Rate : 0.4488         
##    Detection Prevalence : 0.4732         
##       Balanced Accuracy : 0.9615         
##                                          
##        '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 Confusión del Resultado de Entrenamiento
mcre4 <- confusionMatrix(resultado_entrenamiento4,entrenamiento$target)
mcre4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 350  29
##          1  54 387
##                                           
##                Accuracy : 0.8988          
##                  95% CI : (0.8761, 0.9186)
##     No Information Rate : 0.5073          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.7973          
##                                           
##  Mcnemar's Test P-Value : 0.00843         
##                                           
##             Sensitivity : 0.8663          
##             Specificity : 0.9303          
##          Pos Pred Value : 0.9235          
##          Neg Pred Value : 0.8776          
##              Prevalence : 0.4927          
##          Detection Rate : 0.4268          
##    Detection Prevalence : 0.4622          
##       Balanced Accuracy : 0.8983          
##                                           
##        'Positive' Class : 0               
## 
#Matriz de Confusión del Resultado de la Prueba
mcrp4 <- confusionMatrix(resultado_prueba4, prueba$target)
mcrp4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 84 13
##          1 11 97
##                                           
##                Accuracy : 0.8829          
##                  95% CI : (0.8308, 0.9235)
##     No Information Rate : 0.5366          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.7649          
##                                           
##  Mcnemar's Test P-Value : 0.8383          
##                                           
##             Sensitivity : 0.8842          
##             Specificity : 0.8818          
##          Pos Pred Value : 0.8660          
##          Neg Pred Value : 0.8981          
##              Prevalence : 0.4634          
##          Detection Rate : 0.4098          
##    Detection Prevalence : 0.4732          
##       Balanced Accuracy : 0.8830          
##                                           
##        '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 Confusión del Resultado de Entrenamiento
mcre5 <- confusionMatrix(resultado_entrenamiento5,entrenamiento$target)
mcre5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 404   0
##          1   0 416
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9955, 1)
##     No Information Rate : 0.5073     
##     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.4927     
##          Detection Rate : 0.4927     
##    Detection Prevalence : 0.4927     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : 0          
## 
#Matriz de Confusión del Resultado de la Prueba
mcrp5 <- confusionMatrix(resultado_prueba5, prueba$target)
mcrp5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  95   0
##          1   0 110
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9822, 1)
##     No Information Rate : 0.5366     
##     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.4634     
##          Detection Rate : 0.4634     
##    Detection Prevalence : 0.4634     
##       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 544.610093 
## iter  10 value 358.618810
## iter  20 value 299.326028
## iter  30 value 291.810733
## iter  40 value 282.694112
## iter  50 value 277.655210
## iter  60 value 264.910593
## final  value 264.711433 
## converged
## # weights:  46
## initial  value 548.448186 
## iter  10 value 247.834795
## iter  20 value 194.072794
## iter  30 value 164.003289
## iter  40 value 145.167139
## iter  50 value 138.313778
## iter  60 value 137.888908
## iter  70 value 137.876417
## iter  80 value 137.575070
## iter  90 value 137.574292
## final  value 137.574209 
## converged
## # weights:  76
## initial  value 561.243573 
## iter  10 value 237.423708
## iter  20 value 152.337313
## iter  30 value 126.903124
## iter  40 value 110.017376
## iter  50 value 102.838597
## iter  60 value 100.596838
## iter  70 value 100.530590
## iter  80 value 100.528791
## iter  90 value 100.528365
## final  value 100.527918 
## converged
## # weights:  16
## initial  value 527.437076 
## iter  10 value 337.250714
## iter  20 value 289.129067
## iter  30 value 286.457836
## iter  40 value 285.863968
## iter  50 value 282.559129
## iter  60 value 282.114012
## iter  70 value 282.108478
## iter  80 value 282.067976
## final  value 282.034838 
## converged
## # weights:  46
## initial  value 557.728177 
## iter  10 value 267.793321
## iter  20 value 218.033061
## iter  30 value 199.843547
## iter  40 value 190.872258
## iter  50 value 188.259268
## iter  60 value 186.055363
## iter  70 value 181.977686
## iter  80 value 179.625611
## iter  90 value 179.102378
## iter 100 value 179.067799
## final  value 179.067799 
## stopped after 100 iterations
## # weights:  76
## initial  value 509.051097 
## iter  10 value 236.754690
## iter  20 value 193.731116
## iter  30 value 159.490169
## iter  40 value 140.343452
## iter  50 value 133.432168
## iter  60 value 128.183723
## iter  70 value 123.615575
## iter  80 value 116.581909
## iter  90 value 115.438922
## iter 100 value 115.143653
## final  value 115.143653 
## stopped after 100 iterations
## # weights:  16
## initial  value 533.190876 
## iter  10 value 318.262183
## iter  20 value 276.813431
## iter  30 value 270.816903
## iter  40 value 260.541415
## iter  50 value 259.823521
## iter  60 value 259.244600
## iter  70 value 259.012949
## iter  80 value 259.004148
## iter  90 value 258.988635
## iter 100 value 258.984544
## final  value 258.984544 
## stopped after 100 iterations
## # weights:  46
## initial  value 534.468629 
## iter  10 value 305.283072
## iter  20 value 217.359168
## iter  30 value 185.635498
## iter  40 value 176.339763
## iter  50 value 175.708729
## iter  60 value 175.580554
## iter  70 value 175.522913
## iter  80 value 174.668440
## iter  90 value 173.008279
## iter 100 value 172.009965
## final  value 172.009965 
## stopped after 100 iterations
## # weights:  76
## initial  value 569.388407 
## iter  10 value 224.318443
## iter  20 value 143.785445
## iter  30 value 105.939852
## iter  40 value 97.129813
## iter  50 value 95.016947
## iter  60 value 89.950141
## iter  70 value 88.664691
## iter  80 value 88.241674
## iter  90 value 88.024418
## iter 100 value 87.884560
## final  value 87.884560 
## stopped after 100 iterations
## # weights:  16
## initial  value 511.367256 
## iter  10 value 311.541071
## iter  20 value 273.378877
## iter  30 value 264.962910
## iter  40 value 259.346055
## iter  50 value 256.252114
## iter  60 value 250.520265
## iter  70 value 250.253127
## iter  80 value 250.252137
## iter  90 value 250.251793
## iter  90 value 250.251792
## iter  90 value 250.251792
## final  value 250.251792 
## converged
## # weights:  46
## initial  value 513.197966 
## iter  10 value 272.628511
## iter  20 value 195.516356
## iter  30 value 170.911004
## iter  40 value 158.194976
## iter  50 value 153.637689
## iter  60 value 153.598932
## iter  70 value 153.594607
## iter  80 value 153.594117
## final  value 153.593763 
## converged
## # weights:  76
## initial  value 535.680405 
## iter  10 value 225.916527
## iter  20 value 137.571566
## iter  30 value 104.385187
## iter  40 value 87.187437
## iter  50 value 78.470376
## iter  60 value 73.315381
## iter  70 value 67.752350
## iter  80 value 65.381940
## iter  90 value 65.132654
## iter 100 value 65.042497
## final  value 65.042497 
## stopped after 100 iterations
## # weights:  16
## initial  value 512.985910 
## iter  10 value 311.079696
## iter  20 value 278.262766
## iter  30 value 275.001181
## iter  40 value 270.059667
## iter  50 value 269.122643
## final  value 268.989207 
## converged
## # weights:  46
## initial  value 544.740309 
## iter  10 value 225.840799
## iter  20 value 199.084873
## iter  30 value 188.452239
## iter  40 value 182.817778
## iter  50 value 175.829607
## iter  60 value 171.976904
## iter  70 value 167.856670
## iter  80 value 165.572861
## iter  90 value 164.960554
## iter 100 value 164.722718
## final  value 164.722718 
## stopped after 100 iterations
## # weights:  76
## initial  value 510.346417 
## iter  10 value 223.264617
## iter  20 value 179.996044
## iter  30 value 154.943561
## iter  40 value 140.634593
## iter  50 value 136.788482
## iter  60 value 131.899555
## iter  70 value 129.456680
## iter  80 value 128.077386
## iter  90 value 124.438171
## iter 100 value 122.072537
## final  value 122.072537 
## stopped after 100 iterations
## # weights:  16
## initial  value 534.705555 
## iter  10 value 325.716570
## iter  20 value 263.399352
## iter  30 value 252.619598
## iter  40 value 251.260572
## iter  50 value 248.590479
## iter  60 value 237.067931
## iter  70 value 236.519556
## iter  80 value 236.400503
## final  value 236.400498 
## converged
## # weights:  46
## initial  value 632.389251 
## iter  10 value 224.157054
## iter  20 value 198.052741
## iter  30 value 176.329720
## iter  40 value 162.245417
## iter  50 value 158.051097
## iter  60 value 157.676797
## iter  70 value 157.427340
## iter  80 value 156.673926
## iter  90 value 156.311284
## iter 100 value 155.929190
## final  value 155.929190 
## stopped after 100 iterations
## # weights:  76
## initial  value 561.289321 
## iter  10 value 233.363562
## iter  20 value 163.013119
## iter  30 value 127.286076
## iter  40 value 104.109553
## iter  50 value 92.889044
## iter  60 value 77.344595
## iter  70 value 70.433720
## iter  80 value 65.263462
## iter  90 value 63.563099
## iter 100 value 63.149592
## final  value 63.149592 
## stopped after 100 iterations
## # weights:  16
## initial  value 546.522982 
## iter  10 value 317.651568
## iter  20 value 264.633792
## iter  30 value 258.556536
## iter  40 value 256.511964
## final  value 256.507844 
## converged
## # weights:  46
## initial  value 538.881187 
## iter  10 value 268.881594
## iter  20 value 219.200270
## iter  30 value 190.976889
## iter  40 value 176.024943
## iter  50 value 170.367011
## iter  60 value 169.659686
## final  value 169.659554 
## converged
## # weights:  76
## initial  value 547.803081 
## iter  10 value 260.216875
## iter  20 value 182.175907
## iter  30 value 153.818655
## iter  40 value 134.255881
## iter  50 value 121.721681
## iter  60 value 114.362747
## iter  70 value 108.383281
## iter  80 value 105.759852
## iter  90 value 101.900642
## iter 100 value 99.063299
## final  value 99.063299 
## stopped after 100 iterations
## # weights:  16
## initial  value 519.347837 
## iter  10 value 339.195994
## iter  20 value 284.797520
## iter  30 value 278.870820
## iter  40 value 275.590380
## iter  50 value 275.513500
## final  value 275.512555 
## converged
## # weights:  46
## initial  value 614.586920 
## iter  10 value 299.372948
## iter  20 value 239.373127
## iter  30 value 221.686108
## iter  40 value 215.506620
## iter  50 value 213.107944
## iter  60 value 212.772560
## iter  70 value 212.716158
## iter  80 value 212.716050
## iter  90 value 212.715021
## iter 100 value 212.708992
## final  value 212.708992 
## stopped after 100 iterations
## # weights:  76
## initial  value 581.226153 
## iter  10 value 264.948955
## iter  20 value 199.902558
## iter  30 value 166.640290
## iter  40 value 152.867688
## iter  50 value 142.658735
## iter  60 value 135.656181
## iter  70 value 134.061238
## iter  80 value 133.248955
## iter  90 value 133.146418
## iter 100 value 133.144857
## final  value 133.144857 
## stopped after 100 iterations
## # weights:  16
## initial  value 530.289728 
## iter  10 value 335.369892
## iter  20 value 285.825726
## iter  30 value 272.168642
## iter  40 value 263.649391
## iter  50 value 261.816329
## iter  60 value 251.731423
## iter  70 value 250.909630
## iter  80 value 250.610339
## iter  90 value 250.583448
## iter 100 value 250.550571
## final  value 250.550571 
## stopped after 100 iterations
## # weights:  46
## initial  value 542.862849 
## iter  10 value 247.993690
## iter  20 value 196.545269
## iter  30 value 171.731315
## iter  40 value 163.737085
## iter  50 value 159.808591
## iter  60 value 159.343271
## iter  70 value 159.140955
## iter  80 value 159.097123
## iter  90 value 159.035392
## iter 100 value 158.937620
## final  value 158.937620 
## stopped after 100 iterations
## # weights:  76
## initial  value 520.232577 
## iter  10 value 239.136450
## iter  20 value 166.257242
## iter  30 value 130.750713
## iter  40 value 108.363041
## iter  50 value 91.370090
## iter  60 value 79.737836
## iter  70 value 75.454893
## iter  80 value 74.882170
## iter  90 value 74.438385
## iter 100 value 74.088689
## final  value 74.088689 
## stopped after 100 iterations
## # weights:  16
## initial  value 517.189989 
## iter  10 value 276.772010
## iter  20 value 271.731820
## iter  30 value 263.503626
## iter  40 value 253.182514
## iter  50 value 246.807006
## final  value 246.798920 
## converged
## # weights:  46
## initial  value 560.024670 
## iter  10 value 268.628367
## iter  20 value 213.375962
## iter  30 value 181.506646
## iter  40 value 172.121429
## iter  50 value 161.395773
## iter  60 value 158.652201
## iter  70 value 158.632389
## final  value 158.632181 
## converged
## # weights:  76
## initial  value 585.991475 
## iter  10 value 249.909984
## iter  20 value 178.528732
## iter  30 value 142.502628
## iter  40 value 130.555372
## iter  50 value 123.165793
## iter  60 value 119.899597
## iter  70 value 119.123586
## iter  80 value 113.129145
## iter  90 value 113.057125
## iter 100 value 113.053048
## final  value 113.053048 
## stopped after 100 iterations
## # weights:  16
## initial  value 511.906263 
## iter  10 value 280.081061
## iter  20 value 277.042191
## iter  30 value 276.613363
## final  value 276.613080 
## converged
## # weights:  46
## initial  value 551.947288 
## iter  10 value 426.382852
## iter  20 value 280.272995
## iter  30 value 257.117880
## iter  40 value 234.944985
## iter  50 value 225.064079
## iter  60 value 219.412640
## iter  70 value 211.387260
## iter  80 value 203.119716
## iter  90 value 199.165036
## iter 100 value 198.707283
## final  value 198.707283 
## stopped after 100 iterations
## # weights:  76
## initial  value 537.780137 
## iter  10 value 242.919271
## iter  20 value 188.498894
## iter  30 value 164.708292
## iter  40 value 143.070972
## iter  50 value 130.915126
## iter  60 value 127.034537
## iter  70 value 123.598755
## iter  80 value 120.528501
## iter  90 value 118.968444
## iter 100 value 117.399943
## final  value 117.399943 
## stopped after 100 iterations
## # weights:  16
## initial  value 581.951550 
## iter  10 value 281.223174
## iter  20 value 274.628381
## iter  30 value 271.533987
## iter  40 value 270.724316
## iter  50 value 270.452389
## iter  60 value 269.904440
## iter  70 value 269.792691
## iter  80 value 269.782636
## iter  90 value 269.749979
## iter 100 value 269.718946
## final  value 269.718946 
## stopped after 100 iterations
## # weights:  46
## initial  value 533.765764 
## iter  10 value 326.512665
## iter  20 value 234.008989
## iter  30 value 191.572622
## iter  40 value 167.589293
## iter  50 value 153.467125
## iter  60 value 145.016692
## iter  70 value 143.856864
## iter  80 value 143.614666
## iter  90 value 143.498332
## iter 100 value 143.467843
## final  value 143.467843 
## stopped after 100 iterations
## # weights:  76
## initial  value 569.703750 
## iter  10 value 292.195563
## iter  20 value 198.432034
## iter  30 value 145.224401
## iter  40 value 121.351828
## iter  50 value 114.723011
## iter  60 value 114.110319
## iter  70 value 112.863609
## iter  80 value 112.118136
## iter  90 value 111.810758
## iter 100 value 111.678664
## final  value 111.678664 
## stopped after 100 iterations
## # weights:  16
## initial  value 533.527117 
## iter  10 value 288.283365
## iter  20 value 271.632101
## iter  30 value 253.939013
## iter  40 value 250.608734
## iter  50 value 250.523105
## iter  60 value 250.503985
## iter  70 value 250.494029
## iter  80 value 250.493068
## final  value 250.492860 
## converged
## # weights:  46
## initial  value 538.003560 
## iter  10 value 262.734491
## iter  20 value 204.611845
## iter  30 value 161.162173
## iter  40 value 139.000482
## iter  50 value 132.181152
## iter  60 value 127.614114
## iter  70 value 126.631282
## iter  80 value 126.345071
## iter  90 value 126.182391
## iter 100 value 126.170436
## final  value 126.170436 
## stopped after 100 iterations
## # weights:  76
## initial  value 662.629693 
## iter  10 value 262.024213
## iter  20 value 143.363291
## iter  30 value 90.499931
## iter  40 value 64.440592
## iter  50 value 58.570484
## iter  60 value 55.913811
## iter  70 value 53.074077
## iter  80 value 44.664109
## iter  90 value 41.990342
## iter 100 value 37.981105
## final  value 37.981105 
## stopped after 100 iterations
## # weights:  16
## initial  value 504.068297 
## iter  10 value 329.234305
## iter  20 value 296.603555
## iter  30 value 285.164237
## iter  40 value 284.887743
## iter  50 value 284.879597
## final  value 284.878876 
## converged
## # weights:  46
## initial  value 559.579344 
## iter  10 value 312.528289
## iter  20 value 239.584894
## iter  30 value 215.033872
## iter  40 value 203.179866
## iter  50 value 202.553250
## iter  60 value 202.201702
## iter  70 value 201.858878
## iter  80 value 201.857845
## final  value 201.857831 
## converged
## # weights:  76
## initial  value 690.389357 
## iter  10 value 298.526307
## iter  20 value 245.105509
## iter  30 value 211.932550
## iter  40 value 194.473906
## iter  50 value 168.239988
## iter  60 value 162.055167
## iter  70 value 159.182271
## iter  80 value 157.429742
## iter  90 value 156.201137
## iter 100 value 155.978654
## final  value 155.978654 
## stopped after 100 iterations
## # weights:  16
## initial  value 507.050062 
## iter  10 value 278.624739
## iter  20 value 263.275709
## iter  30 value 250.989217
## iter  40 value 250.414326
## iter  50 value 250.010532
## iter  60 value 249.989491
## iter  70 value 249.969741
## iter  80 value 249.955638
## iter  90 value 249.926448
## iter 100 value 249.883953
## final  value 249.883953 
## stopped after 100 iterations
## # weights:  46
## initial  value 513.216169 
## iter  10 value 247.862840
## iter  20 value 189.778520
## iter  30 value 177.137630
## iter  40 value 172.470643
## iter  50 value 168.284288
## iter  60 value 168.126446
## iter  70 value 167.903890
## iter  80 value 167.723593
## iter  90 value 167.558936
## iter 100 value 166.682235
## final  value 166.682235 
## stopped after 100 iterations
## # weights:  76
## initial  value 514.260545 
## iter  10 value 259.842118
## iter  20 value 202.838837
## iter  30 value 148.040653
## iter  40 value 133.947319
## iter  50 value 126.033419
## iter  60 value 122.194388
## iter  70 value 121.607116
## iter  80 value 120.502610
## iter  90 value 119.860327
## iter 100 value 119.588092
## final  value 119.588092 
## stopped after 100 iterations
## # weights:  16
## initial  value 520.010711 
## iter  10 value 269.387801
## iter  20 value 261.517943
## iter  30 value 261.174973
## iter  40 value 258.510065
## iter  50 value 247.766249
## final  value 247.739754 
## converged
## # weights:  46
## initial  value 558.442364 
## iter  10 value 262.970991
## iter  20 value 224.641358
## iter  30 value 169.737321
## iter  40 value 138.538928
## iter  50 value 126.761490
## iter  60 value 121.950890
## iter  70 value 119.557565
## iter  80 value 114.678558
## iter  90 value 111.430476
## iter 100 value 110.145942
## final  value 110.145942 
## stopped after 100 iterations
## # weights:  76
## initial  value 497.363536 
## iter  10 value 213.470836
## iter  20 value 157.830527
## iter  30 value 111.908448
## iter  40 value 92.626429
## iter  50 value 87.414868
## iter  60 value 85.779134
## iter  70 value 84.875314
## iter  80 value 84.706149
## iter  90 value 84.478037
## iter 100 value 84.414722
## final  value 84.414722 
## stopped after 100 iterations
## # weights:  16
## initial  value 522.493754 
## iter  10 value 312.194554
## iter  20 value 282.555513
## iter  30 value 274.943534
## iter  40 value 273.028421
## iter  50 value 272.967574
## final  value 272.965112 
## converged
## # weights:  46
## initial  value 521.630978 
## iter  10 value 286.596926
## iter  20 value 230.310719
## iter  30 value 205.807595
## iter  40 value 189.208105
## iter  50 value 185.816347
## iter  60 value 185.658098
## iter  70 value 185.642023
## iter  80 value 185.639686
## iter  80 value 185.639685
## iter  80 value 185.639685
## final  value 185.639685 
## converged
## # weights:  76
## initial  value 529.730150 
## iter  10 value 252.418416
## iter  20 value 194.564352
## iter  30 value 174.482755
## iter  40 value 162.749514
## iter  50 value 155.195145
## iter  60 value 149.103061
## iter  70 value 147.928284
## iter  80 value 147.692990
## iter  90 value 147.654293
## iter 100 value 147.650692
## final  value 147.650692 
## stopped after 100 iterations
## # weights:  16
## initial  value 563.902518 
## iter  10 value 287.521678
## iter  20 value 265.800577
## iter  30 value 255.590968
## iter  40 value 252.554469
## iter  50 value 251.653888
## iter  60 value 251.545703
## final  value 251.374554 
## converged
## # weights:  46
## initial  value 555.996124 
## iter  10 value 245.390984
## iter  20 value 196.910017
## iter  30 value 181.043915
## iter  40 value 165.477433
## iter  50 value 155.017054
## iter  60 value 153.802627
## iter  70 value 152.555232
## iter  80 value 152.134802
## iter  90 value 151.623359
## iter 100 value 151.248985
## final  value 151.248985 
## stopped after 100 iterations
## # weights:  76
## initial  value 525.259795 
## iter  10 value 253.230227
## iter  20 value 178.945108
## iter  30 value 114.153691
## iter  40 value 96.658859
## iter  50 value 94.726314
## iter  60 value 93.292944
## iter  70 value 92.639171
## iter  80 value 92.352448
## iter  90 value 92.276104
## iter 100 value 92.210634
## final  value 92.210634 
## stopped after 100 iterations
## # weights:  16
## initial  value 520.184236 
## iter  10 value 266.062578
## iter  20 value 255.389044
## iter  30 value 238.941995
## iter  40 value 232.943275
## iter  50 value 232.740344
## iter  60 value 232.707502
## iter  70 value 232.697841
## iter  80 value 232.693786
## iter  90 value 232.689282
## iter 100 value 232.676530
## final  value 232.676530 
## stopped after 100 iterations
## # weights:  46
## initial  value 515.954357 
## iter  10 value 240.690497
## iter  20 value 194.079962
## iter  30 value 180.992860
## iter  40 value 159.444295
## iter  50 value 147.913958
## iter  60 value 146.982527
## iter  70 value 146.971057
## iter  80 value 146.969747
## final  value 146.969736 
## converged
## # weights:  76
## initial  value 527.600087 
## iter  10 value 279.301507
## iter  20 value 153.705357
## iter  30 value 117.694807
## iter  40 value 105.676788
## iter  50 value 101.111480
## iter  60 value 100.255952
## iter  70 value 99.911511
## iter  80 value 99.888363
## iter  90 value 99.855504
## iter 100 value 93.741137
## final  value 93.741137 
## stopped after 100 iterations
## # weights:  16
## initial  value 600.380622 
## iter  10 value 330.468858
## iter  20 value 272.428189
## iter  30 value 271.645064
## iter  40 value 271.640761
## iter  50 value 271.638617
## final  value 271.638447 
## converged
## # weights:  46
## initial  value 561.017956 
## iter  10 value 260.778456
## iter  20 value 236.454280
## iter  30 value 223.140220
## iter  40 value 220.950003
## iter  50 value 220.465043
## iter  60 value 220.160686
## iter  70 value 217.273535
## iter  80 value 216.222416
## iter  90 value 216.195113
## final  value 216.194793 
## converged
## # weights:  76
## initial  value 518.035748 
## iter  10 value 240.133368
## iter  20 value 174.483839
## iter  30 value 157.048848
## iter  40 value 142.793685
## iter  50 value 132.751543
## iter  60 value 126.619258
## iter  70 value 121.868328
## iter  80 value 117.930562
## iter  90 value 111.174630
## iter 100 value 110.313975
## final  value 110.313975 
## stopped after 100 iterations
## # weights:  16
## initial  value 542.145530 
## iter  10 value 285.385295
## iter  20 value 262.242113
## iter  30 value 253.848327
## iter  40 value 246.721819
## iter  50 value 246.172109
## iter  60 value 245.466698
## iter  70 value 245.453287
## iter  80 value 245.447297
## iter  90 value 245.447059
## iter 100 value 245.446642
## final  value 245.446642 
## stopped after 100 iterations
## # weights:  46
## initial  value 514.605210 
## iter  10 value 254.927418
## iter  20 value 235.783620
## iter  30 value 202.961864
## iter  40 value 185.063408
## iter  50 value 174.654352
## iter  60 value 173.022851
## iter  70 value 172.271456
## iter  80 value 171.868741
## iter  90 value 171.224953
## iter 100 value 169.371039
## final  value 169.371039 
## stopped after 100 iterations
## # weights:  76
## initial  value 558.976540 
## iter  10 value 249.267392
## iter  20 value 182.128920
## iter  30 value 151.480587
## iter  40 value 131.353027
## iter  50 value 115.336004
## iter  60 value 110.417036
## iter  70 value 103.395852
## iter  80 value 99.433213
## iter  90 value 98.320496
## iter 100 value 97.972006
## final  value 97.972006 
## stopped after 100 iterations
## # weights:  16
## initial  value 558.525549 
## iter  10 value 346.930018
## iter  20 value 272.212466
## iter  30 value 261.649322
## iter  40 value 253.906210
## iter  50 value 248.639850
## iter  60 value 226.344629
## iter  70 value 225.976383
## iter  80 value 225.975185
## final  value 225.974975 
## converged
## # weights:  46
## initial  value 516.793263 
## iter  10 value 359.507056
## iter  20 value 250.871505
## iter  30 value 205.354047
## iter  40 value 173.184422
## iter  50 value 159.233055
## iter  60 value 151.209541
## iter  70 value 146.079546
## iter  80 value 139.250840
## iter  90 value 135.028039
## iter 100 value 130.737245
## final  value 130.737245 
## stopped after 100 iterations
## # weights:  76
## initial  value 535.800686 
## iter  10 value 221.213032
## iter  20 value 132.425804
## iter  30 value 87.290785
## iter  40 value 80.464806
## iter  50 value 74.711919
## iter  60 value 69.669422
## iter  70 value 67.114730
## iter  80 value 66.463981
## iter  90 value 66.140770
## iter 100 value 65.862258
## final  value 65.862258 
## stopped after 100 iterations
## # weights:  16
## initial  value 553.166874 
## iter  10 value 273.929921
## iter  20 value 262.035843
## iter  30 value 261.398548
## final  value 261.398121 
## converged
## # weights:  46
## initial  value 550.085298 
## iter  10 value 358.269664
## iter  20 value 264.412256
## iter  30 value 237.606088
## iter  40 value 230.215777
## iter  50 value 225.159372
## iter  60 value 223.077643
## iter  70 value 221.998252
## iter  80 value 207.478224
## iter  90 value 201.337266
## iter 100 value 201.195244
## final  value 201.195244 
## stopped after 100 iterations
## # weights:  76
## initial  value 553.044902 
## iter  10 value 255.474580
## iter  20 value 198.973325
## iter  30 value 163.777824
## iter  40 value 143.740422
## iter  50 value 125.670389
## iter  60 value 116.031557
## iter  70 value 107.340406
## iter  80 value 100.032754
## iter  90 value 97.455300
## iter 100 value 96.838479
## final  value 96.838479 
## stopped after 100 iterations
## # weights:  16
## initial  value 483.431285 
## iter  10 value 285.259016
## iter  20 value 249.305139
## iter  30 value 232.722551
## iter  40 value 230.750570
## iter  50 value 230.552656
## iter  60 value 230.529007
## iter  70 value 230.485411
## iter  80 value 230.479254
## iter  90 value 230.469747
## iter 100 value 230.453879
## final  value 230.453879 
## stopped after 100 iterations
## # weights:  46
## initial  value 512.150380 
## iter  10 value 256.204941
## iter  20 value 206.350443
## iter  30 value 183.721835
## iter  40 value 173.215975
## iter  50 value 172.587972
## iter  60 value 172.327138
## iter  70 value 172.061150
## iter  80 value 171.660630
## iter  90 value 170.847406
## iter 100 value 170.496893
## final  value 170.496893 
## stopped after 100 iterations
## # weights:  76
## initial  value 627.770975 
## iter  10 value 218.142439
## iter  20 value 151.149746
## iter  30 value 110.273196
## iter  40 value 95.700785
## iter  50 value 87.821327
## iter  60 value 85.623765
## iter  70 value 84.043493
## iter  80 value 81.761327
## iter  90 value 80.601882
## iter 100 value 79.875144
## final  value 79.875144 
## stopped after 100 iterations
## # weights:  16
## initial  value 513.999502 
## iter  10 value 273.299608
## iter  20 value 255.389167
## iter  30 value 252.152809
## iter  40 value 252.025425
## final  value 252.025307 
## converged
## # weights:  46
## initial  value 493.809854 
## iter  10 value 202.788100
## iter  20 value 169.939608
## iter  30 value 149.944588
## iter  40 value 138.510747
## iter  50 value 134.480797
## iter  60 value 133.249473
## iter  70 value 132.006029
## iter  80 value 130.662406
## iter  90 value 129.382893
## iter 100 value 128.635694
## final  value 128.635694 
## stopped after 100 iterations
## # weights:  76
## initial  value 521.571179 
## iter  10 value 211.561697
## iter  20 value 120.848250
## iter  30 value 107.318581
## iter  40 value 101.766435
## iter  50 value 98.329282
## iter  60 value 96.702642
## iter  70 value 96.238851
## iter  80 value 95.562386
## iter  90 value 95.376438
## iter 100 value 95.360776
## final  value 95.360776 
## stopped after 100 iterations
## # weights:  16
## initial  value 543.054373 
## iter  10 value 325.069575
## iter  20 value 298.097016
## iter  30 value 268.527968
## iter  40 value 266.866551
## iter  50 value 266.842849
## final  value 266.837800 
## converged
## # weights:  46
## initial  value 602.171398 
## iter  10 value 292.767044
## iter  20 value 245.281856
## iter  30 value 231.612182
## iter  40 value 226.821141
## iter  50 value 225.563124
## iter  60 value 225.345637
## iter  70 value 225.113223
## final  value 225.105360 
## converged
## # weights:  76
## initial  value 548.450435 
## iter  10 value 240.646320
## iter  20 value 186.789464
## iter  30 value 164.334564
## iter  40 value 153.916035
## iter  50 value 142.384971
## iter  60 value 137.119338
## iter  70 value 135.425464
## iter  80 value 135.137217
## iter  90 value 134.896556
## iter 100 value 134.141136
## final  value 134.141136 
## stopped after 100 iterations
## # weights:  16
## initial  value 553.212700 
## iter  10 value 292.292273
## iter  20 value 257.873239
## iter  30 value 253.869766
## iter  40 value 253.025231
## iter  50 value 252.718888
## iter  60 value 252.563492
## iter  70 value 252.518524
## iter  80 value 252.515046
## iter  90 value 252.512908
## iter 100 value 252.512375
## final  value 252.512375 
## stopped after 100 iterations
## # weights:  46
## initial  value 542.799153 
## iter  10 value 277.518635
## iter  20 value 216.980149
## iter  30 value 187.939446
## iter  40 value 176.587104
## iter  50 value 163.633434
## iter  60 value 160.618779
## iter  70 value 160.127182
## iter  80 value 159.623648
## iter  90 value 158.765781
## iter 100 value 158.432302
## final  value 158.432302 
## stopped after 100 iterations
## # weights:  76
## initial  value 561.355207 
## iter  10 value 233.063725
## iter  20 value 161.828384
## iter  30 value 119.443013
## iter  40 value 99.066891
## iter  50 value 89.427533
## iter  60 value 81.607883
## iter  70 value 72.369095
## iter  80 value 61.356752
## iter  90 value 56.846026
## iter 100 value 54.535543
## final  value 54.535543 
## stopped after 100 iterations
## # weights:  16
## initial  value 508.927217 
## iter  10 value 262.293960
## iter  20 value 255.162587
## iter  30 value 238.918973
## iter  40 value 237.061213
## iter  50 value 236.990577
## iter  60 value 236.973437
## final  value 236.964288 
## converged
## # weights:  46
## initial  value 563.387822 
## iter  10 value 318.755630
## iter  20 value 264.187632
## iter  30 value 218.465508
## iter  40 value 177.680423
## iter  50 value 153.457528
## iter  60 value 138.935419
## iter  70 value 128.328654
## iter  80 value 125.019870
## iter  90 value 124.866428
## iter 100 value 124.740415
## final  value 124.740415 
## stopped after 100 iterations
## # weights:  76
## initial  value 519.040229 
## iter  10 value 226.227373
## iter  20 value 158.444309
## iter  30 value 141.827386
## iter  40 value 134.046691
## iter  50 value 130.825811
## iter  60 value 130.039093
## iter  70 value 129.954606
## iter  80 value 129.933542
## iter  90 value 129.931711
## iter 100 value 129.907278
## final  value 129.907278 
## stopped after 100 iterations
## # weights:  16
## initial  value 535.194429 
## iter  10 value 315.176663
## iter  20 value 272.522984
## iter  30 value 265.427473
## iter  40 value 265.077136
## final  value 265.056975 
## converged
## # weights:  46
## initial  value 529.638238 
## iter  10 value 271.882187
## iter  20 value 224.520535
## iter  30 value 212.850992
## iter  40 value 211.895771
## iter  50 value 211.844715
## iter  60 value 211.837980
## final  value 211.837580 
## converged
## # weights:  76
## initial  value 540.219659 
## iter  10 value 252.497267
## iter  20 value 199.726909
## iter  30 value 177.998430
## iter  40 value 164.963109
## iter  50 value 154.520413
## iter  60 value 144.480463
## iter  70 value 127.962615
## iter  80 value 117.601141
## iter  90 value 113.669993
## iter 100 value 107.080419
## final  value 107.080419 
## stopped after 100 iterations
## # weights:  16
## initial  value 515.163111 
## iter  10 value 356.422074
## iter  20 value 282.572005
## iter  30 value 264.703543
## iter  40 value 263.160493
## iter  50 value 262.901109
## iter  60 value 262.407078
## iter  70 value 262.320820
## iter  80 value 262.292986
## iter  90 value 262.259622
## iter 100 value 262.239785
## final  value 262.239785 
## stopped after 100 iterations
## # weights:  46
## initial  value 559.103323 
## iter  10 value 239.286581
## iter  20 value 183.568880
## iter  30 value 153.221590
## iter  40 value 139.456447
## iter  50 value 116.108193
## iter  60 value 111.299629
## iter  70 value 110.365403
## iter  80 value 108.254039
## iter  90 value 107.681162
## iter 100 value 107.291463
## final  value 107.291463 
## stopped after 100 iterations
## # weights:  76
## initial  value 577.277872 
## iter  10 value 228.474344
## iter  20 value 115.206654
## iter  30 value 90.301554
## iter  40 value 83.768828
## iter  50 value 81.459432
## iter  60 value 80.197091
## iter  70 value 79.521889
## iter  80 value 79.103893
## iter  90 value 79.016289
## iter 100 value 78.833948
## final  value 78.833948 
## stopped after 100 iterations
## # weights:  76
## initial  value 590.865416 
## iter  10 value 316.734938
## iter  20 value 247.768556
## iter  30 value 203.844215
## iter  40 value 183.753682
## iter  50 value 175.616470
## iter  60 value 170.116309
## iter  70 value 164.525353
## iter  80 value 158.573162
## iter  90 value 147.870377
## iter 100 value 138.659472
## final  value 138.659472 
## 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 Confusión del Resultado de Entrenamiento
mcre6 <- confusionMatrix(resultado_entrenamiento6,entrenamiento$target)
#mcre6

#Matriz de Confusión del Resultado de la Prueba
mcrp6 <- confusionMatrix(resultado_prueba6, prueba$target)
#mcrp6

Tabla de Resultado

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"]),
  "rt" = c(mcre5$overall["Accuracy"], mcrp5$overall["Accuracy"]),
  "nnet" = c(mcre6$overall["Accuracy"], mcrp6$overall["Accuracy"])
)

rownames(resultados) <- c("Exactitud del Entrenamiento", "Exactitud de la Prueba")
resultados
##                             svmLinear svmRadial   svmPoly     rpart rt
## Exactitud del Entrenamiento 0.8426829 0.9097561 0.9926829 0.8987805  1
## Exactitud de la Prueba      0.8634146 0.9219512 0.9609756 0.8829268  1
##                                  nnet
## Exactitud del Entrenamiento 0.9756098
## Exactitud de la Prueba      0.9560976

Conclusión

En conclusión, el modelo de Random Forrest es el recomendado para la clasificación del corazón.

LS0tDQogIHRpdGxlOiAiQ2FyZXQgIC0gIEhlYXJ0Ig0KICBhdXRob3I6ICJJc2FiZWwgTWFydMOtbmV6IEEwMDgzOTYyOSINCiAgZGF0ZTogIjIwMjYtMDktMDEiDQogIG91dHB1dDoNCiAgICBodG1sX2RvY3VtZW50Og0KICAgICAgdG9jOiBUUlVFDQogICAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICAgIHRoZW1lOiBzYW5kc3RvbmUNCi0tLQ0KDQo8Y2VudGVyPg0KIVtdKGh0dHBzOi8vY2RuLnBpeGFiYXkuY29tL2FuaW1hdGlvbi8yMDI1LzA3LzE4LzEwLzAwLzEwLTAwLTQ4LTE0M181MTIuZ2lmKQ0KPGNlbnRlcj4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+VGVvcsOtYTwvc3Bhbj4NCkVsIHBhcXVldGUgKipDQVJFVCAoQ2xhc3NpZmljYXRpb24gQW5kIFJlZ3Jlc3Npb24gVHJhaW5pbmcpKiogZXMgdW4gcGFxdWV0ZSBpbnRlZ3JhbCBjb24gdW5hIGFtcGxpYSB2YXJpZWRhZCBkZSBhbGdvcml0bW9zIHBhcmEgZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28uIA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzPC9zcGFuPg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKSAjQWxnb3JpdG1vcyBkZSBhcHJlbmRpemFqZSBhdXRvbcOhdGljbw0KbGlicmFyeShjYXJldCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgI0dyw6FmaWNhcw0KbGlicmFyeShnZ3Bsb3QyKQ0KI2luc3RhbGwucGFja2FnZXMoImxhdHRpY2UiKSAjQ3JlYXIgZ3LDoWZpY29zDQpsaWJyYXJ5KGxhdHRpY2UpDQojaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKSAjVXNhciBiYXNlcyBkZSBkYXRvcyBwcmVjYXJnYWRhcw0KbGlicmFyeShkYXRhc2V0cykNCiNpbnN0YWxsLnBhY2thZ2VzKCJEYXRhRXhwbG9yZXIiKSAjQW7DoWxpc2lzIERlc2NyaXB0aXZvDQpsaWJyYXJ5KERhdGFFeHBsb3JlcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJrZXJubGFiIikgIw0KbGlicmFyeShrZXJubGFiKQ0KI2luc3RhbGwucGFja2FnZXMoInJhbmRvbUZvcmVzdCIpICPDgXJib2wgZGUgZGVjaXNpb25lcw0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQojaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikgIyBMZWVyIEV4Y2VsDQpsaWJyYXJ5KHJlYWR4bCkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5DcmVhciBsYSBiYXNlIGRlIGRhdG9zPC9zcGFuPg0KYGBge3J9DQojZmlsZS5jaG9vc2UoKQ0KZGYgPC0gcmVhZF9leGNlbCgiQzpcXFVzZXJzXFxpc2VtdFxcRGVza3RvcFxcSUEgZW4gZW1wcmVzYXNcXE0yXFxSXFxoZWFydC54bHN4IikNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5FbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zPC9zcGFuPg0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0Kc3RyKGRmKQ0KI2NyZWF0ZV9yZXBvcnQoZGYpDQpwbG90X21pc3NpbmcoZGYpDQpwbG90X2hpc3RvZ3JhbShkZikNCnBsb3RfY29ycmVsYXRpb24oZGYpDQpgYGANCg0KDQoqKk5PVEE6IEVuIG1vZGVsb3MgZGUgY2xhc2lmaWNhY2nDs24sIGxhIHZhcmlhYmxlIHF1ZSBxdWVyZW1vcyBwcmVkZWNpciBkZWJlIHRlbmVyIGZvcm1hdG8gZGUgRkFDVE9SKioNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+UGFydGlyIGxhIGJhc2UgZGUgZGF0b3M8L3NwYW4+DQpgYGB7cn0NCiMgTm9ybWFsbWVudGUgODAtMjAgbyA3MC0zMA0Kc2V0LnNlZWQoMTIzKQ0KcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8gPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihkZiR0YXJnZXQsIHA9MC44LCBsaXN0PUZBTFNFKQ0KZW50cmVuYW1pZW50byA8LSBkZltyZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQ0KcHJ1ZWJhIDwtIGRmWy1yZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPkRpc3RpbnRvcyB0aXBvcyBkZSBNw6l0b2RvcyBwYXJhIE1vZGVsYXI8L3NwYW4+DQpMb3MgbcOpdG9kb3MgbcOhcyB1dGlsaXphZG9zIHBhcmEgbW9kZWxhciBhcHJlbmRpemFqZSBhdXRvbcOhdGljbyBzb246IA0KDQoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUuIEhheSB2YXJpb3Mgc3VidGlwb3M6IExpbmVhbCAoc3ZtTGluZWFyKSwgUmFkaWFsIChzdm1SYWRpYWwpLCBQb2xpbsOzbWljbyAoc3ZuUG9seSksIGV0Yy4gIA0KKiAqKsOBcmJvbCBkZSBEZWNpc2nDs24qKjogcnBhcnQNCiogKipSZWRlcnMgTmV1cm9uYWxlcyoqOiBubmV0DQoqICoqUmFuZG9tIEZvcmVzdCoqIG8gQm9zcXVlcyBBbGVhdG9yaW9zOiByZg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5Nb2RlbG8gMS4gU1ZNIExpbmVhbDwvc3Bhbj4NCmBgYHtyfQ0KZW50cmVuYW1pZW50byR0YXJnZXQgPC0gYXMuZmFjdG9yKGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KcHJ1ZWJhJHRhcmdldCA8LSBhcy5mYWN0b3IocHJ1ZWJhJHRhcmdldCkNCg0KbW9kZWxvMSA8LSB0cmFpbih0YXJnZXR+LiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2Q9InN2bUxpbmVhciIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgIHR1bmVHcmlkZSA9IGRhdGEuZnJhbWUoQz0xKSAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSA8LSBwcmVkaWN0KG1vZGVsbzEsZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmExIDwtIHByZWRpY3QobW9kZWxvMSxwcnVlYmEpDQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbg0KI0VzIHVuYSB0YWJsYSBkZSBldmFsdWFjacOzbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjacOzbg0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBFbnRyZW5hbWllbnRvDQptY3JlMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8xLGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KbWNyZTENCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTEsIHBydWViYSR0YXJnZXQpDQptY3JwMQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPk1vZGVsbyAyLiBTVk0gUmFkaWFsPC9zcGFuPg0KYGBge3J9DQptb2RlbG8yIDwtIHRyYWluKHRhcmdldH4uLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZD0ic3ZtUmFkaWFsIiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICAgdHVuZUdyaWRlID0gZGF0YS5mcmFtZShzaWdtYT0xLEM9MSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzIgPC0gcHJlZGljdChtb2RlbG8yLGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMiA8LSBwcmVkaWN0KG1vZGVsbzIscHJ1ZWJhKQ0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24NCiNFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24NCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgRW50cmVuYW1pZW50bw0KbWNyZTIgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMixlbnRyZW5hbWllbnRvJHRhcmdldCkNCm1jcmUyDQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQ0KbWNycDIgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmEyLCBwcnVlYmEkdGFyZ2V0KQ0KbWNycDINCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5Nb2RlbG8gMy4gU1ZNIFBvbGluw7NtaWNvPC9zcGFuPg0KYGBge3J9DQptb2RlbG8zIDwtIHRyYWluKHRhcmdldH4uLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZD0ic3ZtUG9seSIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgIHR1bmVHcmlkZSA9IGRhdGEuZnJhbWUoZGVncmVlPTEsc2lnbWE9MSxDPTEpICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8zIDwtIHByZWRpY3QobW9kZWxvMyxlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTMgPC0gcHJlZGljdChtb2RlbG8zLHBydWViYSkNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuDQojRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuDQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIEVudHJlbmFtaWVudG8NCm1jcmUzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzMsZW50cmVuYW1pZW50byR0YXJnZXQpDQptY3JlMw0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnAzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMywgcHJ1ZWJhJHRhcmdldCkNCm1jcnAzDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+TW9kZWxvIDQuIMOBcmJvbCBkZSBEZWNpc2nDs248L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzQgPC0gdHJhaW4odGFyZ2V0fi4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kPSJycGFydCIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgIHR1bmVMZW5ndGggPSAxMCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNCA8LSBwcmVkaWN0KG1vZGVsbzQsZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE0IDwtIHByZWRpY3QobW9kZWxvNCxwcnVlYmEpDQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbg0KI0VzIHVuYSB0YWJsYSBkZSBldmFsdWFjacOzbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjacOzbg0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBFbnRyZW5hbWllbnRvDQptY3JlNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG80LGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KbWNyZTQNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTQsIHBydWViYSR0YXJnZXQpDQptY3JwNA0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPk1vZGVsbyA1LiBCb3NxdWVzIEFsZWF0b3Jpb3M8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzUgPC0gdHJhaW4odGFyZ2V0fi4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kPSJyZiIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gZXhwYW5kLmdyaWQobXRyeT1jKDIsNCw2KSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzUgPC0gcHJlZGljdChtb2RlbG81LGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhNSA8LSBwcmVkaWN0KG1vZGVsbzUscHJ1ZWJhKQ0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24NCiNFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24NCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgRW50cmVuYW1pZW50bw0KbWNyZTUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSxlbnRyZW5hbWllbnRvJHRhcmdldCkNCm1jcmU1DQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQ0KbWNycDUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE1LCBwcnVlYmEkdGFyZ2V0KQ0KbWNycDUNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5Nb2RlbG8gNi4gUmVkZXMgTmV1cm9uYWxlczwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvNiA8LSB0cmFpbih0YXJnZXR+LiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2Q9Im5uZXQiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApDQogICAgICAgICAgICAgICAgICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG82IDwtIHByZWRpY3QobW9kZWxvNixlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTYgPC0gcHJlZGljdChtb2RlbG82LHBydWViYSkNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuDQojRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuDQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIEVudHJlbmFtaWVudG8NCm1jcmU2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYsZW50cmVuYW1pZW50byR0YXJnZXQpDQojbWNyZTYNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwNiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTYsIHBydWViYSR0YXJnZXQpDQojbWNycDYNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5UYWJsYSBkZSBSZXN1bHRhZG88L3NwYW4+DQpgYGB7cn0NCnJlc3VsdGFkb3MgPC0gZGF0YS5mcmFtZSgNCiAgInN2bUxpbmVhciIgPSBjKG1jcmUxJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAxJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAic3ZtUmFkaWFsIiA9IGMobWNyZTIkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDIkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJzdm1Qb2x5IiA9IGMobWNyZTMkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDMkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJycGFydCIgPSBjKG1jcmU0JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA0JG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAicnQiID0gYyhtY3JlNSRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNSRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgIm5uZXQiID0gYyhtY3JlNiRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNiRvdmVyYWxsWyJBY2N1cmFjeSJdKQ0KKQ0KDQpyb3duYW1lcyhyZXN1bHRhZG9zKSA8LSBjKCJFeGFjdGl0dWQgZGVsIEVudHJlbmFtaWVudG8iLCAiRXhhY3RpdHVkIGRlIGxhIFBydWViYSIpDQpyZXN1bHRhZG9zDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+Q29uY2x1c2nDs248L3NwYW4+DQpFbiBjb25jbHVzacOzbiwgZWwgbW9kZWxvIGRlICoqUmFuZG9tIEZvcnJlc3QqKiBlcyBlbCByZWNvbWVuZGFkbyBwYXJhIGxhIGNsYXNpZmljYWNpw7NuIGRlbCBjb3JhesOzbi4=