<p><div><div><div><div data-show-faces="false" data-height="21" data-width="100" data-layout="button_count" data-send="true" data-href="https://www.r-bloggers.com/a-guide-to-gpu-accelerated-ships-recognition-in-satellite-imagery-using-keras-and-r-part-ii/"></div></div><div></div></div><div></div></div>
<div>
(This article was first published on <strong><a href="http://appsilondatascience.com/blog/rstats/2018/01/23/keras.html"> Appsilon Data Science Blog</a></strong>, and kindly contributed to <a rel="nofollow" href="https://www.r-bloggers.com/">R-bloggers)</a> </div>
<h2>Before we start…</h2>
<p>We hope you found the <a rel="nofollow" href="http://appsilondatascience.com/blog/rstats/2018/01/16/keras.html" target="_blank">first half</a> of this post useful and interesting. Before we dive into the code, I want to explain a few important aspects of data science. Firstly, implementing data science in practice is always a research process. The goals we set have a significant impact on the methods chosen. Trying to achieve even a marginal increase in accuracy or precision can have a significant impact on the project’s duration. Development is heavily influenced by the data, as well. Achieving the same results on different data sets is not always a straightforward process.</p>
<p>Furthermore, I want to describe why we use GPU’s over CPU’s to train our models. It is important to go into the differences between the two. CPU’s only have a few cores. Generally, each core works on a single process at a time. GPU’s on the other hand, have hundreds of weaker cores.</p>
<p>Technically speaking, training a model is done through thousands of small processes and individual statistical manipulations. Each of these processes can be done at the same time on a GPU, vastly decreasing the necessary time needed for training. The differences are most apparent in Deep Learning.</p>
<h2>The data</h2>
<p>Before we start changing our CNN’s architecture, there are some things we can do when preparing our data. As a reminder, we’ve got 2800 satelite images (80 pixel height, 80 pixel width, 3 colors – RGB color space). This isn’t a huge sample, especially in Deep Learning, but it will do for our needs. In situations like this, a common practise is to use some geometric transformation (rotation, translation, thickening, blurring etc.) to enlarge training set. For example, in R we can use <strong>rot90</strong> function from the <strong>pracma</strong> package to create images rotated by 90, 180, or 270 degrees. We now have to slightly modify the code:</p>
<figure>
<pre><code data-lang="r"><span>library</span><span>(</span><span>keras</span><span>)</span><span>
</span><span>library</span><span>(</span><span>tidyverse</span><span>)</span><span>
</span><span>library</span><span>(</span><span>jsonlite</span><span>)</span><span>
</span><span>library</span><span>(</span><span>abind</span><span>)</span><span>
</span><span>library</span><span>(</span><span>gridExtra</span><span>)</span><span>
</span><span>library</span><span>(</span><span>pracma</span><span>)</span><span>
</span><span>ships_json</span><span> </span><span>&lt;-</span><span> </span><span>fromJSON</span><span>(</span><span>&quot;ships_images/shipsnet.json&quot;</span><span>)[</span><span>1</span><span>:</span><span>2</span><span>]</span><span>
</span><span>ships_data</span><span> </span><span>&lt;-</span><span> </span><span>ships_json</span><span>$</span><span>data</span><span> </span><span>%>%</span><span>
</span><span>apply</span><span>(</span><span>.</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>function</span><span>(</span><span>x</span><span>)</span><span> </span><span>{</span><span>
</span><span>r</span><span> </span><span>&lt;-</span><span> </span><span>matrix</span><span>(</span><span>x</span><span>[</span><span>1</span><span>:</span><span>6400</span><span>],</span><span> </span><span>80</span><span>,</span><span> </span><span>80</span><span>,</span><span> </span><span>byrow</span><span> </span><span>=</span><span> </span><span>TRUE</span><span>)</span><span> </span><span>/</span><span> </span><span>255</span><span>
</span><span>g</span><span> </span><span>&lt;-</span><span> </span><span>matrix</span><span>(</span><span>x</span><span>[</span><span>6401</span><span>:</span><span>12800</span><span>],</span><span> </span><span>80</span><span>,</span><span> </span><span>80</span><span>,</span><span> </span><span>byrow</span><span> </span><span>=</span><span> </span><span>TRUE</span><span>)</span><span> </span><span>/</span><span> </span><span>255</span><span>
</span><span>b</span><span> </span><span>&lt;-</span><span> </span><span>matrix</span><span>(</span><span>x</span><span>[</span><span>12801</span><span>:</span><span>19200</span><span>],</span><span> </span><span>80</span><span>,</span><span> </span><span>80</span><span>,</span><span> </span><span>byrow</span><span> </span><span>=</span><span> </span><span>TRUE</span><span>)</span><span> </span><span>/</span><span> </span><span>255</span><span>
</span><span>list</span><span>(</span><span>array</span><span>(</span><span>c</span><span>(</span><span>r</span><span>,</span><span> </span><span>g</span><span>,</span><span> </span><span>b</span><span>),</span><span> </span><span>dim</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>80</span><span>,</span><span> </span><span>80</span><span>,</span><span> </span><span>3</span><span>)),</span><span> </span><span># Orginal
</span><span> </span><span>array</span><span>(</span><span>c</span><span>(</span><span>rot90</span><span>(</span><span>r</span><span>,</span><span> </span><span>1</span><span>),</span><span> </span><span>rot90</span><span>(</span><span>g</span><span>,</span><span> </span><span>1</span><span>),</span><span> </span><span>rot90</span><span>(</span><span>b</span><span>,</span><span> </span><span>1</span><span>)),</span><span> </span><span>dim</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>80</span><span>,</span><span> </span><span>80</span><span>,</span><span> </span><span>3</span><span>)),</span><span> </span><span># 90 degrees
</span><span> </span><span>array</span><span>(</span><span>c</span><span>(</span><span>rot90</span><span>(</span><span>r</span><span>,</span><span> </span><span>2</span><span>),</span><span> </span><span>rot90</span><span>(</span><span>g</span><span>,</span><span> </span><span>2</span><span>),</span><span> </span><span>rot90</span><span>(</span><span>b</span><span>,</span><span> </span><span>2</span><span>)),</span><span> </span><span>dim</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>80</span><span>,</span><span> </span><span>80</span><span>,</span><span> </span><span>3</span><span>)),</span><span> </span><span># 180 degrees
</span><span> </span><span>array</span><span>(</span><span>c</span><span>(</span><span>rot90</span><span>(</span><span>r</span><span>,</span><span> </span><span>3</span><span>),</span><span> </span><span>rot90</span><span>(</span><span>g</span><span>,</span><span> </span><span>3</span><span>),</span><span> </span><span>rot90</span><span>(</span><span>b</span><span>,</span><span> </span><span>3</span><span>)),</span><span> </span><span>dim</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>80</span><span>,</span><span> </span><span>80</span><span>,</span><span> </span><span>3</span><span>)))</span><span> </span><span># 270 degrees
</span><span> </span><span>})</span><span> </span><span>%>%</span><span>
</span><span>do.call</span><span>(</span><span>c</span><span>,</span><span> </span><span>.</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>abind</span><span>(</span><span>.</span><span>,</span><span> </span><span>along</span><span> </span><span>=</span><span> </span><span>4</span><span>)</span><span> </span><span>%>%</span><span> </span><span># Combine 3-dimensional arrays into 4-dimensional array
</span><span> </span><span>aperm</span><span>(</span><span>c</span><span>(</span><span>4</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>))</span><span> </span><span># Array transposition
</span><span>
</span><span>ships_labels</span><span> </span><span>&lt;-</span><span> </span><span>ships_json</span><span>$</span><span>labels</span><span> </span><span>%>%</span><span>
</span><span>map</span><span>(</span><span>~</span><span> </span><span>rep</span><span>(</span><span>.x</span><span>,</span><span> </span><span>4</span><span>))</span><span> </span><span>%>%</span><span>
</span><span>unlist</span><span>()</span><span> </span><span>%>%</span><span>
</span><span>to_categorical</span><span>(</span><span>2</span><span>)</span><span>
</span><span>set.seed</span><span>(</span><span>1234</span><span>)</span><span>
</span><span>indexes</span><span> </span><span>&lt;-</span><span> </span><span>sample</span><span>(</span><span>1</span><span>:</span><span>dim</span><span>(</span><span>ships_data</span><span>)[</span><span>1</span><span>],</span><span> </span><span>0.7</span><span> </span><span>*</span><span> </span><span>dim</span><span>(</span><span>ships_data</span><span>)[</span><span>1</span><span>]</span><span> </span><span>/</span><span> </span><span>4</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>map</span><span>(</span><span>~</span><span> </span><span>.x</span><span> </span><span>+</span><span> </span><span>0</span><span>:</span><span>3</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>unlist</span><span>()</span><span>
</span><span>train</span><span> </span><span>&lt;-</span><span> </span><span>list</span><span>(</span><span>data</span><span> </span><span>=</span><span> </span><span>ships_data</span><span>[</span><span>indexes</span><span>,</span><span> </span><span>,</span><span> </span><span>,</span><span> </span><span>],</span><span> </span><span>labels</span><span> </span><span>=</span><span> </span><span>ships_labels</span><span>[</span><span>indexes</span><span>,</span><span> </span><span>])</span><span>
</span><span>test</span><span> </span><span>&lt;-</span><span> </span><span>list</span><span>(</span><span>data</span><span> </span><span>=</span><span> </span><span>ships_data</span><span>[</span><span>-</span><span>indexes</span><span>,</span><span> </span><span>,</span><span> </span><span>,</span><span> </span><span>],</span><span> </span><span>labels</span><span> </span><span>=</span><span> </span><span>ships_labels</span><span>[</span><span>-</span><span>indexes</span><span>,</span><span> </span><span>])</span><span>
</span><span>xy_axis</span><span> </span><span>&lt;-</span><span> </span><span>data.frame</span><span>(</span><span>x</span><span> </span><span>=</span><span> </span><span>expand.grid</span><span>(</span><span>1</span><span>:</span><span>80</span><span>,</span><span> </span><span>80</span><span>:</span><span>1</span><span>)[</span><span> </span><span>,</span><span>1</span><span>],</span><span>
</span><span>y</span><span> </span><span>=</span><span> </span><span>expand.grid</span><span>(</span><span>1</span><span>:</span><span>80</span><span>,</span><span> </span><span>80</span><span>:</span><span>1</span><span>)[</span><span> </span><span>,</span><span>2</span><span>])</span><span>
</span><span>sample_plots</span><span> </span><span>&lt;-</span><span> </span><span>1</span><span>:</span><span>4</span><span> </span><span>%>%</span><span> </span><span>map</span><span>(</span><span>~</span><span> </span><span>{</span><span>
</span><span>plot_data</span><span> </span><span>&lt;-</span><span> </span><span>cbind</span><span>(</span><span>xy_axis</span><span>,</span><span>
</span><span>r</span><span> </span><span>=</span><span> </span><span>as.vector</span><span>(</span><span>t</span><span>(</span><span>ships_data</span><span>[</span><span>.x</span><span>,</span><span> </span><span>,</span><span> </span><span>,</span><span>1</span><span>])),</span><span>
</span><span>g</span><span> </span><span>=</span><span> </span><span>as.vector</span><span>(</span><span>t</span><span>(</span><span>ships_data</span><span>[</span><span>.x</span><span>,</span><span> </span><span>,</span><span> </span><span>,</span><span>2</span><span>])),</span><span>
</span><span>b</span><span> </span><span>=</span><span> </span><span>as.vector</span><span>(</span><span>t</span><span>(</span><span>ships_data</span><span>[</span><span>.x</span><span>,</span><span> </span><span>,</span><span> </span><span>,</span><span>3</span><span>])))</span><span>
</span><span>ggplot</span><span>(</span><span>plot_data</span><span>,</span><span> </span><span>aes</span><span>(</span><span>x</span><span>,</span><span> </span><span>y</span><span>,</span><span> </span><span>fill</span><span> </span><span>=</span><span> </span><span>rgb</span><span>(</span><span>r</span><span>,</span><span> </span><span>g</span><span>,</span><span> </span><span>b</span><span>)))</span><span> </span><span>+</span><span>
</span><span>guides</span><span>(</span><span>fill</span><span> </span><span>=</span><span> </span><span>FALSE</span><span>)</span><span> </span><span>+</span><span>
</span><span>scale_fill_identity</span><span>()</span><span> </span><span>+</span><span>
</span><span>theme_void</span><span>()</span><span> </span><span>+</span><span>
</span><span>geom_raster</span><span>(</span><span>hjust</span><span> </span><span>=</span><span> </span><span>0</span><span>,</span><span> </span><span>vjust</span><span> </span><span>=</span><span> </span><span>0</span><span>)</span><span> </span><span>+</span><span>
</span><span>ggtitle</span><span>(</span><span>paste</span><span>(((</span><span>.x</span><span> </span><span>-</span><span> </span><span>1</span><span>)</span><span> </span><span>*</span><span> </span><span>90</span><span>)</span><span> </span><span>%%</span><span> </span><span>360</span><span>,</span><span> </span><span>&quot;degree rotation&quot;</span><span>))</span><span>
</span><span>})</span><span>
</span><span>do.call</span><span>(</span><span>&quot;grid.arrange&quot;</span><span>,</span><span> </span><span>c</span><span>(</span><span>sample_plots</span><span>,</span><span> </span><span>ncol</span><span> </span><span>=</span><span> </span><span>2</span><span>,</span><span> </span><span>nrow</span><span> </span><span>=</span><span> </span><span>2</span><span>))</span></code></pre>
</figure>
<p><img alt="Rotated image" src="https://i0.wp.com/appsilondatascience.com/blog/assets/article_images/2017-11-22-keras2/rot.png?w=456" data-recalc-dims="1"></p>
<h2>CNN’s architecture</h2>
<p>We can change the architecture of our ConvNet in many different ways. The first and simplest thing we can try is to add more layers. Our initial network looks like this:</p>
<p><img alt="" src="https://i2.wp.com/appsilondatascience.com/blog/assets/article_images/2017-11-22-keras2/model_old.png?w=456" data-recalc-dims="1"></p>
<p>We will add some previously mentioned layers (convolutional, pooling, activation), but can also add some new ones. Our network is getting bigger and more complicated. As such, it could be prone to overfitting. To prevent this we can use a regularization method called <strong>dropout</strong>. In dropout, individual nodes are either removed from the network with some probability <strong>1-p</strong> or kept with probability <strong>p</strong>. To add dropout to a convolutional neural network in Keras we can use the <strong>layer_dropout()</strong> function and set the <strong>rate</strong> parameter to a desired probability. Our example architecture could looks like this:</p>
<p><img alt="" src="https://i0.wp.com/appsilondatascience.com/blog/assets/article_images/2017-11-22-keras2/model_new.png?w=456" data-recalc-dims="1"></p>
<figure>
<pre><code data-lang="r"><span>model2</span><span> </span><span>&lt;-</span><span> </span><span>keras_model_sequential</span><span>()</span><span>
</span><span>model2</span><span> </span><span>%>%</span><span>
</span><span>layer_conv_2d</span><span>(</span><span>
</span><span>filter</span><span> </span><span>=</span><span> </span><span>32</span><span>,</span><span> </span><span>kernel_size</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>3</span><span>,</span><span> </span><span>3</span><span>),</span><span> </span><span>padding</span><span> </span><span>=</span><span> </span><span>&quot;same&quot;</span><span>,</span><span> </span><span>input_shape</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>80</span><span>,</span><span> </span><span>80</span><span>,</span><span> </span><span>3</span><span>),</span><span> </span><span>activation</span><span> </span><span>=</span><span> </span><span>&quot;relu&quot;</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>layer_conv_2d</span><span>(</span><span>filter</span><span> </span><span>=</span><span> </span><span>32</span><span>,</span><span> </span><span>kernel_size</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>3</span><span>,</span><span> </span><span>3</span><span>),</span><span>
</span><span>activation</span><span> </span><span>=</span><span> </span><span>&quot;relu&quot;</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>layer_max_pooling_2d</span><span>(</span><span>pool_size</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>2</span><span>,</span><span> </span><span>2</span><span>))</span><span> </span><span>%>%</span><span>
</span><span>layer_dropout</span><span>(</span><span>0.25</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>layer_conv_2d</span><span>(</span><span>filter</span><span> </span><span>=</span><span> </span><span>64</span><span>,</span><span> </span><span>kernel_size</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>3</span><span>,</span><span> </span><span>3</span><span>),</span><span> </span><span>padding</span><span> </span><span>=</span><span> </span><span>&quot;same&quot;</span><span>,</span><span>
</span><span>activation</span><span> </span><span>=</span><span> </span><span>&quot;relu&quot;</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>layer_conv_2d</span><span>(</span><span>filter</span><span> </span><span>=</span><span> </span><span>64</span><span>,</span><span> </span><span>kernel_size</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>3</span><span>,</span><span> </span><span>3</span><span>),</span><span>
</span><span>activation</span><span> </span><span>=</span><span> </span><span>&quot;relu&quot;</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>layer_max_pooling_2d</span><span>(</span><span>pool_size</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>2</span><span>,</span><span> </span><span>2</span><span>))</span><span> </span><span>%>%</span><span>
</span><span>layer_dropout</span><span>(</span><span>0.25</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>layer_flatten</span><span>()</span><span> </span><span>%>%</span><span>
</span><span>layer_dense</span><span>(</span><span>512</span><span>,</span><span> </span><span>activation</span><span> </span><span>=</span><span> </span><span>&quot;relu&quot;</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>layer_dropout</span><span>(</span><span>0.5</span><span>)</span><span> </span><span>%>%</span><span>
</span><span>layer_dense</span><span>(</span><span>2</span><span>,</span><span> </span><span>activation</span><span> </span><span>=</span><span> </span><span>&quot;softmax&quot;</span><span>)</span></code></pre>
</figure>
<h2>Optimizer</h2>
<p>After preparing our training set and setting up the architecture, we can choose a loss function and optimization algorithm. In Keras, you can choose from several algoritms such as a simple <strong>Stochastic Gradient Descent</strong> to a more adaptive algorithm like <strong>Adaptive Moment Estimation</strong>. Choosing a good optimizer could be crucial. In Keras, optimizer functions start with <strong>optimizer_</strong>:</p>
<figure>
<pre><code data-lang="r"><span>model2</span><span> </span><span>%>%</span><span> </span><span>compile</span><span>(</span><span>
</span><span>loss</span><span> </span><span>=</span><span> </span><span>&quot;categorical_crossentropy&quot;</span><span>,</span><span>
</span><span>optimizer</span><span> </span><span>=</span><span> </span><span>optimizer_adamax</span><span>(</span><span>lr</span><span> </span><span>=</span><span> </span><span>0.0001</span><span>,</span><span> </span><span>decay</span><span> </span><span>=</span><span> </span><span>1e-6</span><span>),</span><span>
</span><span>metrics</span><span> </span><span>=</span><span> </span><span>&quot;accuracy&quot;</span><span>
</span><span>)</span></code></pre>
</figure>
<h2>Results</h2>
<p>The figure below shows the values of our accuracy and loss function (cross-entropy) before (Model 1) and after (Model 2) modifications. We can see noticeable growth in our validation set accuracy (from 0.7449 to 0.9828) and loss function decrease (from 0.556 to 0.04573).</p>
<p><img alt="Values of accuracy and loss function (cross-entropy) before and after improvments of CNN" src="https://i0.wp.com/appsilondatascience.com/blog/assets/article_images/2017-11-22-keras2/resu.png?w=456" data-recalc-dims="1"></p>
<p>I also ran both models on CPU and on GPU. The computation times are below:</p>
<p><img alt="Estimation times for GPU and CPU" src="https://i0.wp.com/appsilondatascience.com/blog/assets/article_images/2017-11-22-keras2/gpucpu.png?w=456" data-recalc-dims="1"></p>
<p>Machine specifications:</p>
<p><strong>Processor</strong>: Intel Core i7-7700HQ,<br>
<strong>Memory</strong>: 32GB DDR4-2133MHz,<br>
<strong>Graphic</strong>: NVIDIA GeForce GTX 1070, 8GB GDDR5 VRAM</p>
<p>Read the original post at<br>
<a rel="nofollow" href="http://appsilondatascience.com/blog/rstats/2018/01/23/keras.html" target="_blank">Appsilon Data Science Blog</a>.</p>
	<p>
<div>
<div>To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="http://appsilondatascience.com/blog/rstats/2018/01/23/keras.html"> Appsilon Data Science Blog</a></strong>.</div>
<hr>
<a rel="nofollow" href="https://www.r-bloggers.com/">R-bloggers.com</a> offers <strong><a rel="nofollow" href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers">daily e-mail updates</a></strong> about <a rel="nofollow" href="https://www.r-project.org/" title="The R Project for Statistical Computing">R</a> news and <a rel="nofollow" href="https://www.r-bloggers.com/search/tutorial" title="R tutorials">tutorials</a> on topics such as: <a rel="nofollow" href="https://www.r-bloggers.com/search/data%20science" title="Data science">Data science</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/Big%20Data" title="Big Data">Big Data, <a rel="nofollow" href="https://www.r-users.com/" title="R jobs">R jobs</a>, visualization (<a rel="nofollow" href="https://www.r-bloggers.com/search/ggplot2" title="ggplot and ggplot2 tutorials">ggplot2</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/boxplot" title="Boxplots using lattice and ggplot2 tutorials">Boxplots</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/map" title="Maps and gis">maps</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/animation" title="Animation in R">animation</a>), programming (<a rel="nofollow" href="https://www.r-bloggers.com/search/RStudio" title="RStudio IDE for R">RStudio</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/sweave" title="Sweave and literate programming">Sweave</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/LaTeX" title="LaTeX in R">LaTeX</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/SQL" title="SQL and databases">SQL</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/eclipse" title="Eclipse IDE for R">Eclipse</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/git" title="git and github, Version Control System">git</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/hadoop" title="Large data in R using Hadoop">hadoop</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/Web+Scraping" title="Web Scraping of google, facebook, yahoo, twitter and more using R">Web Scraping</a>) statistics (<a rel="nofollow" href="https://www.r-bloggers.com/search/regression" title="Regressions and ANOVA analysis tutorials">regression</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/PCA" title="principal component analysis tutorial">PCA</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/time+series" title="Time series">time series</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/trading" title="finance trading">trading</a>) and more...
<img width="1" alt="" src="http://feeds.feedburner.com/~r/RBloggers/~4/MZqy3ccCUxE" height="1"></a></div>