{"id":3281,"date":"2016-05-23T17:52:53","date_gmt":"2016-05-23T15:52:53","guid":{"rendered":"https:\/\/geekosas.com\/?p=3281"},"modified":"2026-05-23T17:53:22","modified_gmt":"2026-05-23T15:53:22","slug":"multi-core-performance-in-r","status":"publish","type":"post","link":"https:\/\/geekosas.com\/index.php\/2016\/05\/23\/multi-core-performance-in-r\/","title":{"rendered":"Multi-Core Performance in R"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>A few days ago, while walking around, I saw that they were selling a used HP Proliant DL360 G6. For those who don&#8217;t know, it&#8217;s a high\u2011performance server from 2010.<\/p>\n<p>Due to my interest in Data Science and BIG DATA, this toy will be useful for a diploma course I&#8217;m interested in, which is taught by the FCFM of the University of Chile.<\/p>\n<h3>Toy Specifications:<\/h3>\n<ul>\n<li>2 x Xeon 5530 2.4 GHz, 4 processors with hyperthreading (disabled in this test)<\/li>\n<li>64 GB RAM<\/li>\n<li>Nvidia Quadro M2000 4GB VRAM GDDR5<\/li>\n<li>Smart Array RAID card with battery<\/li>\n<li>2 independent power supplies<\/li>\n<li>4 SAS hard drives<\/li>\n<\/ul>\n<h3>Toy Photos:<\/h3>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1465\" data-permalink=\"https:\/\/geekosas.com\/index.php\/es\/2016\/11\/19\/multy-core-performance-en-r\/image_3140\/\" data-orig-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?fit=3504%2C2336&amp;ssl=1\" data-orig-size=\"3504,2336\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image_3140\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?fit=1024%2C683&amp;ssl=1\" class=\"alignnone size-medium wp-image-1465\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140-300x200.jpg?resize=300%2C200&#038;ssl=1\" alt=\"\" width=\"300\" height=\"200\" srcset=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?resize=300%2C200&amp;ssl=1 300w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?resize=768%2C512&amp;ssl=1 768w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?resize=1024%2C683&amp;ssl=1 1024w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?w=2000&amp;ssl=1 2000w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?w=3000&amp;ssl=1 3000w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1464\" data-permalink=\"https:\/\/geekosas.com\/index.php\/es\/2016\/11\/19\/multy-core-performance-en-r\/hp-proliant-dl360-g6-1\/\" data-orig-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?fit=4992%2C1317&amp;ssl=1\" data-orig-size=\"4992,1317\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;H 25&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1232705332&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;50&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"hp-proliant-dl360-g6-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?fit=1024%2C270&amp;ssl=1\" class=\"wp-image-1464 alignnone\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1-300x79.jpg?resize=467%2C123\" alt=\"\" width=\"467\" height=\"123\" srcset=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?resize=300%2C79&amp;ssl=1 300w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?resize=768%2C203&amp;ssl=1 768w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?resize=1024%2C270&amp;ssl=1 1024w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?w=2000&amp;ssl=1 2000w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?w=3000&amp;ssl=1 3000w\" sizes=\"auto, (max-width: 467px) 100vw, 467px\" \/><\/p>\n<p><!--more--><\/p>\n<h2>The Test<\/h2>\n<p>I will use the <strong>plyr<\/strong>, <strong>data.table<\/strong>, and <strong>reshape2<\/strong> libraries for aggregations, and <strong>doSNOW<\/strong> for parallelization. The dataset will be a table of about 30 million records similar to a mobile operator&#8217;s database (as far as I remember, these records are called CDRs stored in the CRCE of the rating platform).<\/p>\n<p>Basically, the table will have a user identifier, a traffic type identifier, and the traffic amount.<\/p>\n<h3>Generate the Data<\/h3>\n<p>We will generate 30 million CDR records in a table that will have:<\/p>\n<ul>\n<li>User identifier<\/li>\n<li>Traffic type<\/li>\n<li>Traffic amount<\/li>\n<\/ul>\n<pre><code class=\"language-r\">options(stringsAsFactors = FALSE)\nlibrary(reshape2)\nlibrary(plyr)\n\n# Parameters\nset.seed(1986) # seed set to the birth date of my dear girlfriend\ntipo_trafico = c(&quot;DATA&quot;,&quot;SMS&quot;,&quot;VOICE&quot;)\nprob_tipo_trafico = c(0.6,0.1,0.3)\nuserids = 5e4 # simulate n users\nregistros = 3e7 # number of CDR records\n\n# Random traffic amount values\ndatos_tipo_trafico =\n  data.frame(\n    DATA = round(runif(registros,1,1024^2)),  # data session in bytes, between 1 byte and 1 MB\n    SMS = rep(1,registros),                    # each SMS generates one record\n    VOICE = round(rexp(registros,1\/120))       # call length in seconds\n  )\n\n# Generate CDR records\ncdr = data.frame(\n  id_cdr = 1:registros,\n  userid = floor(runif(registros,1,userids+1)),\n  tipo_trafico = sample(tipo_trafico,registros,replace = T,prob = prob_tipo_trafico)\n)\n\nTI = proc.time()\ncdr$trafico = datos_tipo_trafico$DATA*(cdr$tipo_trafico==&quot;DATA&quot;) + \n              datos_tipo_trafico$SMS*(cdr$tipo_trafico==&quot;SMS&quot;) + \n              datos_tipo_trafico$VOICE*(cdr$tipo_trafico==&quot;VOICE&quot;)\nprint(proc.time()-TI)\nrm(datos_tipo_trafico) # delete random data table\ngc() # clean unused memory<\/code><\/pre>\n<p>The result is a table with this format:<\/p>\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>id_cdr<\/th>\n<th>userid<\/th>\n<th>tipo_trafico<\/th>\n<th>trafico<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>1<\/td>\n<td>5579<\/td>\n<td>VOICE<\/td>\n<td>20<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>2<\/td>\n<td>28374<\/td>\n<td>VOICE<\/td>\n<td>82<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>3<\/td>\n<td>28526<\/td>\n<td>VOICE<\/td>\n<td>36<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>4<\/td>\n<td>39179<\/td>\n<td>VOICE<\/td>\n<td>56<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>5<\/td>\n<td>14244<\/td>\n<td>DATA<\/td>\n<td>629075<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>6<\/td>\n<td>36779<\/td>\n<td>DATA<\/td>\n<td>690397<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>7<\/td>\n<td>42774<\/td>\n<td>DATA<\/td>\n<td>175632<\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>8<\/td>\n<td>4276<\/td>\n<td>VOICE<\/td>\n<td>115<\/td>\n<\/tr>\n<tr>\n<td>9<\/td>\n<td>9<\/td>\n<td>4445<\/td>\n<td>VOICE<\/td>\n<td>44<\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>10<\/td>\n<td>29458<\/td>\n<td>DATA<\/td>\n<td>946171<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Benchmark<\/h3>\n<p>We will create a table of aggregated traffic per user. This table will be generated with: <strong>reshape2<\/strong>, <strong>data.table<\/strong>, and <strong>plyr<\/strong> (single\u2011thread and multi\u2011thread).<\/p>\n<p>Some comments before showing the results:<\/p>\n<ul>\n<li><strong>reshape2<\/strong> allows aggregation but offers far fewer options than the other libraries.<\/li>\n<li><strong>data.table<\/strong> is an extension of data.frame that allows the use of indices.<\/li>\n<li><strong>plyr<\/strong> can run either single\u2011thread or in parallel.<\/li>\n<\/ul>\n<p>The code used:<\/p>\n<pre><code class=\"language-r\"># using reshape2\nTI = proc.time()\ntmp = reshape2::dcast(cdr, userid ~ tipo_trafico, fun.aggregate = sum, value.var = &quot;trafico&quot;)\nprint(proc.time()-TI)\n\n# using plyr 1 thread\nTI = proc.time()\ntmp = ddply(cdr, &quot;userid&quot;, function(x) data.frame(DATA = sum(ifelse(x$tipo_trafico == &quot;DATA&quot;, x$trafico, 0)),\n                                                  SMS = sum(ifelse(x$tipo_trafico == &quot;SMS&quot;, x$trafico, 0)),\n                                                  VOICE = sum(ifelse(x$tipo_trafico == &quot;VOICE&quot;, x$trafico, 0))\n                                                  ), .progress = T)\nprint(proc.time()-TI)\n\n# using plyr 8 threads (one per CPU)\nlibrary(&quot;doSNOW&quot;)\nnCPU = as.numeric(Sys.getenv(&quot;NUMBER_OF_PROCESSORS&quot;)[1])\ncl = makeSOCKcluster(nCPU, outfile=&quot;cl.txt&quot;)\nregisterDoSNOW(cl)\nTI = proc.time()\ntmp = ddply(cdr, &quot;userid&quot;, function(x) data.frame(DATA = sum(ifelse(x$tipo_trafico == &quot;DATA&quot;, x$trafico, 0)),\n                                                  SMS = sum(ifelse(x$tipo_trafico == &quot;SMS&quot;, x$trafico, 0)),\n                                                  VOICE = sum(ifelse(x$tipo_trafico == &quot;VOICE&quot;, x$trafico, 0))\n                                                  ), .parallel = T)\nprint(proc.time()-TI)\nstopCluster(cl)\n\n# using plyr 2 threads\nlibrary(&quot;doSNOW&quot;)\nnCPU = as.numeric(Sys.getenv(&quot;NUMBER_OF_PROCESSORS&quot;)[1])\ncl = makeSOCKcluster(2, outfile=&quot;cl.txt&quot;)\nregisterDoSNOW(cl)\nTI = proc.time()\ntmp = ddply(cdr, &quot;userid&quot;, function(x) data.frame(DATA = sum(ifelse(x$tipo_trafico == &quot;DATA&quot;, x$trafico, 0)),\n                                                  SMS = sum(ifelse(x$tipo_trafico == &quot;SMS&quot;, x$trafico, 0)),\n                                                  VOICE = sum(ifelse(x$tipo_trafico == &quot;VOICE&quot;, x$trafico, 0))\n                                                  ), .parallel = T)\nprint(proc.time()-TI)\nstopCluster(cl)\n\n# using data.table\nlibrary(data.table)\ncdr_dt = data.table(cdr, key = &quot;userid&quot;)\nTI = proc.time()\ntmp = cdr_dt[, list(DATA = sum(ifelse(tipo_trafico == &quot;DATA&quot;, trafico, 0)),\n                    SMS = sum(ifelse(tipo_trafico == &quot;SMS&quot;, trafico, 0)),\n                    VOICE = sum(ifelse(tipo_trafico == &quot;VOICE&quot;, trafico, 0))\n                    ), by = &quot;userid&quot;]\nprint(proc.time()-TI)<\/code><\/pre>\n<h2>Results<\/h2>\n<table>\n<thead>\n<tr>\n<th>library<\/th>\n<th>function<\/th>\n<th>threads<\/th>\n<th>seconds<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>plyr<\/td>\n<td>ddply<\/td>\n<td>1<\/td>\n<td>9.18<\/td>\n<\/tr>\n<tr>\n<td>plyr<\/td>\n<td>ddply<\/td>\n<td>2<\/td>\n<td>78.37<\/td>\n<\/tr>\n<tr>\n<td>plyr<\/td>\n<td>ddply<\/td>\n<td>8<\/td>\n<td>146.04<\/td>\n<\/tr>\n<tr>\n<td>reshape2<\/td>\n<td>dcast<\/td>\n<td>1<\/td>\n<td>17.31<\/td>\n<\/tr>\n<tr>\n<td>data.table<\/td>\n<td><\/td>\n<td>1<\/td>\n<td>12.94<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Conclusions<\/h2>\n<p><strong>reshape2<\/strong>, despite being a library specialized in this type of transformation, turned out to be slower than <strong>plyr<\/strong>.<\/p>\n<p><strong>plyr<\/strong> lost performance as more threads were added. This is because for simple operations, the cost of parallelization is higher than not using the other CPUs.<\/p>\n<p><strong>data.table<\/strong>, despite using indices, turned out to be slower than <strong>plyr<\/strong>. When complex algorithms are used for simple situations, performance can sometimes be lost.<\/p>\n<h2>For the Future&#8230;<\/h2>\n<p>In the future, I will run these tests using larger datasets and different numbers of users to see what results are obtained.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Introduction A few days ago, while walking around, I saw that they were selling a used HP Proliant DL360 G6. For those who don&#8217;t know, <a class=\"mh-excerpt-more\" href=\"https:\/\/geekosas.com\/index.php\/2016\/05\/23\/multi-core-performance-in-r\/\" title=\"Multi-Core Performance in R\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":2137,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-3281","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categoria"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/RStudio-Ball.png?fit=1000%2C1000&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8vjqF-QV","jetpack-related-posts":[{"id":3262,"url":"https:\/\/geekosas.com\/index.php\/2016\/05\/23\/arduino-2\/","url_meta":{"origin":3281,"position":0},"title":"Arduino","author":"Daniel Fischer","date":"2016-05-23","format":false,"excerpt":"It's hard to start this article. I've been playing with my new Arduino Starter Kit for a few days, and I think the best way to define it is: an electronic Lego. An excellent toy for those who enjoyed the blocks years ago. Arduino is a microcontroller easily programmable from\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3264,"url":"https:\/\/geekosas.com\/index.php\/2016\/05\/23\/how-to-choose-a-cell-phone\/","url_meta":{"origin":3281,"position":1},"title":"How to choose a cell phone?","author":"Daniel Fischer","date":"2016-05-23","format":false,"excerpt":"We spend more time with our cell phone than with our family. In fact, we use it to communicate with them, and for many it is an essential work tool. A cell phone, whether you want to admit it or not, is a life companion that, depending on the relationship,\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/mensagens_amor_namorados_para_celular.jpg?fit=400%2C225&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3223,"url":"https:\/\/geekosas.com\/index.php\/2020\/05\/14\/insert-records-into-the-database-at-full-speed\/","url_meta":{"origin":3281,"position":2},"title":"Insert Records into the Database at Full Speed","author":"Daniel Fischer","date":"2020-05-14","format":false,"excerpt":"ETL tools are very useful for performing automated and recurring data transformation processes; they are characterized by performing three tasks: (E) Extract: Connect to one or more sources and extract data. (T) Transform: Transform or manipulate the data. (L) Load: Load the transformed data into the final repository. That is\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/patch.png?fit=728%2C380&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/patch.png?fit=728%2C380&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/patch.png?fit=728%2C380&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/patch.png?fit=728%2C380&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":3285,"url":"https:\/\/geekosas.com\/index.php\/2017\/05\/23\/video-games-and-statistics\/","url_meta":{"origin":3281,"position":3},"title":"Video Games and Statistics","author":"Daniel Fischer","date":"2017-05-23","format":false,"excerpt":"The video game industry has grown exponentially. New game genres, new business models, new types of gamers, and new devices for playing have been created, but what hasn't changed is that so\u2011called triple\u2011A games still exist. Triple\u2011A games are characterized by belonging to companies with a large budget to invest\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/02\/fifa-300x121.jpg?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/02\/fifa-300x121.jpg?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/02\/fifa-300x121.jpg?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/02\/fifa-300x121.jpg?resize=700%2C400 2x"},"classes":[]},{"id":3269,"url":"https:\/\/geekosas.com\/index.php\/2016\/05\/23\/playing-with-neural-networks\/","url_meta":{"origin":3281,"position":4},"title":"Playing with Neural Networks","author":"Daniel Fischer","date":"2016-05-23","format":false,"excerpt":"A few days ago I wrote about neural networks, trying to explain in a simple way how they work and why this type of technology is called \"artificial intelligence.\" The important thing about this technique and what makes it so revolutionary is the concept of training, but it is often\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/tensorflow.png?fit=1200%2C715&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/tensorflow.png?fit=1200%2C715&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/tensorflow.png?fit=1200%2C715&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/tensorflow.png?fit=1200%2C715&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/tensorflow.png?fit=1200%2C715&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3227,"url":"https:\/\/geekosas.com\/index.php\/2026\/05\/13\/como-se-repartieron-los-votos-en-la-segunda-vuelta-en-chile\/","url_meta":{"origin":3281,"position":5},"title":"How were the votes distributed in the runoff election in Chile?","author":"Daniel Fischer","date":"2026-05-13","format":false,"excerpt":"Acknowledgments: I would like to begin this article by thanking Hernan Aburto (huaburto@gmail.com) for his assistance. We worked together to refine the model and polish the conclusions. His version of the article on his blog: https:\/\/www.grialprofano.cl\/flyto\/97\/que-paso-con-los-votos-de-la-primera-vuelta-en-el-balotaje\/ How were the votes distributed? In the most recent elections held on Sunday, December\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/12\/FRCN3F5FY6BYLWSLIY4NSVWH5E.jpg?fit=900%2C600&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/12\/FRCN3F5FY6BYLWSLIY4NSVWH5E.jpg?fit=900%2C600&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/12\/FRCN3F5FY6BYLWSLIY4NSVWH5E.jpg?fit=900%2C600&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/12\/FRCN3F5FY6BYLWSLIY4NSVWH5E.jpg?fit=900%2C600&ssl=1&resize=700%2C400 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/comments?post=3281"}],"version-history":[{"count":1,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3281\/revisions"}],"predecessor-version":[{"id":3282,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3281\/revisions\/3282"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media\/2137"}],"wp:attachment":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media?parent=3281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/categories?post=3281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/tags?post=3281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}