Teoría

El paquete caret en R es una herramienta muy utilizada para crear modelos de machine learning. Destaca porque unifica y facilita la preparación de datos, el entrenamiento y la validación de modelos en un solo flujo de trabajo.

Instalar paquetes y llamar librerías

 #install.packages("ggplot2") # Gráficas
library(ggplot2)
 #install.packages("lattice") # Crear gráficos
library(lattice)
 #install.packages("caret") # Algoritmos de aprendizaje automático
library(caret)
 #install.packages("datasets") # Usar bases de datos, en este caso Iris
library(datasets)
 #install.packages("DataExplorer") # Análisis Exploratorio
library(DataExplorer)

Crear la base de datos

#file.choose() buscar el archivo
df <- read.csv("C:\\Users\\ramir\\Downloads\\M1_data.csv", stringsAsFactors = TRUE)

# Sin esto tenemos problemas en la particion porque no unifica y detecta errores en el nivel de prueba 
df$m1_purchase <- as.factor(df$m1_purchase)

#Eliminamos valore nulos para estar seguros 
df <- na.omit(df)

Entender la base de datos

summary(df)
##  trust_apple interest_computers  age_computer   user_pcmac appleproducts_count
##  No : 19     Min.   :2.000      Min.   :0.000   Apple:86   Min.   :0.000      
##  Yes:114     1st Qu.:3.000      1st Qu.:1.000   Hp   : 1   1st Qu.:1.000      
##              Median :4.000      Median :3.000   Other: 1   Median :3.000      
##              Mean   :3.812      Mean   :2.827   PC   :45   Mean   :2.609      
##              3rd Qu.:5.000      3rd Qu.:5.000              3rd Qu.:4.000      
##              Max.   :5.000      Max.   :9.000              Max.   :8.000      
##                                                                               
##  familiarity_m1 f_batterylife      f_price          f_size      f_multitasking
##  No :75         Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :2.00  
##  Yes:58         1st Qu.:4.000   1st Qu.:3.000   1st Qu.:2.000   1st Qu.:4.00  
##                 Median :5.000   Median :4.000   Median :3.000   Median :4.00  
##                 Mean   :4.526   Mean   :3.872   Mean   :3.158   Mean   :4.12  
##                 3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:4.000   3rd Qu.:5.00  
##                 Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.00  
##                                                                               
##     f_noise      f_performance      f_neural       f_synergy    
##  Min.   :1.000   Min.   :2.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:3.000   1st Qu.:4.000   1st Qu.:2.000   1st Qu.:3.000  
##  Median :4.000   Median :5.000   Median :3.000   Median :4.000  
##  Mean   :3.729   Mean   :4.398   Mean   :3.165   Mean   :3.466  
##  3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  
##                                                                 
##  f_performanceloss m1_consideration m1_purchase    gender     age_group    
##  Min.   :1.000     Min.   :1.000    No :45      Female:61   Min.   : 1.00  
##  1st Qu.:3.000     1st Qu.:3.000    Yes:88      Male  :72   1st Qu.: 2.00  
##  Median :4.000     Median :4.000                            Median : 2.00  
##  Mean   :3.376     Mean   :3.609                            Mean   : 2.97  
##  3rd Qu.:4.000     3rd Qu.:5.000                            3rd Qu.: 3.00  
##  Max.   :5.000     Max.   :5.000                            Max.   :10.00  
##                                                                            
##   income_group                   status               domain  
##  Min.   :1.00   Employed            :41   IT & Technology:33  
##  1st Qu.:1.00   Retired             : 1   Marketing      :21  
##  Median :2.00   Self-Employed       : 5   Business       :14  
##  Mean   :2.97   Student             :84   Engineering    : 7  
##  3rd Qu.:4.00   Student ant employed: 1   Finance        : 7  
##  Max.   :7.00   Unemployed          : 1   Science        : 7  
##                                           (Other)        :44
str(df)
## 'data.frame':    133 obs. of  22 variables:
##  $ trust_apple        : Factor w/ 2 levels "No","Yes": 1 2 2 2 2 2 2 1 2 2 ...
##  $ interest_computers : int  4 2 5 2 4 3 3 3 4 5 ...
##  $ age_computer       : int  8 4 6 6 4 1 2 0 2 0 ...
##  $ user_pcmac         : Factor w/ 4 levels "Apple","Hp","Other",..: 4 4 4 1 1 1 1 4 1 1 ...
##  $ appleproducts_count: int  0 1 0 4 7 2 7 0 6 7 ...
##  $ familiarity_m1     : Factor w/ 2 levels "No","Yes": 1 1 1 1 2 1 1 1 2 2 ...
##  $ f_batterylife      : int  5 5 3 4 5 5 4 5 4 5 ...
##  $ f_price            : int  4 5 4 3 3 5 3 5 4 3 ...
##  $ f_size             : int  3 5 2 3 3 4 4 4 3 5 ...
##  $ f_multitasking     : int  4 3 4 4 4 4 5 4 4 5 ...
##  $ f_noise            : int  4 4 1 4 4 5 5 3 4 5 ...
##  $ f_performance      : int  2 5 4 4 5 5 5 3 4 5 ...
##  $ f_neural           : int  2 2 2 4 3 5 3 2 3 3 ...
##  $ f_synergy          : int  1 2 2 4 4 4 3 2 3 5 ...
##  $ f_performanceloss  : int  1 4 2 3 4 2 2 3 4 5 ...
##  $ m1_consideration   : int  1 2 4 2 4 2 3 1 5 5 ...
##  $ m1_purchase        : Factor w/ 2 levels "No","Yes": 2 1 2 1 2 1 2 1 2 2 ...
##  $ gender             : Factor w/ 2 levels "Female","Male": 2 2 2 1 2 1 2 2 2 2 ...
##  $ age_group          : int  2 2 2 2 5 2 6 2 8 4 ...
##  $ income_group       : int  2 3 2 2 7 2 7 2 7 6 ...
##  $ status             : Factor w/ 6 levels "Employed","Retired",..: 4 1 4 4 1 4 1 4 1 1 ...
##  $ domain             : Factor w/ 22 levels "Administration & Public Services",..: 21 10 13 3 12 17 13 22 13 12 ...
# create_report(df)
plot_missing(df)

plot_histogram(df) 

plot_correlation(df)
## 1 features with more than 20 categories ignored!
## domain: 22 categories

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

Partir la base de datos

# Normalmente 80-20
set.seed(123)
renglones_entrenamiento <- createDataPartition(df$m1_purchase, 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 (svmPoly), etc.
  • Árbol de Decisión: rpart
  • Redes Neuronales: nnet
  • Random Forest o Bosques Aleatorios: rf

Modelo 1. SVM Lineal

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

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

# Matriz de Confusión del Resultado del Entrenamiento
mcre1 <- confusionMatrix(resultado_entrenamiento1, entrenamiento$m1_purchase)
mcre1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No  30   4
##        Yes  6  67
##                                           
##                Accuracy : 0.9065          
##                  95% CI : (0.8348, 0.9543)
##     No Information Rate : 0.6636          
##     P-Value [Acc > NIR] : 4.281e-09       
##                                           
##                   Kappa : 0.7878          
##                                           
##  Mcnemar's Test P-Value : 0.7518          
##                                           
##             Sensitivity : 0.8333          
##             Specificity : 0.9437          
##          Pos Pred Value : 0.8824          
##          Neg Pred Value : 0.9178          
##              Prevalence : 0.3364          
##          Detection Rate : 0.2804          
##    Detection Prevalence : 0.3178          
##       Balanced Accuracy : 0.8885          
##                                           
##        'Positive' Class : No              
## 
# Matriz de Confusión del Resultado de la Prueba
mcrp1 <- confusionMatrix(resultado_prueba1, prueba$m1_purchase)
mcrp1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No   3   6
##        Yes  6  11
##                                           
##                Accuracy : 0.5385          
##                  95% CI : (0.3337, 0.7341)
##     No Information Rate : 0.6538          
##     P-Value [Acc > NIR] : 0.9231          
##                                           
##                   Kappa : -0.0196         
##                                           
##  Mcnemar's Test P-Value : 1.0000          
##                                           
##             Sensitivity : 0.3333          
##             Specificity : 0.6471          
##          Pos Pred Value : 0.3333          
##          Neg Pred Value : 0.6471          
##              Prevalence : 0.3462          
##          Detection Rate : 0.1154          
##    Detection Prevalence : 0.3462          
##       Balanced Accuracy : 0.4902          
##                                           
##        'Positive' Class : No              
## 

Modelo 2. SVM Radial

modelo2 <- train(m1_purchase ~ ., 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 del Entrenamiento
mcre2 <- confusionMatrix(resultado_entrenamiento2, entrenamiento$m1_purchase)
mcre2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No  26   0
##        Yes 10  71
##                                           
##                Accuracy : 0.9065          
##                  95% CI : (0.8348, 0.9543)
##     No Information Rate : 0.6636          
##     P-Value [Acc > NIR] : 4.281e-09       
##                                           
##                   Kappa : 0.7753          
##                                           
##  Mcnemar's Test P-Value : 0.004427        
##                                           
##             Sensitivity : 0.7222          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.8765          
##              Prevalence : 0.3364          
##          Detection Rate : 0.2430          
##    Detection Prevalence : 0.2430          
##       Balanced Accuracy : 0.8611          
##                                           
##        'Positive' Class : No              
## 
# Matriz de Confusión del Resultado de la Prueba
mcrp2 <- confusionMatrix(resultado_prueba2, prueba$m1_purchase)
mcrp2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No   1   4
##        Yes  8  13
##                                           
##                Accuracy : 0.5385          
##                  95% CI : (0.3337, 0.7341)
##     No Information Rate : 0.6538          
##     P-Value [Acc > NIR] : 0.9231          
##                                           
##                   Kappa : -0.1387         
##                                           
##  Mcnemar's Test P-Value : 0.3865          
##                                           
##             Sensitivity : 0.11111         
##             Specificity : 0.76471         
##          Pos Pred Value : 0.20000         
##          Neg Pred Value : 0.61905         
##              Prevalence : 0.34615         
##          Detection Rate : 0.03846         
##    Detection Prevalence : 0.19231         
##       Balanced Accuracy : 0.43791         
##                                           
##        'Positive' Class : No              
## 

Modelo 3. SVM Polinómico

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

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

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

# Matriz de Confusión del Resultado del Entrenamiento
mcre3 <- confusionMatrix(resultado_entrenamiento3, entrenamiento$m1_purchase)
mcre3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No  29   4
##        Yes  7  67
##                                           
##                Accuracy : 0.8972          
##                  95% CI : (0.8235, 0.9476)
##     No Information Rate : 0.6636          
##     P-Value [Acc > NIR] : 1.967e-08       
##                                           
##                   Kappa : 0.7649          
##                                           
##  Mcnemar's Test P-Value : 0.5465          
##                                           
##             Sensitivity : 0.8056          
##             Specificity : 0.9437          
##          Pos Pred Value : 0.8788          
##          Neg Pred Value : 0.9054          
##              Prevalence : 0.3364          
##          Detection Rate : 0.2710          
##    Detection Prevalence : 0.3084          
##       Balanced Accuracy : 0.8746          
##                                           
##        'Positive' Class : No              
## 
# Matriz de Confusión del Resultado de la Prueba
mcrp3 <- confusionMatrix(resultado_prueba3, prueba$m1_purchase)
mcrp3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No   4   7
##        Yes  5  10
##                                           
##                Accuracy : 0.5385          
##                  95% CI : (0.3337, 0.7341)
##     No Information Rate : 0.6538          
##     P-Value [Acc > NIR] : 0.9231          
##                                           
##                   Kappa : 0.0311          
##                                           
##  Mcnemar's Test P-Value : 0.7728          
##                                           
##             Sensitivity : 0.4444          
##             Specificity : 0.5882          
##          Pos Pred Value : 0.3636          
##          Neg Pred Value : 0.6667          
##              Prevalence : 0.3462          
##          Detection Rate : 0.1538          
##    Detection Prevalence : 0.4231          
##       Balanced Accuracy : 0.5163          
##                                           
##        'Positive' Class : No              
## 

Modelo 4. Árbol de Decisión

modelo4 <- train(m1_purchase ~ ., 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 del Entrenamiento
mcre4 <- confusionMatrix(resultado_entrenamiento4, entrenamiento$m1_purchase)
mcre4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No  17   2
##        Yes 19  69
##                                           
##                Accuracy : 0.8037          
##                  95% CI : (0.7158, 0.8742)
##     No Information Rate : 0.6636          
##     P-Value [Acc > NIR] : 0.0010139       
##                                           
##                   Kappa : 0.5025          
##                                           
##  Mcnemar's Test P-Value : 0.0004803       
##                                           
##             Sensitivity : 0.4722          
##             Specificity : 0.9718          
##          Pos Pred Value : 0.8947          
##          Neg Pred Value : 0.7841          
##              Prevalence : 0.3364          
##          Detection Rate : 0.1589          
##    Detection Prevalence : 0.1776          
##       Balanced Accuracy : 0.7220          
##                                           
##        'Positive' Class : No              
## 
# Matriz de Confusión del Resultado de la Prueba
mcrp4 <- confusionMatrix(resultado_prueba4, prueba$m1_purchase)
mcrp4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No   4   6
##        Yes  5  11
##                                           
##                Accuracy : 0.5769          
##                  95% CI : (0.3692, 0.7665)
##     No Information Rate : 0.6538          
##     P-Value [Acc > NIR] : 0.8485          
##                                           
##                   Kappa : 0.0892          
##                                           
##  Mcnemar's Test P-Value : 1.0000          
##                                           
##             Sensitivity : 0.4444          
##             Specificity : 0.6471          
##          Pos Pred Value : 0.4000          
##          Neg Pred Value : 0.6875          
##              Prevalence : 0.3462          
##          Detection Rate : 0.1538          
##    Detection Prevalence : 0.3846          
##       Balanced Accuracy : 0.5458          
##                                           
##        'Positive' Class : No              
## 

Modelo 5. Redes Neuronales

modelo5 <- train(m1_purchase ~ ., data=entrenamiento,
                 method = "nnet", #Cambiar
                 preProcess = c("scale", "center"),
                 trControl = trainControl(method="cv", number=10)
                 #Cambiar
                 )
## # weights:  50
## initial  value 74.247141 
## iter  10 value 35.573297
## iter  20 value 26.955288
## iter  30 value 23.575587
## iter  40 value 21.351510
## iter  50 value 16.796235
## iter  60 value 16.743905
## iter  70 value 16.142754
## iter  80 value 15.212566
## iter  90 value 15.211433
## iter 100 value 15.211262
## final  value 15.211262 
## stopped after 100 iterations
## # weights:  148
## initial  value 60.994638 
## iter  10 value 14.797393
## iter  20 value 6.726077
## iter  30 value 5.846459
## iter  40 value 5.335932
## iter  50 value 5.285527
## iter  60 value 5.279700
## iter  70 value 5.028168
## iter  80 value 5.025583
## iter  90 value 5.021837
## iter 100 value 4.707235
## final  value 4.707235 
## stopped after 100 iterations
## # weights:  246
## initial  value 63.088441 
## iter  10 value 17.956727
## iter  20 value 3.111347
## iter  30 value 2.798906
## iter  40 value 2.773111
## iter  50 value 2.772634
## iter  60 value 2.772589
## iter  60 value 2.772589
## iter  60 value 2.772589
## final  value 2.772589 
## converged
## # weights:  50
## initial  value 63.156136 
## iter  10 value 29.495525
## iter  20 value 22.340354
## iter  30 value 21.589614
## iter  40 value 21.584546
## final  value 21.584544 
## converged
## # weights:  148
## initial  value 68.046300 
## iter  10 value 37.446921
## iter  20 value 18.090359
## iter  30 value 15.989113
## iter  40 value 15.620063
## iter  50 value 15.396680
## iter  60 value 15.279846
## iter  70 value 15.270745
## iter  80 value 15.270617
## final  value 15.270616 
## converged
## # weights:  246
## initial  value 72.789509 
## iter  10 value 25.271723
## iter  20 value 15.439661
## iter  30 value 14.559762
## iter  40 value 14.236887
## iter  50 value 14.094303
## iter  60 value 14.067507
## iter  70 value 14.056102
## iter  80 value 14.051176
## iter  90 value 14.049230
## iter 100 value 14.048526
## final  value 14.048526 
## stopped after 100 iterations
## # weights:  50
## initial  value 66.619352 
## iter  10 value 22.867635
## iter  20 value 11.433596
## iter  30 value 10.408121
## iter  40 value 10.394737
## iter  50 value 10.392697
## iter  60 value 10.391389
## iter  70 value 10.389948
## iter  80 value 10.389260
## iter  90 value 10.388650
## iter 100 value 10.388089
## final  value 10.388089 
## stopped after 100 iterations
## # weights:  148
## initial  value 70.831792 
## iter  10 value 21.635375
## iter  20 value 13.882540
## iter  30 value 7.837304
## iter  40 value 6.894951
## iter  50 value 6.758358
## iter  60 value 6.735467
## iter  70 value 6.205625
## iter  80 value 5.695199
## iter  90 value 5.686045
## iter 100 value 4.943829
## final  value 4.943829 
## stopped after 100 iterations
## # weights:  246
## initial  value 71.178764 
## iter  10 value 10.920175
## iter  20 value 3.173858
## iter  30 value 2.955508
## iter  40 value 2.924206
## iter  50 value 2.910129
## iter  60 value 2.895697
## iter  70 value 2.887648
## iter  80 value 2.879736
## iter  90 value 2.873228
## iter 100 value 2.868855
## final  value 2.868855 
## stopped after 100 iterations
## # weights:  50
## initial  value 70.461136 
## iter  10 value 29.637622
## iter  20 value 24.896018
## iter  30 value 24.785136
## iter  40 value 23.849898
## iter  50 value 22.266883
## iter  60 value 22.028012
## iter  70 value 22.026220
## iter  80 value 22.024817
## iter  90 value 22.022883
## iter 100 value 22.022083
## final  value 22.022083 
## stopped after 100 iterations
## # weights:  148
## initial  value 83.038936 
## iter  10 value 17.906396
## iter  20 value 9.024395
## iter  30 value 7.962449
## iter  40 value 7.588703
## iter  50 value 7.542751
## iter  60 value 7.533131
## iter  70 value 7.528144
## iter  80 value 7.526916
## iter  90 value 7.525144
## iter 100 value 7.524613
## final  value 7.524613 
## stopped after 100 iterations
## # weights:  246
## initial  value 97.089941 
## iter  10 value 13.236253
## iter  20 value 7.027142
## iter  30 value 6.931576
## iter  40 value 6.931398
## iter  50 value 6.137821
## iter  60 value 6.137649
## final  value 6.137648 
## converged
## # weights:  50
## initial  value 63.592743 
## iter  10 value 33.572146
## iter  20 value 23.660654
## iter  30 value 22.625912
## iter  40 value 22.606223
## iter  50 value 22.605796
## final  value 22.605794 
## converged
## # weights:  148
## initial  value 68.123293 
## iter  10 value 27.334352
## iter  20 value 18.593081
## iter  30 value 17.534828
## iter  40 value 17.180908
## iter  50 value 17.102883
## iter  60 value 17.092293
## iter  70 value 17.090896
## iter  80 value 17.090635
## iter  90 value 17.090623
## final  value 17.090623 
## converged
## # weights:  246
## initial  value 62.664827 
## iter  10 value 22.058294
## iter  20 value 17.701457
## iter  30 value 16.737544
## iter  40 value 15.736257
## iter  50 value 15.503372
## iter  60 value 15.470090
## iter  70 value 15.467216
## final  value 15.467182 
## converged
## # weights:  50
## initial  value 85.720549 
## iter  10 value 29.959529
## iter  20 value 26.252869
## iter  30 value 24.738443
## iter  40 value 23.238898
## iter  50 value 23.212547
## iter  60 value 23.208734
## iter  70 value 23.207691
## iter  80 value 23.206458
## iter  90 value 23.205360
## iter 100 value 23.204799
## final  value 23.204799 
## stopped after 100 iterations
## # weights:  148
## initial  value 78.476532 
## iter  10 value 22.218352
## iter  20 value 15.234602
## iter  30 value 14.602727
## iter  40 value 14.009794
## iter  50 value 13.417621
## iter  60 value 13.347010
## iter  70 value 12.991732
## iter  80 value 12.784718
## iter  90 value 12.730930
## iter 100 value 12.705643
## final  value 12.705643 
## stopped after 100 iterations
## # weights:  246
## initial  value 61.979459 
## iter  10 value 12.700194
## iter  20 value 9.700148
## iter  30 value 7.774787
## iter  40 value 7.635994
## iter  50 value 7.370546
## iter  60 value 7.354467
## iter  70 value 4.596214
## iter  80 value 3.655218
## iter  90 value 3.592889
## iter 100 value 3.577700
## final  value 3.577700 
## stopped after 100 iterations
## # weights:  50
## initial  value 77.361947 
## iter  10 value 27.133126
## iter  20 value 20.197498
## iter  30 value 20.033281
## iter  40 value 20.029611
## final  value 20.029596 
## converged
## # weights:  148
## initial  value 69.253864 
## iter  10 value 29.640040
## iter  20 value 12.079151
## iter  30 value 11.040399
## iter  40 value 10.669686
## iter  50 value 10.331229
## iter  60 value 10.327987
## iter  70 value 9.762637
## iter  80 value 9.735740
## iter  90 value 9.734909
## iter 100 value 9.734451
## final  value 9.734451 
## stopped after 100 iterations
## # weights:  246
## initial  value 65.841760 
## iter  10 value 20.066964
## iter  20 value 6.109942
## iter  30 value 2.839043
## iter  40 value 2.777050
## iter  50 value 2.772746
## iter  60 value 2.772641
## iter  70 value 2.772596
## final  value 2.772592 
## converged
## # weights:  50
## initial  value 60.756744 
## iter  10 value 33.658598
## iter  20 value 28.344173
## iter  30 value 23.299959
## iter  40 value 22.070420
## iter  50 value 22.063349
## final  value 22.063336 
## converged
## # weights:  148
## initial  value 64.540074 
## iter  10 value 26.041092
## iter  20 value 18.051452
## iter  30 value 17.076063
## iter  40 value 15.939398
## iter  50 value 15.788762
## iter  60 value 15.781481
## iter  70 value 15.772708
## iter  80 value 15.770683
## final  value 15.770632 
## converged
## # weights:  246
## initial  value 90.721474 
## iter  10 value 28.159264
## iter  20 value 19.691693
## iter  30 value 16.842922
## iter  40 value 15.921174
## iter  50 value 15.542337
## iter  60 value 15.445324
## iter  70 value 15.422428
## iter  80 value 15.362703
## iter  90 value 15.359990
## iter 100 value 15.359560
## final  value 15.359560 
## stopped after 100 iterations
## # weights:  50
## initial  value 76.389314 
## iter  10 value 30.170576
## iter  20 value 23.629854
## iter  30 value 23.218148
## iter  40 value 23.205239
## iter  50 value 23.201991
## iter  60 value 23.199864
## iter  70 value 23.198628
## iter  80 value 23.197717
## iter  90 value 23.197236
## iter 100 value 23.196748
## final  value 23.196748 
## stopped after 100 iterations
## # weights:  148
## initial  value 65.732139 
## iter  10 value 17.144385
## iter  20 value 3.989383
## iter  30 value 2.994798
## iter  40 value 2.916044
## iter  50 value 2.908516
## iter  60 value 2.902956
## iter  70 value 2.896174
## iter  80 value 2.888044
## iter  90 value 2.883371
## iter 100 value 2.878192
## final  value 2.878192 
## stopped after 100 iterations
## # weights:  246
## initial  value 76.181890 
## iter  10 value 9.534100
## iter  20 value 3.103306
## iter  30 value 3.004992
## iter  40 value 2.975824
## iter  50 value 2.942289
## iter  60 value 2.916197
## iter  70 value 2.895984
## iter  80 value 2.879800
## iter  90 value 2.870633
## iter 100 value 2.863583
## final  value 2.863583 
## stopped after 100 iterations
## # weights:  50
## initial  value 64.273549 
## iter  10 value 31.787518
## iter  20 value 28.070434
## iter  30 value 28.054779
## iter  40 value 28.051093
## final  value 28.051001 
## converged
## # weights:  148
## initial  value 63.869210 
## iter  10 value 11.707651
## iter  20 value 7.787308
## iter  30 value 4.108267
## iter  40 value 3.860734
## iter  50 value 3.825131
## iter  60 value 3.820141
## iter  70 value 3.469875
## iter  80 value 2.280526
## iter  90 value 1.918474
## iter 100 value 1.912727
## final  value 1.912727 
## stopped after 100 iterations
## # weights:  246
## initial  value 68.839143 
## iter  10 value 8.882069
## iter  20 value 5.905050
## iter  30 value 5.871238
## iter  40 value 5.868301
## iter  50 value 5.774048
## iter  60 value 5.276243
## iter  70 value 5.274727
## final  value 5.274626 
## converged
## # weights:  50
## initial  value 70.795422 
## iter  10 value 32.047907
## iter  20 value 26.946720
## iter  30 value 24.652170
## iter  40 value 23.186315
## iter  50 value 22.182320
## iter  60 value 22.090320
## iter  70 value 22.087915
## final  value 22.087900 
## converged
## # weights:  148
## initial  value 66.421053 
## iter  10 value 22.215929
## iter  20 value 19.043928
## iter  30 value 16.731489
## iter  40 value 14.916165
## iter  50 value 14.748428
## iter  60 value 14.693656
## iter  70 value 14.689541
## final  value 14.689498 
## converged
## # weights:  246
## initial  value 93.703985 
## iter  10 value 27.186630
## iter  20 value 15.600002
## iter  30 value 14.796207
## iter  40 value 14.482175
## iter  50 value 13.660491
## iter  60 value 13.395956
## iter  70 value 13.279273
## iter  80 value 13.266561
## iter  90 value 13.265572
## iter 100 value 13.265551
## final  value 13.265551 
## stopped after 100 iterations
## # weights:  50
## initial  value 71.936346 
## iter  10 value 25.833431
## iter  20 value 20.219778
## iter  30 value 19.807449
## iter  40 value 19.797149
## iter  50 value 19.795972
## iter  60 value 19.795041
## iter  70 value 19.794244
## iter  80 value 19.781644
## iter  90 value 16.687917
## iter 100 value 16.629863
## final  value 16.629863 
## stopped after 100 iterations
## # weights:  148
## initial  value 74.065216 
## iter  10 value 25.870791
## iter  20 value 10.295126
## iter  30 value 7.935096
## iter  40 value 5.275161
## iter  50 value 4.906966
## iter  60 value 4.307070
## iter  70 value 4.297093
## iter  80 value 3.955364
## iter  90 value 3.948602
## iter 100 value 3.942260
## final  value 3.942260 
## stopped after 100 iterations
## # weights:  246
## initial  value 71.824251 
## iter  10 value 18.318084
## iter  20 value 3.744115
## iter  30 value 3.553298
## iter  40 value 3.525206
## iter  50 value 3.027529
## iter  60 value 2.183698
## iter  70 value 2.131979
## iter  80 value 2.097128
## iter  90 value 2.087701
## iter 100 value 2.062456
## final  value 2.062456 
## stopped after 100 iterations
## # weights:  50
## initial  value 70.814612 
## iter  10 value 33.114590
## iter  20 value 23.056801
## iter  30 value 22.332807
## iter  40 value 22.329435
## final  value 22.329409 
## converged
## # weights:  148
## initial  value 88.455029 
## iter  10 value 16.295791
## iter  20 value 11.527525
## iter  30 value 10.925408
## iter  40 value 9.431090
## iter  50 value 8.961886
## iter  60 value 8.959162
## iter  70 value 8.955490
## iter  80 value 8.322922
## iter  90 value 8.319476
## iter 100 value 8.318925
## final  value 8.318925 
## stopped after 100 iterations
## # weights:  246
## initial  value 66.041374 
## iter  10 value 17.342252
## iter  20 value 7.200597
## iter  30 value 6.627714
## iter  40 value 6.254961
## iter  50 value 6.143318
## iter  60 value 6.139434
## iter  70 value 6.083228
## iter  80 value 5.547651
## iter  90 value 5.547405
## iter 100 value 5.547120
## final  value 5.547120 
## stopped after 100 iterations
## # weights:  50
## initial  value 67.496814 
## iter  10 value 30.515368
## iter  20 value 21.068589
## iter  30 value 20.405972
## iter  40 value 20.376071
## final  value 20.375844 
## converged
## # weights:  148
## initial  value 65.359171 
## iter  10 value 31.831775
## iter  20 value 17.622850
## iter  30 value 16.504227
## iter  40 value 16.369671
## iter  50 value 16.357483
## iter  60 value 16.356548
## final  value 16.356537 
## converged
## # weights:  246
## initial  value 77.788060 
## iter  10 value 27.562391
## iter  20 value 18.189761
## iter  30 value 16.358855
## iter  40 value 16.063131
## iter  50 value 15.965410
## iter  60 value 15.712505
## iter  70 value 15.479670
## iter  80 value 15.431879
## iter  90 value 15.427298
## iter 100 value 15.425827
## final  value 15.425827 
## stopped after 100 iterations
## # weights:  50
## initial  value 68.995071 
## iter  10 value 27.815322
## iter  20 value 18.916135
## iter  30 value 12.956311
## iter  40 value 12.905134
## iter  50 value 10.965171
## iter  60 value 10.349348
## iter  70 value 10.331287
## iter  80 value 10.328183
## iter  90 value 10.326941
## iter 100 value 10.325329
## final  value 10.325329 
## stopped after 100 iterations
## # weights:  148
## initial  value 59.068759 
## iter  10 value 13.342250
## iter  20 value 11.194082
## iter  30 value 10.241402
## iter  40 value 9.993602
## iter  50 value 9.462438
## iter  60 value 9.076044
## iter  70 value 9.037729
## iter  80 value 9.022014
## iter  90 value 9.015627
## iter 100 value 8.635475
## final  value 8.635475 
## stopped after 100 iterations
## # weights:  246
## initial  value 66.347293 
## iter  10 value 17.090083
## iter  20 value 7.512161
## iter  30 value 6.003608
## iter  40 value 5.917302
## iter  50 value 5.804523
## iter  60 value 3.496168
## iter  70 value 3.078921
## iter  80 value 3.016211
## iter  90 value 3.003395
## iter 100 value 2.986100
## final  value 2.986100 
## stopped after 100 iterations
## # weights:  50
## initial  value 64.513897 
## iter  10 value 19.485039
## iter  20 value 11.639033
## iter  30 value 10.325810
## iter  40 value 10.317461
## iter  50 value 10.317443
## final  value 10.317441 
## converged
## # weights:  148
## initial  value 70.083238 
## iter  10 value 23.244851
## iter  20 value 19.156835
## iter  30 value 11.426313
## iter  40 value 9.671358
## iter  50 value 9.658430
## iter  60 value 9.656097
## iter  70 value 9.570473
## iter  80 value 9.567748
## iter  90 value 9.567562
## iter 100 value 9.381220
## final  value 9.381220 
## stopped after 100 iterations
## # weights:  246
## initial  value 60.593916 
## iter  10 value 20.991066
## iter  20 value 19.200181
## iter  30 value 17.178885
## iter  40 value 16.306274
## iter  50 value 16.257038
## iter  60 value 15.075406
## iter  70 value 15.015195
## iter  80 value 14.935005
## iter  90 value 14.925358
## iter 100 value 14.623355
## final  value 14.623355 
## stopped after 100 iterations
## # weights:  50
## initial  value 62.537967 
## iter  10 value 35.254701
## iter  20 value 28.825978
## iter  30 value 23.312996
## iter  40 value 21.993042
## iter  50 value 21.961746
## final  value 21.961708 
## converged
## # weights:  148
## initial  value 69.974251 
## iter  10 value 29.162916
## iter  20 value 18.193376
## iter  30 value 16.280391
## iter  40 value 15.677443
## iter  50 value 15.563683
## iter  60 value 15.501291
## iter  70 value 15.483204
## iter  80 value 15.482852
## final  value 15.482837 
## converged
## # weights:  246
## initial  value 72.262586 
## iter  10 value 20.223094
## iter  20 value 15.945918
## iter  30 value 14.963202
## iter  40 value 14.590589
## iter  50 value 14.543217
## iter  60 value 14.539162
## iter  70 value 14.537981
## iter  80 value 14.537896
## iter  90 value 14.537886
## final  value 14.537885 
## converged
## # weights:  50
## initial  value 66.198486 
## iter  10 value 29.766360
## iter  20 value 22.370221
## iter  30 value 22.230156
## iter  40 value 22.222300
## iter  50 value 22.220421
## iter  60 value 22.218938
## iter  70 value 22.216435
## iter  80 value 22.215234
## iter  90 value 22.213851
## iter 100 value 22.213010
## final  value 22.213010 
## stopped after 100 iterations
## # weights:  148
## initial  value 83.100811 
## iter  10 value 15.918306
## iter  20 value 10.231947
## iter  30 value 9.215357
## iter  40 value 8.765780
## iter  50 value 8.310662
## iter  60 value 8.246038
## iter  70 value 7.897242
## iter  80 value 7.888984
## iter  90 value 7.884686
## iter 100 value 7.879003
## final  value 7.879003 
## stopped after 100 iterations
## # weights:  246
## initial  value 69.897959 
## iter  10 value 11.694864
## iter  20 value 2.963380
## iter  30 value 2.903771
## iter  40 value 2.885586
## iter  50 value 2.873110
## iter  60 value 2.861245
## iter  70 value 2.854449
## iter  80 value 2.849238
## iter  90 value 2.847592
## iter 100 value 2.845049
## final  value 2.845049 
## stopped after 100 iterations
## # weights:  50
## initial  value 61.779635 
## iter  10 value 28.140517
## iter  20 value 23.522733
## iter  30 value 23.211933
## iter  40 value 23.205503
## iter  50 value 23.205073
## final  value 23.205072 
## converged
## # weights:  148
## initial  value 77.841695 
## iter  10 value 27.698163
## iter  20 value 13.889326
## iter  30 value 10.970202
## iter  40 value 10.734741
## iter  50 value 10.493446
## iter  60 value 10.486599
## final  value 10.486513 
## converged
## # weights:  246
## initial  value 67.400763 
## iter  10 value 24.173096
## iter  20 value 8.955481
## iter  30 value 3.031711
## iter  40 value 2.790163
## iter  50 value 2.772812
## final  value 2.772599 
## converged
## # weights:  50
## initial  value 65.789546 
## iter  10 value 34.585115
## iter  20 value 25.767771
## iter  30 value 22.195990
## iter  40 value 21.600466
## iter  50 value 21.494987
## final  value 21.494860 
## converged
## # weights:  148
## initial  value 65.361519 
## iter  10 value 21.838720
## iter  20 value 16.768068
## iter  30 value 16.286188
## iter  40 value 16.125547
## iter  50 value 16.062607
## iter  60 value 16.049749
## iter  70 value 16.049097
## final  value 16.049096 
## converged
## # weights:  246
## initial  value 69.311848 
## iter  10 value 21.702957
## iter  20 value 15.443827
## iter  30 value 14.432362
## iter  40 value 14.113921
## iter  50 value 14.085298
## iter  60 value 14.083951
## iter  70 value 14.083780
## iter  80 value 14.083775
## final  value 14.083773 
## converged
## # weights:  50
## initial  value 90.774473 
## iter  10 value 29.923901
## iter  20 value 19.856270
## iter  30 value 19.638293
## iter  40 value 17.654798
## iter  50 value 15.383303
## iter  60 value 15.349196
## iter  70 value 15.341885
## iter  80 value 15.339941
## iter  90 value 15.338566
## iter 100 value 15.337600
## final  value 15.337600 
## stopped after 100 iterations
## # weights:  148
## initial  value 83.276931 
## iter  10 value 10.264692
## iter  20 value 8.302523
## iter  30 value 7.938103
## iter  40 value 7.610760
## iter  50 value 7.219643
## iter  60 value 7.208584
## iter  70 value 7.203998
## iter  80 value 7.173276
## iter  90 value 5.685959
## iter 100 value 5.636098
## final  value 5.636098 
## stopped after 100 iterations
## # weights:  246
## initial  value 65.459160 
## iter  10 value 16.538406
## iter  20 value 1.813725
## iter  30 value 1.560631
## iter  40 value 1.544815
## iter  50 value 1.529450
## iter  60 value 1.514236
## iter  70 value 1.504423
## iter  80 value 1.498174
## iter  90 value 1.493509
## iter 100 value 1.487447
## final  value 1.487447 
## stopped after 100 iterations
## # weights:  50
## initial  value 63.625801 
## iter  10 value 18.232677
## iter  20 value 11.383281
## iter  30 value 10.268632
## iter  40 value 10.256586
## iter  50 value 10.254205
## iter  60 value 10.254073
## iter  70 value 10.253959
## final  value 10.253948 
## converged
## # weights:  148
## initial  value 65.355276 
## iter  10 value 14.243692
## iter  20 value 5.801682
## iter  30 value 4.705341
## iter  40 value 4.689118
## iter  50 value 4.683514
## iter  60 value 4.682293
## iter  70 value 4.682146
## final  value 4.682145 
## converged
## # weights:  246
## initial  value 92.903065 
## iter  10 value 14.058391
## iter  20 value 6.159199
## iter  30 value 4.766579
## iter  40 value 4.169264
## iter  50 value 2.865474
## iter  60 value 2.797039
## iter  70 value 2.781501
## iter  80 value 2.778008
## iter  90 value 2.776146
## iter 100 value 2.774291
## final  value 2.774291 
## stopped after 100 iterations
## # weights:  50
## initial  value 72.687273 
## iter  10 value 36.785816
## iter  20 value 22.756274
## iter  30 value 21.498570
## iter  40 value 21.461387
## final  value 21.458412 
## converged
## # weights:  148
## initial  value 71.410261 
## iter  10 value 29.131096
## iter  20 value 18.595055
## iter  30 value 16.659037
## iter  40 value 15.404559
## iter  50 value 15.131581
## iter  60 value 14.664536
## iter  70 value 14.517692
## iter  80 value 14.512139
## iter  90 value 14.511535
## final  value 14.511520 
## converged
## # weights:  246
## initial  value 104.192783 
## iter  10 value 24.768062
## iter  20 value 16.302580
## iter  30 value 15.734348
## iter  40 value 15.565991
## iter  50 value 15.402766
## iter  60 value 15.375984
## iter  70 value 15.359687
## iter  80 value 15.351814
## iter  90 value 15.344482
## iter 100 value 15.344293
## final  value 15.344293 
## stopped after 100 iterations
## # weights:  50
## initial  value 73.202895 
## iter  10 value 24.895801
## iter  20 value 21.156401
## iter  30 value 19.002029
## iter  40 value 18.978148
## iter  50 value 18.971586
## iter  60 value 18.970203
## iter  70 value 16.548010
## iter  80 value 16.450616
## iter  90 value 16.441013
## iter 100 value 16.438674
## final  value 16.438674 
## stopped after 100 iterations
## # weights:  148
## initial  value 68.120569 
## iter  10 value 16.325503
## iter  20 value 9.969414
## iter  30 value 9.657565
## iter  40 value 6.434655
## iter  50 value 6.266739
## iter  60 value 5.953360
## iter  70 value 5.702718
## iter  80 value 5.678465
## iter  90 value 5.482990
## iter 100 value 5.302906
## final  value 5.302906 
## stopped after 100 iterations
## # weights:  246
## initial  value 62.857655 
## iter  10 value 5.477674
## iter  20 value 2.962081
## iter  30 value 2.929581
## iter  40 value 2.916364
## iter  50 value 2.899859
## iter  60 value 2.885782
## iter  70 value 2.876054
## iter  80 value 2.869832
## iter  90 value 2.863646
## iter 100 value 2.859856
## final  value 2.859856 
## stopped after 100 iterations
## # weights:  50
## initial  value 72.318449 
## iter  10 value 23.905200
## iter  20 value 14.508402
## iter  30 value 14.348878
## iter  40 value 14.347977
## final  value 14.347976 
## converged
## # weights:  148
## initial  value 63.946219 
## iter  10 value 21.282347
## iter  20 value 11.393931
## iter  30 value 10.828035
## iter  40 value 10.789203
## iter  50 value 10.749876
## iter  60 value 10.736921
## iter  70 value 9.454619
## iter  80 value 9.339563
## iter  90 value 9.087192
## iter 100 value 9.044489
## final  value 9.044489 
## stopped after 100 iterations
## # weights:  246
## initial  value 75.363655 
## iter  10 value 17.219448
## iter  20 value 9.739452
## iter  30 value 4.175350
## iter  40 value 4.159409
## iter  50 value 4.158950
## final  value 4.158883 
## converged
## # weights:  50
## initial  value 60.841012 
## iter  10 value 30.539360
## iter  20 value 22.492960
## iter  30 value 21.020821
## iter  40 value 20.909006
## final  value 20.908686 
## converged
## # weights:  148
## initial  value 74.528678 
## iter  10 value 26.712829
## iter  20 value 17.373002
## iter  30 value 16.727912
## iter  40 value 16.692688
## iter  50 value 16.686953
## iter  60 value 16.686728
## final  value 16.686721 
## converged
## # weights:  246
## initial  value 78.076159 
## iter  10 value 21.956834
## iter  20 value 16.437015
## iter  30 value 14.691541
## iter  40 value 14.195768
## iter  50 value 14.085760
## iter  60 value 13.964192
## iter  70 value 13.888741
## iter  80 value 13.848692
## iter  90 value 13.842821
## iter 100 value 13.842766
## final  value 13.842766 
## stopped after 100 iterations
## # weights:  50
## initial  value 64.246782 
## iter  10 value 32.902723
## iter  20 value 27.230156
## iter  30 value 23.629822
## iter  40 value 23.347362
## iter  50 value 23.342720
## iter  60 value 23.341645
## iter  70 value 23.340590
## iter  80 value 23.339990
## iter  90 value 23.339493
## iter 100 value 23.339217
## final  value 23.339217 
## stopped after 100 iterations
## # weights:  148
## initial  value 85.712520 
## iter  10 value 16.791619
## iter  20 value 11.603040
## iter  30 value 11.074299
## iter  40 value 10.843327
## iter  50 value 10.333362
## iter  60 value 10.185515
## iter  70 value 9.996806
## iter  80 value 9.856838
## iter  90 value 9.572686
## iter 100 value 9.562315
## final  value 9.562315 
## stopped after 100 iterations
## # weights:  246
## initial  value 79.120018 
## iter  10 value 6.377651
## iter  20 value 2.244223
## iter  30 value 2.179833
## iter  40 value 2.135336
## iter  50 value 2.114168
## iter  60 value 2.095743
## iter  70 value 2.081811
## iter  80 value 2.070862
## iter  90 value 2.061911
## iter 100 value 2.055363
## final  value 2.055363 
## stopped after 100 iterations
## # weights:  50
## initial  value 77.557564 
## iter  10 value 28.387225
## iter  20 value 19.964057
## iter  30 value 16.618183
## iter  40 value 16.562671
## iter  50 value 16.554093
## iter  60 value 16.551415
## iter  70 value 16.546870
## iter  80 value 16.543692
## iter  90 value 16.543029
## iter 100 value 16.542131
## final  value 16.542131 
## stopped after 100 iterations
## # weights:  148
## initial  value 64.464868 
## iter  10 value 16.133207
## iter  20 value 8.703340
## iter  30 value 7.680735
## iter  40 value 7.561353
## iter  50 value 7.553601
## iter  60 value 7.553180
## iter  70 value 7.552963
## final  value 7.552950 
## converged
## # weights:  246
## initial  value 62.611608 
## iter  10 value 10.328249
## iter  20 value 3.188274
## iter  30 value 2.806133
## iter  40 value 2.775114
## iter  50 value 2.773460
## iter  60 value 2.772798
## iter  70 value 2.772726
## iter  80 value 2.772628
## final  value 2.772627 
## converged
## # weights:  50
## initial  value 73.592805 
## iter  10 value 34.840619
## iter  20 value 23.072476
## iter  30 value 20.065711
## iter  40 value 19.997377
## final  value 19.996969 
## converged
## # weights:  148
## initial  value 82.051734 
## iter  10 value 27.173160
## iter  20 value 17.850339
## iter  30 value 16.355921
## iter  40 value 16.148313
## iter  50 value 16.116440
## iter  60 value 16.085791
## iter  70 value 16.084163
## iter  80 value 16.084133
## final  value 16.084133 
## converged
## # weights:  246
## initial  value 76.495503 
## iter  10 value 22.318568
## iter  20 value 15.959355
## iter  30 value 15.296612
## iter  40 value 15.047693
## iter  50 value 14.955480
## iter  60 value 14.866659
## iter  70 value 14.857073
## iter  80 value 14.847217
## iter  90 value 14.844692
## iter 100 value 14.844617
## final  value 14.844617 
## stopped after 100 iterations
## # weights:  50
## initial  value 68.311073 
## iter  10 value 29.994470
## iter  20 value 15.165530
## iter  30 value 12.551919
## iter  40 value 12.389177
## iter  50 value 12.380944
## iter  60 value 12.377296
## iter  70 value 12.370890
## iter  80 value 12.366133
## iter  90 value 12.364434
## iter 100 value 12.362784
## final  value 12.362784 
## stopped after 100 iterations
## # weights:  148
## initial  value 69.746220 
## iter  10 value 14.162096
## iter  20 value 9.299150
## iter  30 value 9.278387
## iter  40 value 9.213619
## iter  50 value 8.760456
## iter  60 value 8.749491
## iter  70 value 8.745224
## iter  80 value 8.491255
## iter  90 value 7.612465
## iter 100 value 7.020722
## final  value 7.020722 
## stopped after 100 iterations
## # weights:  246
## initial  value 67.362469 
## iter  10 value 13.287662
## iter  20 value 6.978096
## iter  30 value 6.617655
## iter  40 value 5.973096
## iter  50 value 5.642162
## iter  60 value 5.054511
## iter  70 value 4.790129
## iter  80 value 4.320301
## iter  90 value 4.207467
## iter 100 value 2.982785
## final  value 2.982785 
## stopped after 100 iterations
## # weights:  148
## initial  value 90.759886 
## iter  10 value 37.280163
## iter  20 value 23.240553
## iter  30 value 18.488033
## iter  40 value 17.849119
## iter  50 value 17.699662
## iter  60 value 17.665383
## iter  70 value 17.637204
## iter  80 value 17.625254
## iter  90 value 17.623952
## iter 100 value 17.623916
## final  value 17.623916 
## stopped after 100 iterations
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 del Entrenamiento
mcre5 <- confusionMatrix(resultado_entrenamiento5, entrenamiento$m1_purchase)
mcre5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No  33   0
##        Yes  3  71
##                                           
##                Accuracy : 0.972           
##                  95% CI : (0.9202, 0.9942)
##     No Information Rate : 0.6636          
##     P-Value [Acc > NIR] : 2.388e-15       
##                                           
##                   Kappa : 0.9359          
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 0.9167          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.9595          
##              Prevalence : 0.3364          
##          Detection Rate : 0.3084          
##    Detection Prevalence : 0.3084          
##       Balanced Accuracy : 0.9583          
##                                           
##        'Positive' Class : No              
## 
# Matriz de Confusión del Resultado de la Prueba
mcrp5 <- confusionMatrix(resultado_prueba5, prueba$m1_purchase)
mcrp5
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No   2   7
##        Yes  7  10
##                                           
##                Accuracy : 0.4615          
##                  95% CI : (0.2659, 0.6663)
##     No Information Rate : 0.6538          
##     P-Value [Acc > NIR] : 0.9866          
##                                           
##                   Kappa : -0.1895         
##                                           
##  Mcnemar's Test P-Value : 1.0000          
##                                           
##             Sensitivity : 0.22222         
##             Specificity : 0.58824         
##          Pos Pred Value : 0.22222         
##          Neg Pred Value : 0.58824         
##              Prevalence : 0.34615         
##          Detection Rate : 0.07692         
##    Detection Prevalence : 0.34615         
##       Balanced Accuracy : 0.40523         
##                                           
##        'Positive' Class : No              
## 

Modelo 6. Bosques Aleatorios

modelo6 <- train(m1_purchase ~ ., 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_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 del Entrenamiento
mcre6 <- confusionMatrix(resultado_entrenamiento6, entrenamiento$m1_purchase)
mcre6
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No  34   0
##        Yes  2  71
##                                           
##                Accuracy : 0.9813          
##                  95% CI : (0.9341, 0.9977)
##     No Information Rate : 0.6636          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9576          
##                                           
##  Mcnemar's Test P-Value : 0.4795          
##                                           
##             Sensitivity : 0.9444          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.9726          
##              Prevalence : 0.3364          
##          Detection Rate : 0.3178          
##    Detection Prevalence : 0.3178          
##       Balanced Accuracy : 0.9722          
##                                           
##        'Positive' Class : No              
## 
# Matriz de Confusión del Resultado de la Prueba
mcrp6 <- confusionMatrix(resultado_prueba6, prueba$m1_purchase)
mcrp6
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No   4   6
##        Yes  5  11
##                                           
##                Accuracy : 0.5769          
##                  95% CI : (0.3692, 0.7665)
##     No Information Rate : 0.6538          
##     P-Value [Acc > NIR] : 0.8485          
##                                           
##                   Kappa : 0.0892          
##                                           
##  Mcnemar's Test P-Value : 1.0000          
##                                           
##             Sensitivity : 0.4444          
##             Specificity : 0.6471          
##          Pos Pred Value : 0.4000          
##          Neg Pred Value : 0.6875          
##              Prevalence : 0.3462          
##          Detection Rate : 0.1538          
##    Detection Prevalence : 0.3846          
##       Balanced Accuracy : 0.5458          
##                                           
##        '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"]),
   "nnet" = c(mcre5$overall["Accuracy"], mcrp5$overall["Accuracy"]),
   "rf" = c(mcre6$overall["Accuracy"], mcrp6$overall["Accuracy"])
)

rownames(resultados) <- c("Precisión de entrenamiento", "Precisión de prueba")
resultados
##                            svmLinear svmRadial   svmPoly     rpart      nnet
## Precisión de entrenamiento 0.9065421 0.9065421 0.8971963 0.8037383 0.9719626
## Precisión de prueba        0.5384615 0.5384615 0.5384615 0.5769231 0.4615385
##                                   rf
## Precisión de entrenamiento 0.9813084
## Precisión de prueba        0.5769231

Conclusiones

En general, se observa una brecha notable entre la precisión de entrenamiento y prueba en casi todos los modelos. Random Forest (rf) logra la mejor precisión en prueba (0.6538), pero el desempeño general sigue siendo bajo, posiblemente por un tamaño de muestra reducido u otros factores que limitan la generalización.

LS0tDQp0aXRsZTogIlNWTSINCmF1dGhvcjogIkhlbGVuYSBSYW3DrHJleiBHaWxlcyINCmRhdGU6ICIyMDI2LTAzLTAyIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IHlldGkNCi0tLQ0KDQo8Y2VudGVyPg0KIVtdKGh0dHBzOi8vbWlyby5tZWRpdW0uY29tL3YyL3Jlc2l6ZTpmaXQ6MTI1Mi8xKjBvMzh2RWNGMFU2Sm1PQU8ydi1xNGcuanBlZykNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWUiPiBUZW9yw61hIDwvc3Bhbj4NCg0KRWwgcGFxdWV0ZSBjYXJldCBlbiBSIGVzIHVuYSBoZXJyYW1pZW50YSBtdXkgdXRpbGl6YWRhIHBhcmEgY3JlYXIgbW9kZWxvcyBkZSBtYWNoaW5lIGxlYXJuaW5nLiBEZXN0YWNhIHBvcnF1ZSB1bmlmaWNhIHkgZmFjaWxpdGEgbGEgcHJlcGFyYWNpw7NuIGRlIGRhdG9zLCBlbCBlbnRyZW5hbWllbnRvIHkgbGEgdmFsaWRhY2nDs24gZGUgbW9kZWxvcyBlbiB1biBzb2xvIGZsdWpvIGRlIHRyYWJham8uIA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMgPC9zcGFuPg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiAjaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICMgR3LDoWZpY2FzDQpsaWJyYXJ5KGdncGxvdDIpDQogI2luc3RhbGwucGFja2FnZXMoImxhdHRpY2UiKSAjIENyZWFyIGdyw6FmaWNvcw0KbGlicmFyeShsYXR0aWNlKQ0KICNpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpICMgQWxnb3JpdG1vcyBkZSBhcHJlbmRpemFqZSBhdXRvbcOhdGljbw0KbGlicmFyeShjYXJldCkNCiAjaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKSAjIFVzYXIgYmFzZXMgZGUgZGF0b3MsIGVuIGVzdGUgY2FzbyBJcmlzDQpsaWJyYXJ5KGRhdGFzZXRzKQ0KICNpbnN0YWxsLnBhY2thZ2VzKCJEYXRhRXhwbG9yZXIiKSAjIEFuw6FsaXNpcyBFeHBsb3JhdG9yaW8NCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlIj4gQ3JlYXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI2ZpbGUuY2hvb3NlKCkgYnVzY2FyIGVsIGFyY2hpdm8NCmRmIDwtIHJlYWQuY3N2KCJDOlxcVXNlcnNcXHJhbWlyXFxEb3dubG9hZHNcXE0xX2RhdGEuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IFRSVUUpDQoNCiMgU2luIGVzdG8gdGVuZW1vcyBwcm9ibGVtYXMgZW4gbGEgcGFydGljaW9uIHBvcnF1ZSBubyB1bmlmaWNhIHkgZGV0ZWN0YSBlcnJvcmVzIGVuIGVsIG5pdmVsIGRlIHBydWViYSANCmRmJG0xX3B1cmNoYXNlIDwtIGFzLmZhY3RvcihkZiRtMV9wdXJjaGFzZSkNCg0KI0VsaW1pbmFtb3MgdmFsb3JlIG51bG9zIHBhcmEgZXN0YXIgc2VndXJvcyANCmRmIDwtIG5hLm9taXQoZGYpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWUiPiBFbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4NCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpzdW1tYXJ5KGRmKQ0Kc3RyKGRmKQ0KIyBjcmVhdGVfcmVwb3J0KGRmKQ0KcGxvdF9taXNzaW5nKGRmKQ0KcGxvdF9oaXN0b2dyYW0oZGYpIA0KcGxvdF9jb3JyZWxhdGlvbihkZikNCmBgYA0KDQoqKk5PVEE6IExhIHZhcmlhYmxlIHF1ZSBxdWVyZW1vcyBwcmVkZWNpciBkZWJlIHRlbmVyIGZvcm1hdG8gZGUgRkFDVE9SKioNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWUiPiBQYXJ0aXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KIyBOb3JtYWxtZW50ZSA4MC0yMA0Kc2V0LnNlZWQoMTIzKQ0KcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8gPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihkZiRtMV9wdXJjaGFzZSwgcD0wLjgsIGxpc3Q9RkFMU0UpDQplbnRyZW5hbWllbnRvIDwtIGRmW3Jlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdDQpwcnVlYmEgPC0gZGZbLXJlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWUiPiBEaXN0aW50b3MgdGlwb3MgZGUgTcOpdG9kb3MgcGFyYSBNb2RlbGFyIDwvc3Bhbj4NCkxvcyBtw6l0b2RvcyBtw6FzIHV0aWxpemFkb3MgcGFyYSBtb2RlbGFyIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvIHNvbjogIA0KDQoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUuIEhheSB2YXJpb3Mgc3VidGlwb3M6IExpbmVhbCAoc3ZtTGluZWFyKSwgUmFkaWFsIChzdm1SYWRpYWwpLCBQb2xpbsOzbWljbyAoc3ZtUG9seSksIGV0Yy4gICANCiogKirDgXJib2wgZGUgRGVjaXNpw7NuKio6IHJwYXJ0ICANCiogKipSZWRlcyBOZXVyb25hbGVzKio6IG5uZXQgIA0KKiAqKlJhbmRvbSBGb3Jlc3QqKiBvIEJvc3F1ZXMgQWxlYXRvcmlvczogcmYgIA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IE1vZGVsbyAxLiBTVk0gTGluZWFsIDwvc3Bhbj4NCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQptb2RlbG8xIDwtIHRyYWluKG0xX3B1cmNoYXNlIH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtTGluZWFyIiwgDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsICJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGRhdGEuZnJhbWUoQz0xKSANCikNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8xIDwtIHByZWRpY3QobW9kZWxvMSwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmExIDwtIHByZWRpY3QobW9kZWxvMSwgcHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8NCm1jcmUxIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzEsIGVudHJlbmFtaWVudG8kbTFfcHVyY2hhc2UpDQptY3JlMQ0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQ0KbWNycDEgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmExLCBwcnVlYmEkbTFfcHVyY2hhc2UpDQptY3JwMQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlIj4gTW9kZWxvIDIuIFNWTSBSYWRpYWwgPC9zcGFuPg0KYGBge3Igd2FybmluZz1GQUxTRX0NCm1vZGVsbzIgPC0gdHJhaW4obTFfcHVyY2hhc2UgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1SYWRpYWwiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCAiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICAgdHVuZUdyaWRlID0gZGF0YS5mcmFtZShzaWdtYT0xLCBDPTEpICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8yIDwtIHByZWRpY3QobW9kZWxvMiwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEyIDwtIHByZWRpY3QobW9kZWxvMiwgcHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuDQojIEVzIHVuYSB0YWJsYSBkZSBldmFsdWFjacOzbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjacOzbi4gDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50bw0KbWNyZTIgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMiwgZW50cmVuYW1pZW50byRtMV9wdXJjaGFzZSkNCm1jcmUyDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTIsIHBydWViYSRtMV9wdXJjaGFzZSkNCm1jcnAyDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWUiPiBNb2RlbG8gMy4gU1ZNIFBvbGluw7NtaWNvIDwvc3Bhbj4NCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQptb2RlbG8zIDwtIHRyYWluKG0xX3B1cmNoYXNlIH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtUG9seSIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsICJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZGUgPSBkYXRhLmZyYW1lKGRlZ3JlZT0xLCBzY2FsZT0xLCBDPTEpICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8zIDwtIHByZWRpY3QobW9kZWxvMywgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEzIDwtIHByZWRpY3QobW9kZWxvMywgcHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuDQojIEVzIHVuYSB0YWJsYSBkZSBldmFsdWFjacOzbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjacOzbi4gDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50bw0KbWNyZTMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMywgZW50cmVuYW1pZW50byRtMV9wdXJjaGFzZSkNCm1jcmUzDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwMyA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTMsIHBydWViYSRtMV9wdXJjaGFzZSkNCm1jcnAzDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWUiPiBNb2RlbG8gNC4gw4FyYm9sIGRlIERlY2lzacOzbiA8L3NwYW4+DQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KbW9kZWxvNCA8LSB0cmFpbihtMV9wdXJjaGFzZSB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInJwYXJ0IiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwgImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgIHR1bmVMZW5ndGggPSAxMCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNCA8LSBwcmVkaWN0KG1vZGVsbzQsIGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhNCA8LSBwcmVkaWN0KG1vZGVsbzQsIHBydWViYSkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbg0KIyBFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24uIA0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8NCm1jcmU0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQsIGVudHJlbmFtaWVudG8kbTFfcHVyY2hhc2UpDQptY3JlNA0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQ0KbWNycDQgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE0LCBwcnVlYmEkbTFfcHVyY2hhc2UpDQptY3JwNA0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlIj4gTW9kZWxvIDUuIFJlZGVzIE5ldXJvbmFsZXMgPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm1vZGVsbzUgPC0gdHJhaW4obTFfcHVyY2hhc2UgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJubmV0IiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwgImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCkNCiAgICAgICAgICAgICAgICAgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzUgPC0gcHJlZGljdChtb2RlbG81LCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTUgPC0gcHJlZGljdChtb2RlbG81LCBwcnVlYmEpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24NCiMgRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuLiANCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvDQptY3JlNSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG81LCBlbnRyZW5hbWllbnRvJG0xX3B1cmNoYXNlKQ0KbWNyZTUNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnA1IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNSwgcHJ1ZWJhJG0xX3B1cmNoYXNlKQ0KbWNycDUNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IE1vZGVsbyA2LiBCb3NxdWVzIEFsZWF0b3Jpb3MgPC9zcGFuPg0KYGBge3Igd2FybmluZz1GQUxTRX0NCm1vZGVsbzYgPC0gdHJhaW4obTFfcHVyY2hhc2UgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJyZiIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsICJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGV4cGFuZC5ncmlkKG10cnkgPSBjKDIsNCw2KSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYgPC0gcHJlZGljdChtb2RlbG82LCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTYgPC0gcHJlZGljdChtb2RlbG82LCBwcnVlYmEpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24NCiMgRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuLiANCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvDQptY3JlNiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG82LCBlbnRyZW5hbWllbnRvJG0xX3B1cmNoYXNlKQ0KbWNyZTYNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnA2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNiwgcHJ1ZWJhJG0xX3B1cmNoYXNlKQ0KbWNycDYNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IFRhYmxhIGRlIFJlc3VsdGFkb3MgPC9zcGFuPg0KYGBge3Igd2FybmluZz1GQUxTRX0NCnJlc3VsdGFkb3MgPC0gZGF0YS5mcmFtZSgNCiAgInN2bUxpbmVhciIgPSBjKG1jcmUxJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAxJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAgInN2bVJhZGlhbCIgPSBjKG1jcmUyJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAyJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAgInN2bVBvbHkiID0gYyhtY3JlMyRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMyRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgICJycGFydCIgPSBjKG1jcmU0JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA0JG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAgIm5uZXQiID0gYyhtY3JlNSRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNSRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgICJyZiIgPSBjKG1jcmU2JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA2JG92ZXJhbGxbIkFjY3VyYWN5Il0pDQopDQoNCnJvd25hbWVzKHJlc3VsdGFkb3MpIDwtIGMoIlByZWNpc2nDs24gZGUgZW50cmVuYW1pZW50byIsICJQcmVjaXNpw7NuIGRlIHBydWViYSIpDQpyZXN1bHRhZG9zDQpgYGANCg0KDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlIj4gQ29uY2x1c2lvbmVzIDwvc3Bhbj4NCg0KRW4gZ2VuZXJhbCwgc2Ugb2JzZXJ2YSB1bmEgYnJlY2hhIG5vdGFibGUgZW50cmUgbGEgcHJlY2lzacOzbiBkZSBlbnRyZW5hbWllbnRvIHkgcHJ1ZWJhIGVuIGNhc2kgdG9kb3MgbG9zIG1vZGVsb3MuIFJhbmRvbSBGb3Jlc3QgKHJmKSBsb2dyYSBsYSBtZWpvciBwcmVjaXNpw7NuIGVuIHBydWViYSAoMC42NTM4KSwgcGVybyBlbCBkZXNlbXBlw7FvIGdlbmVyYWwgc2lndWUgc2llbmRvIGJham8sIHBvc2libGVtZW50ZSBwb3IgdW4gdGFtYcOxbyBkZSBtdWVzdHJhIHJlZHVjaWRvIHUgb3Ryb3MgZmFjdG9yZXMgcXVlIGxpbWl0YW4gbGEgZ2VuZXJhbGl6YWNpw7NuLg==