<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>Econtechmod. an
International Quarterly Journal 5</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <article-id pub-id-type="doi">10.1016/j.procs.2019.09.461</article-id>
      <title-group>
        <article-title>Parallel</article-title>
      </title-group>
      <contrib-group>
        <aff id="aff0">
          <label>0</label>
          <institution>Artificial intelligence Department, Lviv Polytechnic National University</institution>
          ,
          <addr-line>Lviv, 79013</addr-line>
          ,
          <country country="UA">Ukraine</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2020</year>
      </pub-date>
      <volume>1080</volume>
      <fpage>33</fpage>
      <lpage>38</lpage>
      <abstract>
        <p>The regression analysis of large data sets by parallelization is investigated in the work. Different approaches to parallel computing are proposed. The parallelization of the gradient descent method and the stochastic gradient descent using OpenMP and MPI technologies, as well as their hybrid, is performed. The efficiency of the proposed parallel algorithms is analyzed. A number of numerical experiments were performed. Acceleration of 5 times was achieved using the six-core architecture of a personal computer. By varying the number of threads and processor cores, the possibility of further optimization of the computational process is established. The problem of erroneous exchange is considered, which often has a negative effect on acceleration during parallelization using OpenMP. The advantages and disadvantages of using each of the technologies are analyzed. generality, the software product is developed in the work, which can be used in the regression analysis of big data processing in a wide range of economic problems. Gradient descent algorithm, multicore, OpenMP technology, MPI technology, acceleration When processing large amounts of information, a large number of calculations are implemented, which consumes significant resources and time for its processing. Moreover, the construction of systems that perform the necessary operations depends on the type of data received and describes each specific situation. Due to the variety of data that can simultaneously characterize the task, there is a problem of creating techniques that will universalize the processing of large amounts of information, regardless of its type [1].</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Conducting</p>
    </sec>
    <sec id="sec-2">
      <title>1. Introduction</title>
      <p>2021 Copyright for this paper by its authors.</p>
      <p>In the work [7] the authors expanded the stochastic gradient descent for support vector machines in
several ways to develop the new multiclass SVM-SGD for efficiently classifying large image datasets
into many classes. ages with very-high-dimensional signatures into thousands of classes.</p>
      <p>In the work [8] the authors created optimized implementations of gradient descent on both GPU
and multi-core CPU platforms, and perform a detailed analysis of both systems’ performance
characteristics. The GPU implementation was done using CUDA, whereas the multi-core CPU
implementation was done with OpenMP.</p>
      <p>In the work [9] the authors presented the results of an empirical study of stochastic projection and
stochastic gradient descent methods as means of obtaining approximate inverses and preconditioners
for iterative methods. But the results are preliminary due to the code being not yet fully optimized.</p>
      <p>Big data is a field that considers methods of analysis, systematic extraction of information, work
with data sets that are too large or complex to be analyzed by traditional data processing software [10,
11]. There are problems when regression analysis needs to be performed on big data.</p>
      <p>"Big Data" as a concept is becoming increasingly popular in the world. It is used in marketing
research, in the analysis of world markets, sociological research and even elections [12]. Thus, large
amounts of data can contain important information that requires efficient processing. It is usually
performed using machine learning algorithms that study the available data. However, as a rule, such
calculations require duration and complexity at the stages of learning or forecasting, which makes it
impossible to use implementations of sequential algorithms, because they are unable to cope with the
current data. Therefore, the aim of this work is to study the performance of regression analysis on
large data sets by parallelization. Parallel approaches to increase processing speed are proposed.</p>
      <p>The main contribution of this article can be summarized as follows:
• A simple yet accurate and computationally efficient method is developed, which combines
the gradient descent method and the stochastic gradient descent using OpenMP and MPI technologies and
their hybrid. It is especially relevant in modern trends in the development of the multi-core
architecture of modern computers.</p>
      <p>• The main advantage of the proposed technique is that I have received an acceleration that
goes to the number of cores of the appropriate computing system; I have investigated the problem of
false exchange, which often negatively affects acceleration with parallel with OpenMP.</p>
    </sec>
    <sec id="sec-3">
      <title>2. Theoretical Basis</title>
      <sec id="sec-3-1">
        <title>In general, the linear regression model is defined as:</title>
        <p>  ( X Т X )1 X T y,
y 0 1x1  ...  n xn ,
h(x) 0 1x1  ...  n xn ,
where y – dependent variable, x – property vector (independent variables), n – number of
independent variables,  – vector of linear regression coefficients.</p>
        <p>
          Hypothesis is a function that best describes the purpose of machine learning (see formula (
          <xref ref-type="bibr" rid="ref2">2</xref>
          )).
where h(x) – hypothesis.
        </p>
        <p>
          I will use the least squares method to estimate the unknown parameters. It takes as an estimate of
the parameter values that minimize the sum of the squares of the residues for all observations. Thus,
the cost function takes the form:
(
          <xref ref-type="bibr" rid="ref1">1</xref>
          )
(
          <xref ref-type="bibr" rid="ref2">2</xref>
          )
(
          <xref ref-type="bibr" rid="ref3">3</xref>
          )
(
          <xref ref-type="bibr" rid="ref4">4</xref>
          )
where X – matrix of values of independent variables, y – vector of values of the dependent variable,
 – vector of regression coefficients.
        </p>
        <p>
          As is known [15], this method has advantages over the method of gradient descent, because it does
not require a learning step and does not require iterations. As can be seen from formula (
          <xref ref-type="bibr" rid="ref4">4</xref>
          ) in the
method is the multiplication of matrices of independent variables, which can be parallelized.
However, this method has disadvantages in finding linear regression coefficients when working with
large amounts of data. First, with a large size of the dataset, there may be a problem with its storage in
memory, and secondly, for a large number of elements, a gradient descent is the best approach due to
the high computational cost of a normal equation.
        </p>
        <p>The research of the gradient descent method and the possibility of its parallelization is carried out
in the work. This method requires a large number of iterations, but works well even with a significant
amount of properties. The difficulty in parallelizing this method is that the algorithm is quite
consistent. Each subsequent update of the coefficients depends on their previous values. Gradient
descent algorithm:
 j :  j 
 j : j 

 j</p>
        <p>J ( 0 ,1), j  0  1,
1 m</p>
        <p>(h (x(i) )  y(i) )x(i) ,
m i1 j
 j – j  regression coefficient,   learning step, m  the number of elements in the data set, h –
hypothesis, x(i) – i  string in the data set, x(i) – j  element in the i string of the data set, y(i) – i 
j
dependent variable. It is necessary to iterate to a certain stop condition while updating the coefficients
 j .</p>
        <p>
          The gradient descent has a known optimization – stochastic gradient descent (
          <xref ref-type="bibr" rid="ref7">7</xref>
          ) [16]. This
optimization method is well suited for solving the problem, because it coincides faster on a large
amount of data, but the method is not always accurate enough [17].
(
          <xref ref-type="bibr" rid="ref5">5</xref>
          )
(
          <xref ref-type="bibr" rid="ref6">6</xref>
          )
(
          <xref ref-type="bibr" rid="ref7">7</xref>
          )
 j :  j   (h (x(i) )  y(i) )x(i) , i  1, m, j  1, n.
        </p>
        <p>
          j
Similarly, as in formula (
          <xref ref-type="bibr" rid="ref6">6</xref>
          ) it is necessary to iterate to a certain stop condition while updating the
coefficients  j .
        </p>
        <p>Therefore, in order to solve this problem, the gradient descent method and the stochastic gradient
descent method were parallelized using OpenMP [18, 19] and MPI [20] technologies.</p>
        <p>Regarding the choice of OpenMP technology, the advantages are:
 Due to the idea of "incremental parallelization", OpenMP is ideal for developers who want to
quickly parallelize their computing programs with large parallel loops. The developer does
not create a new parallel program, but simply consistently adds OpenMP directives to the text
of the program.
 At the same time, OpenMP is a fairly flexible mechanism that gives the developer great
control over the behavior of the parallel program.
 It is assumed that the OpenMP program on a single-processor platform can be used as a serial
program, ie there is no need to support serial and parallel versions.</p>
        <p>As for MPI technology, in the MPI programming model, the program generates several processes
that interact with each other by calling routines for receiving and transmitting messages. Usually,
when initializing an MPI program, a fixed set of processes is created, and (which, however, is
optional) each of them runs on its own processor. These programs can run different programs, so the
MPI model is sometimes called the MIMD model (Multiple Instruction, Multiple Data), in contrast to
the SIMD model, where each processor performs only the same tasks. MPI supports two-point and
global, synchronous and asynchronous, blocking and non-blocking types of communications. A
special mechanism – a communicator – hides from the programmer internal communication
structures. The structure of communications can change over the life of the process, but the number of
tasks must remain constant (MPI-2 supports a dynamic change in the number of tasks). The MPI
specification provides program portability at the source code level. Work on heterogeneous clusters
and symmetric multiprocessor systems is supported. Process startup during MPI program execution is
not supported. The specification does not describe parallel I/O and program debugging – these
features can be included in a specific MPI implementation in the form of additional packages or
utilities. Compatibility of different implementations is not guaranteed.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>3. Formulation of the problem</title>
      <p>Without reducing the generality, the paper considers the problem of simulating the temperature of
the stator and rotor in real time. Due to the complex structure of the electric traction drive, direct
measurements with thermal sensors are not possible for the rotor temperature. In addition, accurate
thermal modeling is becoming increasingly important with increasing relevance of functional safety.
Therefore, it is necessary to create a model that estimates the stator temperature based on the input
data.</p>
      <p>
        The main task is to find the regression equation of the form (
        <xref ref-type="bibr" rid="ref1">1</xref>
        ). There is one dependent (stator
temperature) and several independent variables. The current sample size, which is taken to solve the
suppressed problem of finding the regression equation of 500 thousand elements, and the number of
properties 7. However, the sample size can be much larger and vary the number of properties from
1000 and more, then the usual sequential algorithm can be long or calculations will be too large to fit
in RAM. This problem can be solved by parallelizing the regression equation search algorithm.
      </p>
      <p>Selected sample (dataset contains 500,000 data, 7 properties and the dependent variable [21]):
1. The ambient temperature measured by a thermal sensor located close to the stator;
2. Coolant temperature (water cooling motor);
3. d–component;
4. q–component;
5. Engine speed;
6. The d–current component;
7. The q–current component.</p>
      <p>Dependent variable is the stator temperature measured by a thermal sensor.</p>
    </sec>
    <sec id="sec-5">
      <title>4. Research results</title>
      <p>The paper parallels the gradient descent algorithm and stochastic gradient descent using OpenMP
technology.</p>
      <p>
        Stages of parallelization of the gradient descent algorithm (
        <xref ref-type="bibr" rid="ref5">5</xref>
        ):
1. In the first stage, only the code fragment of the whole algorithm, which is responsible for
multiplying the matrix X by the vector θ in the function of hypothesis h (
        <xref ref-type="bibr" rid="ref2">2</xref>
        ), is parallelized using the
OpenMP directive.
      </p>
      <p>
        Code snippet:
double* hypothesisP(double **X, double *Q, int m, int n) {
double* result = new double[m];
#pragma omp parallel for num_threads(
        <xref ref-type="bibr" rid="ref2">2</xref>
        )
for (int i = 0; i &lt; m; i++) {
result[i] = 0;
for (int j = 0; j &lt; n; j++) {
      </p>
      <p>
        result[i] += X[i][j] * Q[j];
}
}
return result; }
2. At this stage, the parallelization of the calculations required to find the result of the cost
function (
        <xref ref-type="bibr" rid="ref3">3</xref>
        ). That is, the parallelization of the function of hypothesis (
        <xref ref-type="bibr" rid="ref2">2</xref>
        ), which is described in the
first stage, and the parallelization of the error summation operation for each element (
        <xref ref-type="bibr" rid="ref6">6</xref>
        ).
double costP(double** X, double* Y, double* Q, int m, int n, int k) {
double* hQ = new double[m];
hQ = hypothesisP(X, Q, m, n);
double* temp = new double[m];
double sum = 0;
#pragma omp parallel for num_threads(
        <xref ref-type="bibr" rid="ref2">2</xref>
        )
for (int i = 0; i &lt; m; i++) {
      </p>
      <p>
        sum += (hQ[i] - Y[i]) * X[i][k];
}
return sum / m;
}
double* hypothesisP(double **X, double *Q, int m, int n) {
double* result = new double[m];
#pragma omp parallel for num_threads(
        <xref ref-type="bibr" rid="ref2">2</xref>
        )
for (int i = 0; i &lt; m; i++) {
result[i] = 0;
for (int j = 0; j &lt; n; j++) {
      </p>
      <p>result[i] += X[i][j] * Q[j];
}}</p>
      <p>return result;}</p>
      <p>The time spent on the second stage of the parallel gradient descent algorithm with different
number of iterations and flows on a 2-core processor is given in Table 1 and Table 2, and the
visualization of the results is presented in Figure 1 and Figure 2.</p>
      <sec id="sec-5-1">
        <title>Number of iterations</title>
        <p>10
20
30</p>
      </sec>
      <sec id="sec-5-2">
        <title>Sequential algorithm</title>
        <p>execution time, sec</p>
      </sec>
      <sec id="sec-5-3">
        <title>Number of iterations</title>
        <p>2</p>
        <p>Number of threads
4</p>
        <p>Similar numerical experiments were performed when tested on a 6-core processor. The results are
given in Table 3 and Table 4 and in Figure 3 and Figure 4.
When using a 6-core processor we obtained acceleration equal to 2 and when choosing the number of
streams to more than six, we observe a significant reduction in efficiency, which confirms the
reliability of the results.</p>
        <p>Sometimes significant benefits cannot be achieved through false sharing. Simultaneous updates of
individual items in the same cache line coming from different processors invalidate entire lines of the
cache, although these updates are logically independent of each other. Each update of an individual
cache line item marks the line as invalid. Other processors that access another item on the same line
see the string marked as invalid. They have to get a newer copy of the string from memory or
elsewhere, even if the item they accessed has not been changed. This is because cache coherence is
maintained based on the cache line, not for individual elements.</p>
        <p>As a result, there will be an increase in the relationship between traffic and overhead costs. Also,
while the cache line is being updated, access to items in the line is denied. This situation is called
false exchange. If this happens often, the performance and scalability of OpenMP will be significantly
affected. Therefore it is necessary to use various ways of distribution of iterations:
We can conclude that on average the parallel algorithm works much faster with different
iteration distributions.</p>
        <p>Similarly, the execution time when tested on a 6-core processor is given in Table 6, and
the visualization of the results in Figure 5.</p>
        <p>The parallelization algorithm of stochastic gradient descent is also performed in the work. The
parallelization of this algorithm can occur by blocking the change of coefficients by each process, but
this approach obviously does not allow to obtain significant advantages. However, there is an
interesting Hogwild algorithm! [23, 24], which allows you to change the coefficients without
synchronization. This method works without any negative impact on the mathematical efficiency of
the algorithm. The description of the algorithm is as follows:</p>
        <p>Each thread draws a random example i from the training data.</p>
        <p> Thread reads current state of  .
 Thread updates.</p>
        <p>  ( L( f (xi ), yi )).</p>
        <p>
          Code snippet for two threads:
#pragma omp parallel for num_threads(
          <xref ref-type="bibr" rid="ref2">2</xref>
          )
for (int i = 0; i &lt; m; i++) {
for (int j = 0; j &lt; n; j++) {
        </p>
        <p>tempQ[j] = Q[j] - alpha * (h(X[i], Q, n) - Y[i]) * X[i][j];
}
}
for (int k = 0; k &lt; n; k++) {</p>
        <p>Q[k] = tempQ[k];
}</p>
        <p>When the sample size is large enough (in this case 500,000) then one iteration is enough.
Execution time for testing on 6 cores is given in Table 7 and Table 8 and data visualization in
Figure 6.
Sequential algorithm
execution time, sec</p>
        <p>Next, we present the results of parallelization of the gradient descent algorithm and stochastic
gradient descent using MPI technology.</p>
        <p>1. Parallelization of the gradient descent algorithm.</p>
        <p>The parallelization occurs by the fact that the rows of the matrix X[i] are distributed between
the threads. Each thread calculates the result of the cost function on an equal amount of data allocated
to it, then sends a calculation from each data selection and the main thread based on this data makes
changes to the model. The disadvantage of this method is that it requires the exchange of information
between threads, which can slow down the parallelization.</p>
        <sec id="sec-5-3-1">
          <title>Code snippet:</title>
          <p>DWORD Start = GetTickCount();
if (ProcRank == 0) {
double* tempQ = new double[n];
for (int iter = 0; iter &lt; 20; iter++) {
for (int qiter = 0; qiter &lt; n; qiter++) {
for (int p = 1; p &lt; ProcNum; p++) {</p>
          <p>MPI_Send(Q, n, MPI_DOUBLE, p, 1, MPI_COMM_WORLD);</p>
          <p>MPI_Send(&amp;qiter, 1, MPI_INT, p, 1, MPI_COMM_WORLD);
}
double procSum = costMpi(X, Y, Q, m, n, qiter, ProcNum, ProcRank);
double allSum = procSum;
for (int pr = 1; pr &lt; ProcNum; pr++)
{
double curSum = 0;
MPI_Recv(&amp;curSum, 1, MPI_DOUBLE, pr, MPI_ANY_TAG, MPI_COMM_WORLD,</p>
          <p>allSum += curSum;
}
tempQ[qiter] = Q[qiter] - alpha * (allSum / m);
}
for (int qiter = 0; qiter &lt; n; qiter++) {</p>
          <p>Q[qiter] = tempQ[qiter];
}
for (int t = 0; t &lt; n * 20; t++) {
int k = 0;
MPI_Recv(Q, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &amp;Status);
MPI_Recv(&amp;k, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &amp;Status);
double procSum = costMpi(X, Y, Q, m, n, k, ProcNum, ProcRank);</p>
          <p>MPI_Send(&amp;procSum, 1, MPI_DOUBLE, 0, ProcRank, MPI_COMM_WORLD);
}}
MPI_Finalize();</p>
          <p>DWORD dwRunTime = GetTickCount() - Start;</p>
          <p>Execution time for testing on a 6-core processor is given in Table 9 and Table 10, and
visualization of results Figure 7 and Figure 8.
Time spent performing the gradient descent algorithm using MPI technology (6-core processor)
Number of iterations</p>
          <p>Sequential algorithm
execution time, sec
10.1</p>
          <p>Execution time of parallel
algorithm,</p>
          <p>sec</p>
          <p>Number of threads</p>
          <p>As you can see from the results, MPI technology allows you to significantly improve the results of
parallelization of gradient descent. Acceleration is equal to 5 on 6-core processor.</p>
          <p>Gradient descent MPI 6
2. Parallelization of the stochastic gradient descent algorithm.</p>
          <p>The parallelization occurs by the fact that the rows of the matrix – X[i] are distributed between the
threads. Each thread searches for a local model, then sends the found model to the main thread, where
all local models are averaged and we get a global model. The disadvantage of this method is that it
requires additional calculations to find the model.</p>
          <p>DWORD Start = GetTickCount();
double* tempQ = new double[n];
int start = ProcRank * (m / ProcNum);
int end = ProcRank * (m / ProcNum) + (m / ProcNum);
for (int i = start; i &lt; end; i++) {
for (int j = 0; j &lt; n; j++) {
tempQ[j] = Q[j] - alpha * (h(X[i], Q, n) - Y[i]) * X[i][j];
}
for (int k = 0; k &lt; n; k++) {</p>
          <p>Q[k] = tempQ[k];
}</p>
          <p>MPI_Send(Q, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD);
double* localQ = new double[n];
if (ProcRank == 0) {</p>
          <p>Execution time for testing on a 6-core processor is given in Table 11 and Table 12, and
visualization of results Figure 9.</p>
          <p>Table 11
Time spent performing the stochastic gradient descent algorithm using MPI technology (6-core
processor)</p>
          <p>Sequential algorithm
execution time, sec
0.10</p>
          <p>The execution time of the
parallel algorithm,</p>
          <p>sec</p>
          <p>Number of threads
To the parallel algorithm of the stochastic gradient descent, acceleration equals 4.5 when using MPI
technology.</p>
          <p>Stochastic gradient descent MPI 6</p>
          <p>Execution time when tested on a 2-core processor using hybrid technology for parallelization of
the method of stochastic gradient descent is given in Table 14.</p>
          <p>Table 14</p>
        </sec>
      </sec>
      <sec id="sec-5-4">
        <title>Time spent performing the parallel algorithm of the stochastic gradient descent method</title>
      </sec>
      <sec id="sec-5-5">
        <title>Sequential algorithm</title>
        <p>execution time, sec
2
omp
parallel for</p>
      </sec>
      <sec id="sec-5-6">
        <title>Execution time of parallel algorithm, sec</title>
        <p>Number of threads</p>
        <p>4
omp
parallel
for
8
omp
parallel for
2 4 2 4 2 4
0.38 0.14 0.18 5.7 8.15 3.0 10.15
As you see the hybrid of OpenMP and MPI technologies allows for both methods when parallel to get
accelerated to the number of a core of a multi-core computing system. This is especially relevant in a
modern tendency to develop such architectures.
5. Conclusions</p>
        <p>In this work, to optimize the regression analysis, the methods of gradient descent and stochastic
gradient descent based on OpenMP and MPI technologies are paralleled. Without reducing the
generality, a number of numerical experiments were performed on one network date. On the basis of
which the efficiency of the proposed approach is analyzed in detail. Acceleration was achieved three
times when parallelizing the algorithm and gradient descent using OpenMP for two consecutive
cycles with the number of threads 2 and 4 on a six-core processor. The problem of erroneous
exchange is considered, which often has a negative effect on acceleration during parallelization using
OpenMP. Acceleration can be achieved twice with different distribution of iterations static, dynamic,
guided and chunk_size. The Hogwild algorithm! was an interesting discovery and its application to
parallelize the task.</p>
        <p>The advantage was obtained by using MPI technology, but only with two parallel threads (when
tested on a 2-core processor), because with the increase in the number of threads increases the need
for more frequent communication, which begins to slow down the program. Significant acceleration
of almost 5 times was achieved by parallelization of the algorithm of gradient and stochastic gradient
descent on a 6-core processor.</p>
        <p>It is also worth noting that each of the technologies has its advantages and disadvantages. With the
help of OpenMP it is easy to programmatically implement parallelism, based on MPI technology the
program is more difficult to develop and difficult to perform error finding. When using OpenMP
technology, communication between threads is implicit, while on MPI it is explicit, so you need to
think about how to implement communication between threads. MPI is portable to machines with
shared and shared memory, OpenMP only for those with shared memory. In OpenMP there can be a
problem with data placement, in MPI – no.</p>
        <p>Thus, the problem was completely solved, the algorithm was parallelized by using different
technologies.</p>
        <p>With minor modifications depending on the requirements, the software implementation can be
used in other big data processing tasks and tested on other data sets.</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>6. References</title>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>R.</given-names>
            <surname>Tkachenko</surname>
          </string-name>
          ,
          <string-name>
            <surname>I. Izonin</surname>
          </string-name>
          ,
          <article-title>Model and Principles for the Implementation of Neural-Like Structures Based on Geometric Data</article-title>
          ,
          <source>Advances in Intelligent Systems and Computing</source>
          <volume>754</volume>
          (
          <year>2019</year>
          ). doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>319</fpage>
          -91008-6_
          <fpage>58</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>R. M.</given-names>
            <surname>Litnarovich</surname>
          </string-name>
          ,
          <article-title>Construction and study of a mathematical model based on sources of experimental data by regression analysis</article-title>
          ,
          <source>Мanual. Rivne, MEGU</source>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>G.</given-names>
            <surname>Bonaccorso</surname>
          </string-name>
          ,
          <article-title>Machine Learning Algorithms: A reference guide to popular algorithms for data science and machine learning</article-title>
          ,
          <source>Packt Publishing</source>
          ,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>B.</given-names>
            <surname>Kedem</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Fokianos</surname>
          </string-name>
          ,
          <source>Regression Models for Time Series Analysis</source>
          , Wiley, New York,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>B.</given-names>
            <surname>Gurtner</surname>
          </string-name>
          , “
          <article-title>The Financial and Economic Crisis</article-title>
          and Developing Countries”,
          <source>International Development Policy</source>
          <volume>1</volume>
          (
          <year>2010</year>
          ):
          <fpage>189</fpage>
          -
          <lpage>213</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>K.G.</given-names>
            <surname>Serdyukov</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.V.</given-names>
            <surname>Kaidash</surname>
          </string-name>
          ,
          <article-title>Correlation-regression analysis of the impact of macroeconomic indicators on the volume of capital investment</article-title>
          ,
          <source>KSU Bulletin Series Economic Sciences,</source>
          volume
          <volume>3</volume>
          (
          <year>2018</year>
          ):
          <fpage>65</fpage>
          -
          <lpage>69</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <surname>Do</surname>
          </string-name>
          .
          <article-title>Thanh-Nghi, Parallel multiclass stochastic gradient descent algorithms for classifying million images with very-high-dimensional signatures into thousands classes</article-title>
          ,
          <source>Vietnam J Computer Science</source>
          <volume>1</volume>
          (
          <year>2014</year>
          )
          <fpage>107</fpage>
          -
          <lpage>115</lpage>
          . doi:
          <volume>10</volume>
          .1007/s40595-013-0013-2.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>S.</given-names>
            <surname>Kylee</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Shashank</surname>
          </string-name>
          , Parallelizing Gradient Descent,
          <year>2018</year>
          . URL: https://shashankojha.github.io/ParallelGradientDescent/Final%20Report.pdf.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M. E.</given-names>
            ,
            <surname>Sahin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Lebedev</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Alexandrov</surname>
          </string-name>
          ,
          <article-title>Empirical Analysis of Stochastic Methods of Linear Algebra Computational Science</article-title>
          ,
          <source>in: Proceedings of the ICCS 2020 20th International Conference</source>
          , Amsterdam, The Netherlands, June 3-5,
          <string-name>
            <surname>Part</surname>
            <given-names>VII</given-names>
          </string-name>
          , 25 May
          <year>2020</year>
          ,
          <volume>12143</volume>
          :
          <fpage>539</fpage>
          -
          <lpage>549PMCID</lpage>
          :
          <fpage>PMC7304785</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>I. V.</given-names>
            <surname>Hunko</surname>
          </string-name>
          ,
          <article-title>Factors and indicators of forming enterprises' investment attractiveness</article-title>
          ,
          <source>J. Financial space 1</source>
          ,
          <year>2013</year>
          , pp.
          <fpage>85</fpage>
          -
          <lpage>88</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>