Deep Neural Network Regression From Scratch Using Python

One Sunday evening, I was sitting in my living room. I decided to implement a regression system (to predict a single numeric value), using a neural network with exactly two hidden layers, from scratch, using Python with NumPy.

The effort was an interesting challenge, but it took me quite a bit longer than I expected.

The output of my demo:

Begin deep neural regression with scratch Python

Loading synthetic train (200) and test (40) data
Done

First three train X:
[-0.166   0.4406 -0.9998 -0.3953 -0.7065]
[ 0.0776 -0.1616  0.3704 -0.5911  0.7562]
[-0.9452  0.3409 -0.1654  0.1174 -0.7192]

First three train y:
0.4840
0.1568
0.8054

Creating 5-10-10-1 tanh identity regressor
Done

Setting lrn_rate = 0.0500
Setting max_epochs = 10000

Starting training
epoch:     0   MSE =   0.0359   acc =   0.1450
epoch:  1000   MSE =   0.0004   acc =   0.8200
epoch:  2000   MSE =   0.0004   acc =   0.8300
epoch:  3000   MSE =   0.0003   acc =   0.8700
epoch:  4000   MSE =   0.0002   acc =   0.8750
epoch:  5000   MSE =   0.0001   acc =   0.9200
epoch:  6000   MSE =   0.0001   acc =   0.9100
epoch:  7000   MSE =   0.0001   acc =   0.9150
epoch:  8000   MSE =   0.0001   acc =   0.9150
epoch:  9000   MSE =   0.0001   acc =   0.9150
Done

Evaluating model

Accuracy (0.10) on train data = 0.9300
Accuracy (0.10) on test data = 0.9250

MSE on train data = 0.0001
MSE on test data = 0.0002

Predicting y for train[0]

Predicted y = 0.4848

End demo

I implemented the neural network using Python explicit for-loops, instead of using built-in NumPy syntax that calls fast, underlying C++ code. Therefore, my implementation is much too slow to be practical.

I used one of my standard synthetic datasets. The data looks like:

-0.1660,  0.4406, -0.9998, -0.3953, -0.7065,  0.4840
 0.0776, -0.1616,  0.3704, -0.5911,  0.7562,  0.1568
-0.9452,  0.3409, -0.1654,  0.1174, -0.7192,  0.8054
. . .

The first five values on each line are the predictors. The last value is the target to predict. There are 200 training items and 400 test items.

In theory (the Universal Approximation Theorem), any neural network regression system with two hidden layers can be implemented using a neural network with a single hidden layer. But in practice, using two hidden layers often leads to a better prediction model.



There’s a certain irony to neural networks: they are constructed using small chunks of relatively simple math logic and ideas, but the predictions from a neural network regression model are nearly impossible to explain.

Here are two examples of vehicular irony.

Left: This trucking accident happened in 2015, in Mamaroneck Village, NY.

Right: This custom Ford Escape transportation vehicle was built by Watson Quality Ford, in Jackson, MS


Demo program. Replace “lt” (less than), “gt”, “lte”, “gte” with Boolean operator symbols (my blog editor chokes on symbols).

# neural_network_deep_regression.py
# two hidden-layer neural network, scratch Python
# tanh + identity output activation

import numpy as np

class NeuralNetworkDeepRegressor:

  def __init__(self, n_in, n_hid_a, n_hid_b, n_out, seed=0):
    self.n_in = n_in
    self.n_hid_a = n_hid_a
    self.n_hid_b = n_hid_b
    self.n_out = n_out
	
    self.i_nodes = np.zeros(shape=n_in, dtype=np.float32)
    self.a_nodes = np.zeros(shape=n_hid_a, dtype=np.float32)
    self.b_nodes = np.zeros(shape=n_hid_b, dtype=np.float32)
    self.o_nodes = np.zeros(shape=n_out, dtype=np.float32)
	
    self.ia_weights = np.zeros(shape=(n_in, n_hid_a),
      dtype=np.float32)
    self.ab_weights = np.zeros(shape=(n_hid_a, n_hid_b),
      dtype=np.float32)
    self.bo_weights = np.zeros(shape=(n_hid_b, n_out),
      dtype=np.float32)
	
    self.a_biases = np.zeros(shape=n_hid_a, dtype=np.float32)
    self.b_biases = np.zeros(shape=n_hid_a, dtype=np.float32)
    self.o_biases = np.zeros(shape=n_out, dtype=np.float32)

    self.rnd = np.random.RandomState(seed)

  # ---------------------------------------------------------

  def predict_one(self, x):
    # x is a 1D vector
    # copy x into i_nodes to avoid by-ref errors
    for i in range(len(x)):
      self.i_nodes[i] = x[i]

    # compute hidden A nodes
    for j in range(self.n_hid_a):
      sum = 0.0
      for i in range(self.n_in):
        sum += self.i_nodes[i] * self.ia_weights[i,j]
      sum += self.a_biases[j]
      self.a_nodes[j] = self.my_tanh(sum)

    # compute hidden B nodes
    for j in range(self.n_hid_b):
      sum = 0.0
      for i in range(self.n_hid_a):
        sum += self.a_nodes[i] * self.ab_weights[i,j]
      sum += self.b_biases[j]
      self.b_nodes[j] = self.my_tanh(sum)

    # compute output node(s)
    for j in range(self.n_out):
      sum = 0.0
      for i in range(self.n_hid_b):
        sum += self.b_nodes[i] * self.bo_weights[i,j]
      sum += self.o_biases[j];
      self.o_nodes[j] = self.identity(sum)
	  
    return self.o_nodes[0]

  # ---------------------------------------------------------

  def predict(self, X):
    # X is a 2D matrix
    n = len(X)
    result = np.zeros(n, dtype=np.float32)
    for i in range(n):
      result[i] = self.predict_one(X[i])
    return result

  # ---------------------------------------------------------

  @staticmethod
  def my_tanh(x):
    if x "lt" -6.0: return -1.0
    elif x "gt" 6.0: return 1.0
    else: return np.tanh(x)

  # ---------------------------------------------------------

  @staticmethod
  def identity(x):
    return x

  # ---------------------------------------------------------

  def train(self, train_X, train_y, lrn_rate, max_epochs):
    # init weights
    lo = -0.01; hi = 0.01

    for i in range(self.n_in):
      for j in range(self.n_hid_a):
        self.ia_weights[i,j] = \
          (hi - lo) * self.rnd.rand() + lo

    for i in range(self.n_hid_a):
      for j in range(self.n_hid_b):
        self.ab_weights[i,j] = \
          (hi - lo) * self.rnd.rand() + lo

    for i in range(self.n_hid_b):
      for j in range(self.n_out):
        self.bo_weights[i,j] = \
          (hi - lo) * self.rnd.rand() + lo

    # each weight and bias has a gradient
    bo_grads = np.zeros((self.n_hid_b, self.n_out), \
      dtype=np.float32)
    ab_grads = np.zeros((self.n_hid_a, self.n_hid_b), \
      dtype=np.float32)
    ia_grads = np.zeros((self.n_in, self.n_hid_a), \
      dtype=np.float32)

    o_bias_grads = np.zeros(self.n_out, dtype=np.float32)
    b_bias_grads = np.zeros(self.n_hid_b, dtype=np.float32)
    a_bias_grads = np.zeros(self.n_hid_a, dtype=np.float32)

    # each output and hidden node has a 'signal',
    # which is gradient without associated input
    o_signals = np.zeros(self.n_out, dtype=np.float32)
    b_signals = np.zeros(self.n_hid_b, dtype=np.float32)
    a_signals = np.zeros(self.n_hid_a, dtype=np.float32)

    freq = int(max_epochs / 10)  # progress
    indices = np.arange(len(train_X))

    for epoch in range(max_epochs): 
      self.rnd.shuffle(indices)
      # buckle up
      for ii in range(len(train_X)):
        idx = indices[ii]
        x = train_X[idx]
        actual_y = train_y[idx]
        pred_y = self.predict_one(x)
       
        # compute signals right-to-left
        # output node signals depends on target values
        for k in range(self.n_out):
          error = pred_y - actual_y  # standard form
          derivative = 1.0;  # identity activation
          o_signals[k] = error * derivative

        # signals for B nodes depends on output signals
        for j in range(self.n_hid_b):
          derivative = \
            (1 + self.b_nodes[j]) * (1 - self.b_nodes[j])
          sum = 0.0
          for k in range(self.n_out):
            sum += o_signals[k] * self.bo_weights[j,k]
          b_signals[j] = derivative * sum

        # signals for A nodes depends on output signals
        for j in range(self.n_hid_a):
          derivative = \
            (1 + self.a_nodes[j]) * (1 - self.a_nodes[j])
          sum = 0.0
          for k in range(self.n_hid_b):
            sum += b_signals[k] * self.ab_weights[j,k]
          a_signals[j] = derivative * sum

        # at this point, all signals have been computed
        # use signals to compute wt gradients (left-to-right)

        for i in range(self.n_in):
          for j in range(self.n_hid_a):
            ia_grads[i,j] = self.i_nodes[i] * a_signals[j]

        for i in range(self.n_hid_a):
          for j in range(self.n_hid_b):
            ab_grads[i,j] = self.a_nodes[i] * b_signals[j]

        for i in range(self.n_hid_b):
          for j in range(self.n_out):
            bo_grads[i,j] = self.b_nodes[i] * o_signals[j]

        # compute bias gradients
        for j in range(self.n_hid_a):
          a_bias_grads[j] = 1.0 * a_signals[j]
        for j in range(self.n_hid_b):
          b_bias_grads[j] = 1.0 * b_signals[j]
        for j in range(self.n_out):
          o_bias_grads[j] = 1.0 * o_signals[j]

        # use gradients to update all weights

        for i in range(self.n_in):
          for j in range(self.n_hid_a):
            self.ia_weights[i,j] -= ia_grads[i,j] * lrn_rate

        for i in range(self.n_hid_a):
          for j in range(self.n_hid_b):
            self.ab_weights[i,j] -= ab_grads[i,j] * lrn_rate

        for i in range(self.n_hid_b):
          for j in range(self.n_out):
            self.bo_weights[i,j] -= bo_grads[i,j] * lrn_rate

        # use gradients to update the biases

        for j in range(self.n_hid_a):
          self.a_biases[j] -= a_bias_grads[j] * lrn_rate

        for j in range(self.n_hid_b):
          self.b_biases[j] -= b_bias_grads[j] * lrn_rate

        for j in range(self.n_out):
          self.o_biases[j] -= o_bias_grads[j] * lrn_rate

      # progress messages
      if epoch % freq == 0:
        mse = self.MSE(train_X, train_y)
        acc = self.accuracy(train_X, train_y, 0.10)
        s1 = "epoch: %5d" % epoch
        s2 = "   MSE = %8.4f" % mse
        s3 = "   acc = %8.4f" % acc
        print(s1 + s2 + s3)

  # ---------------------------------------------------------

  def MSE(self, data_x, data_y):
    n = len(data_x)
    sum = 0.0
    for i in range(n):
      x = data_x[i]
      y = data_y[i]
      pred_y = self.predict_one(x)
      sum += (pred_y - y) * (pred_y - y)

    return sum / n

  # ---------------------------------------------------------

  def accuracy(self, data_x, data_y, pct_close):
    n = len(data_x)
    n_correct= 0; n_wrong = 0;
    for i in range(n):
      x = data_x[i]
      y = data_y[i]  # target 0 or 1
      pred_y = self.predict_one(x)
      if np.abs(pred_y - y) "lt" np.abs(y * pct_close):
        n_correct += 1
      else:
        n_wrong += 1

    return n_correct / (n_correct + n_wrong)

# -----------------------------------------------------------
# -----------------------------------------------------------

def main():
  print("\nBegin deep neural regression with scratch Python")

  # 1. load data
  print("\nLoading synthetic train (200) and test (40) data")
  train_Xy = np.loadtxt(".\\Data\\synthetic_train_200.txt",
    usecols=[0,1,2,3,4,5], delimiter=",")
  train_X = train_Xy[:,[0,1,2,3,4]]
  train_y = train_Xy[:,5]

  test_Xy = np.loadtxt(".\\Data\\synthetic_test_40.txt",
    usecols=[0,1,2,3,4,5], delimiter=",")
  test_X = test_Xy[:,[0,1,2,3,4]]
  test_y = test_Xy[:,5]
  print("Done ")

  print("\nFirst three train X: ")
  for i in range(3):
    print(train_X[i])
  print("\nFirst three train y: ")
  for i in range(3):
    print("%0.4f " % train_y[i])

  # 2. create network
  print("\nCreating 5-10-10-1 tanh identity regressor ")
  nn = NeuralNetworkDeepRegressor(5, 10, 10, 1)
  print("Done ")

  # 3. train network
  lrn_rate = 0.05
  max_epochs = 10000
  print("\nSetting lrn_rate = %0.4f " % lrn_rate)
  print("Setting max_epochs = " + str(max_epochs))

  print("\nStarting training ")
  nn.train(train_X, train_y, lrn_rate, max_epochs)
  print("Done ")

  # 4. evaluate model
  print("\nEvaluating model ")
  train_acc = nn.accuracy(train_X, train_y, 0.10)
  test_acc = nn.accuracy(test_X, test_y, 0.10)
  print("\nAccuracy (0.10) on train data = %0.4f" \
    % train_acc)
  print("Accuracy (0.10) on test data = %0.4f" % test_acc)

  train_mse = nn.MSE(train_X, train_y)
  test_mse = nn.MSE(test_X, test_y)
  print("\nMSE on train data = %0.4f" \
    % train_mse)
  print("MSE on test data = %0.4f" % test_mse)

  # 6. use trained model
  print("\nPredicting y for train[0] ")
  x = train_X[0]
  pred_y = nn.predict(x.reshape(1,-1))[0]
  print("\nPredicted y = %0.4f " % pred_y)

  print("\nEnd demo ")

if __name__ == "__main__":
  main()

Training data:

# synthetic_train_200.txt
#
-0.1660,  0.4406, -0.9998, -0.3953, -0.7065,  0.4840
 0.0776, -0.1616,  0.3704, -0.5911,  0.7562,  0.1568
-0.9452,  0.3409, -0.1654,  0.1174, -0.7192,  0.8054
 0.9365, -0.3732,  0.3846,  0.7528,  0.7892,  0.1345
-0.8299, -0.9219, -0.6603,  0.7563, -0.8033,  0.7955
 0.0663,  0.3838, -0.3690,  0.3730,  0.6693,  0.3206
-0.9634,  0.5003,  0.9777,  0.4963, -0.4391,  0.7377
-0.1042,  0.8172, -0.4128, -0.4244, -0.7399,  0.4801
-0.9613,  0.3577, -0.5767, -0.4689, -0.0169,  0.6861
-0.7065,  0.1786,  0.3995, -0.7953, -0.1719,  0.5569
 0.3888, -0.1716, -0.9001,  0.0718,  0.3276,  0.2500
 0.1731,  0.8068, -0.7251, -0.7214,  0.6148,  0.3297
-0.2046, -0.6693,  0.8550, -0.3045,  0.5016,  0.2129
 0.2473,  0.5019, -0.3022, -0.4601,  0.7918,  0.2613
-0.1438,  0.9297,  0.3269,  0.2434, -0.7705,  0.5171
 0.1568, -0.1837, -0.5259,  0.8068,  0.1474,  0.3307
-0.9943,  0.2343, -0.3467,  0.0541,  0.7719,  0.5581
 0.2467, -0.9684,  0.8589,  0.3818,  0.9946,  0.1092
-0.6553, -0.7257,  0.8652,  0.3936, -0.8680,  0.7018
 0.8460,  0.4230, -0.7515, -0.9602, -0.9476,  0.1996
-0.9434, -0.5076,  0.7201,  0.0777,  0.1056,  0.5664
 0.9392,  0.1221, -0.9627,  0.6013, -0.5341,  0.1533
 0.6142, -0.2243,  0.7271,  0.4942,  0.1125,  0.1661
 0.4260,  0.1194, -0.9749, -0.8561,  0.9346,  0.2230
 0.1362, -0.5934, -0.4953,  0.4877, -0.6091,  0.3810
 0.6937, -0.5203, -0.0125,  0.2399,  0.6580,  0.1460
-0.6864, -0.9628, -0.8600, -0.0273,  0.2127,  0.5387
 0.9772,  0.1595, -0.2397,  0.1019,  0.4907,  0.1611
 0.3385, -0.4702, -0.8673, -0.2598,  0.2594,  0.2270
-0.8669, -0.4794,  0.6095, -0.6131,  0.2789,  0.4700
 0.0493,  0.8496, -0.4734, -0.8681,  0.4701,  0.3516
 0.8639, -0.9721, -0.5313,  0.2336,  0.8980,  0.1412
 0.9004,  0.1133,  0.8312,  0.2831, -0.2200,  0.1782
 0.0991,  0.8524,  0.8375, -0.2102,  0.9265,  0.2150
-0.6521, -0.7473, -0.7298,  0.0113, -0.9570,  0.7422
 0.6190, -0.3105,  0.8802,  0.1640,  0.7577,  0.1056
 0.6895,  0.8108, -0.0802,  0.0927,  0.5972,  0.2214
 0.1982, -0.9689,  0.1870, -0.1326,  0.6147,  0.1310
-0.3695,  0.7858,  0.1557, -0.6320,  0.5759,  0.3773
-0.1596,  0.3581,  0.8372, -0.9992,  0.9535,  0.2071
-0.2468,  0.9476,  0.2094,  0.6577,  0.1494,  0.4132
 0.1737,  0.5000,  0.7166,  0.5102,  0.3961,  0.2611
 0.7290, -0.3546,  0.3416, -0.0983, -0.2358,  0.1332
-0.3652,  0.2438, -0.1395,  0.9476,  0.3556,  0.4170
-0.6029, -0.1466, -0.3133,  0.5953,  0.7600,  0.4334
-0.4596, -0.4953,  0.7098,  0.0554,  0.6043,  0.2775
 0.1450,  0.4663,  0.0380,  0.5418,  0.1377,  0.2931
-0.8636, -0.2442, -0.8407,  0.9656, -0.6368,  0.7429
 0.6237,  0.7499,  0.3768,  0.1390, -0.6781,  0.2185
-0.5499,  0.1850, -0.3755,  0.8326,  0.8193,  0.4399
-0.4858, -0.7782, -0.6141, -0.0008,  0.4572,  0.4197
 0.7033, -0.1683,  0.2334, -0.5327, -0.7961,  0.1776
 0.0317, -0.0457, -0.6947,  0.2436,  0.0880,  0.3345
 0.5031, -0.5559,  0.0387,  0.5706, -0.9553,  0.3107
-0.3513,  0.7458,  0.6894,  0.0769,  0.7332,  0.3170
 0.2205,  0.5992, -0.9309,  0.5405,  0.4635,  0.3532
-0.4806, -0.4859,  0.2646, -0.3094,  0.5932,  0.3202
 0.9809, -0.3995, -0.7140,  0.8026,  0.0831,  0.1600
 0.9495,  0.2732,  0.9878,  0.0921,  0.0529,  0.1289
-0.9476, -0.6792,  0.4913, -0.9392, -0.2669,  0.5966
 0.7247,  0.3854,  0.3819, -0.6227, -0.1162,  0.1550
-0.5922, -0.5045, -0.4757,  0.5003, -0.0860,  0.5863
-0.8861,  0.0170, -0.5761,  0.5972, -0.4053,  0.7301
 0.6877, -0.2380,  0.4997,  0.0223,  0.0819,  0.1404
 0.9189,  0.6079, -0.9354,  0.4188, -0.0700,  0.1907
-0.1428, -0.7820,  0.2676,  0.6059,  0.3936,  0.2790
 0.5324, -0.3151,  0.6917, -0.1425,  0.6480,  0.1071
-0.8432, -0.9633, -0.8666, -0.0828, -0.7733,  0.7784
-0.9444,  0.5097, -0.2103,  0.4939, -0.0952,  0.6787
-0.0520,  0.6063, -0.1952,  0.8094, -0.9259,  0.4836
 0.5477, -0.7487,  0.2370, -0.9793,  0.0773,  0.1241
 0.2450,  0.8116,  0.9799,  0.4222,  0.4636,  0.2355
 0.8186, -0.1983, -0.5003, -0.6531, -0.7611,  0.1511
-0.4714,  0.6382, -0.3788,  0.9648, -0.4667,  0.5950
 0.0673, -0.3711,  0.8215, -0.2669, -0.1328,  0.2677
-0.9381,  0.4338,  0.7820, -0.9454,  0.0441,  0.5518
-0.3480,  0.7190,  0.1170,  0.3805, -0.0943,  0.4724
-0.9813,  0.1535, -0.3771,  0.0345,  0.8328,  0.5438
-0.1471, -0.5052, -0.2574,  0.8637,  0.8737,  0.3042
-0.5454, -0.3712, -0.6505,  0.2142, -0.1728,  0.5783
 0.6327, -0.6297,  0.4038, -0.5193,  0.1484,  0.1153
-0.5424,  0.3282, -0.0055,  0.0380, -0.6506,  0.6613
 0.1414,  0.9935,  0.6337,  0.1887,  0.9520,  0.2540
-0.9351, -0.8128, -0.8693, -0.0965, -0.2491,  0.7353
 0.9507, -0.6640,  0.9456,  0.5349,  0.6485,  0.1059
-0.0462, -0.9737, -0.2940, -0.0159,  0.4602,  0.2606
-0.0627, -0.0852, -0.7247, -0.9782,  0.5166,  0.2977
 0.0478,  0.5098, -0.0723, -0.7504, -0.3750,  0.3335
 0.0090,  0.3477,  0.5403, -0.7393, -0.9542,  0.4415
-0.9748,  0.3449,  0.3736, -0.1015,  0.8296,  0.4358
 0.2887, -0.9895, -0.0311,  0.7186,  0.6608,  0.2057
 0.1570, -0.4518,  0.1211,  0.3435, -0.2951,  0.3244
 0.7117, -0.6099,  0.4946, -0.4208,  0.5476,  0.1096
-0.2929, -0.5726,  0.5346, -0.3827,  0.4665,  0.2465
 0.4889, -0.5572, -0.5718, -0.6021, -0.7150,  0.2163
-0.7782,  0.3491,  0.5996, -0.8389, -0.5366,  0.6516
-0.5847,  0.8347,  0.4226,  0.1078, -0.3910,  0.6134
 0.8469,  0.4121, -0.0439, -0.7476,  0.9521,  0.1571
-0.6803, -0.5948, -0.1376, -0.1916, -0.7065,  0.7156
 0.2878,  0.5086, -0.5785,  0.2019,  0.4979,  0.2980
 0.2764,  0.1943, -0.4090,  0.4632,  0.8906,  0.2960
-0.8877,  0.6705, -0.6155, -0.2098, -0.3998,  0.7107
-0.8398,  0.8093, -0.2597,  0.0614, -0.0118,  0.6502
-0.8476,  0.0158, -0.4769, -0.2859, -0.7839,  0.7715
 0.5751, -0.7868,  0.9714, -0.6457,  0.1448,  0.1175
 0.4802, -0.7001,  0.1022, -0.5668,  0.5184,  0.1090
 0.4458, -0.6469,  0.7239, -0.9604,  0.7205,  0.0779
 0.5175,  0.4339,  0.9747, -0.4438, -0.9924,  0.2879
 0.8678,  0.7158,  0.4577,  0.0334,  0.4139,  0.1678
 0.5406,  0.5012,  0.2264, -0.1963,  0.3946,  0.2088
-0.9938,  0.5498,  0.7928, -0.5214, -0.7585,  0.7687
 0.7661,  0.0863, -0.4266, -0.7233, -0.4197,  0.1466
 0.2277, -0.3517, -0.0853, -0.1118,  0.6563,  0.1767
 0.3499, -0.5570, -0.0655, -0.3705,  0.2537,  0.1632
 0.7547, -0.1046,  0.5689, -0.0861,  0.3125,  0.1257
 0.8186,  0.2110,  0.5335,  0.0094, -0.0039,  0.1391
 0.6858, -0.8644,  0.1465,  0.8855,  0.0357,  0.1845
-0.4967,  0.4015,  0.0805,  0.8977,  0.2487,  0.4663
 0.6760, -0.9841,  0.9787, -0.8446, -0.3557,  0.1509
-0.1203, -0.4885,  0.6054, -0.0443, -0.7313,  0.4854
 0.8557,  0.7919, -0.0169,  0.7134, -0.1628,  0.2002
 0.0115, -0.6209,  0.9300, -0.4116, -0.7931,  0.4052
-0.7114, -0.9718,  0.4319,  0.1290,  0.5892,  0.3661
 0.3915,  0.5557, -0.1870,  0.2955, -0.6404,  0.2954
-0.3564, -0.6548, -0.1827, -0.5172, -0.1862,  0.4622
 0.2392, -0.4959,  0.5857, -0.1341, -0.2850,  0.2470
-0.3394,  0.3947, -0.4627,  0.6166, -0.4094,  0.5325
 0.7107,  0.7768, -0.6312,  0.1707,  0.7964,  0.2757
-0.1078,  0.8437, -0.4420,  0.2177,  0.3649,  0.4028
-0.3139,  0.5595, -0.6505, -0.3161, -0.7108,  0.5546
 0.4335,  0.3986,  0.3770, -0.4932,  0.3847,  0.1810
-0.2562, -0.2894, -0.8847,  0.2633,  0.4146,  0.4036
 0.2272,  0.2966, -0.6601, -0.7011,  0.0284,  0.2778
-0.0743, -0.1421, -0.0054, -0.6770, -0.3151,  0.3597
-0.4762,  0.6891,  0.6007, -0.1467,  0.2140,  0.4266
-0.4061,  0.7193,  0.3432,  0.2669, -0.7505,  0.6147
-0.0588,  0.9731,  0.8966,  0.2902, -0.6966,  0.4955
-0.0627, -0.1439,  0.1985,  0.6999,  0.5022,  0.3077
 0.1587,  0.8494, -0.8705,  0.9827, -0.8940,  0.4263
-0.7850,  0.2473, -0.9040, -0.4308, -0.8779,  0.7199
 0.4070,  0.3369, -0.2428, -0.6236,  0.4940,  0.2215
-0.0242,  0.0513, -0.9430,  0.2885, -0.2987,  0.3947
-0.5416, -0.1322, -0.2351, -0.0604,  0.9590,  0.3683
 0.1055,  0.7783, -0.2901, -0.5090,  0.8220,  0.2984
-0.9129,  0.9015,  0.1128, -0.2473,  0.9901,  0.4776
-0.9378,  0.1424, -0.6391,  0.2619,  0.9618,  0.5368
 0.7498, -0.0963,  0.4169,  0.5549, -0.0103,  0.1614
-0.2612, -0.7156,  0.4538, -0.0460, -0.1022,  0.3717
 0.7720,  0.0552, -0.1818, -0.4622, -0.8560,  0.1685
-0.4177,  0.0070,  0.9319, -0.7812,  0.3461,  0.3052
-0.0001,  0.5542, -0.7128, -0.8336, -0.2016,  0.3803
 0.5356, -0.4194, -0.5662, -0.9666, -0.2027,  0.1776
-0.2378,  0.3187, -0.8582, -0.6948, -0.9668,  0.5474
-0.1947, -0.3579,  0.1158,  0.9869,  0.6690,  0.2992
 0.3992,  0.8365, -0.9205, -0.8593, -0.0520,  0.3154
-0.0209,  0.0793,  0.7905, -0.1067,  0.7541,  0.1864
-0.4928, -0.4524, -0.3433,  0.0951, -0.5597,  0.6261
-0.8118,  0.7404, -0.5263, -0.2280,  0.1431,  0.6349
 0.0516, -0.8480,  0.7483,  0.9023,  0.6250,  0.1959
-0.3212,  0.1093,  0.9488, -0.3766,  0.3376,  0.2735
-0.3481,  0.5490, -0.3484,  0.7797,  0.5034,  0.4379
-0.5785, -0.9170, -0.3563, -0.9258,  0.3877,  0.4121
 0.3407, -0.1391,  0.5356,  0.0720, -0.9203,  0.3458
-0.3287, -0.8954,  0.2102,  0.0241,  0.2349,  0.3247
-0.1353,  0.6954, -0.0919, -0.9692,  0.7461,  0.3338
 0.9036, -0.8982, -0.5299, -0.8733, -0.1567,  0.1187
 0.7277, -0.8368, -0.0538, -0.7489,  0.5458,  0.0830
 0.9049,  0.8878,  0.2279,  0.9470, -0.3103,  0.2194
 0.7957, -0.1308, -0.5284,  0.8817,  0.3684,  0.2172
 0.4647, -0.4931,  0.2010,  0.6292, -0.8918,  0.3371
-0.7390,  0.6849,  0.2367,  0.0626, -0.5034,  0.7039
-0.1567, -0.8711,  0.7940, -0.5932,  0.6525,  0.1710
 0.7635, -0.0265,  0.1969,  0.0545,  0.2496,  0.1445
 0.7675,  0.1354, -0.7698, -0.5460,  0.1920,  0.1728
-0.5211, -0.7372, -0.6763,  0.6897,  0.2044,  0.5217
 0.1913,  0.1980,  0.2314, -0.8816,  0.5006,  0.1998
 0.8964,  0.0694, -0.6149,  0.5059, -0.9854,  0.1825
 0.1767,  0.7104,  0.2093,  0.6452,  0.7590,  0.2832
-0.3580, -0.7541,  0.4426, -0.1193, -0.7465,  0.5657
-0.5996,  0.5766, -0.9758, -0.3933, -0.9572,  0.6800
 0.9950,  0.1641, -0.4132,  0.8579,  0.0142,  0.2003
-0.4717, -0.3894, -0.2567, -0.5111,  0.1691,  0.4266
 0.3917, -0.8561,  0.9422,  0.5061,  0.6123,  0.1212
-0.0366, -0.1087,  0.3449, -0.1025,  0.4086,  0.2475
 0.3633,  0.3943,  0.2372, -0.6980,  0.5216,  0.1925
-0.5325, -0.6466, -0.2178, -0.3589,  0.6310,  0.3568
 0.2271,  0.5200, -0.1447, -0.8011, -0.7699,  0.3128
 0.6415,  0.1993,  0.3777, -0.0178, -0.8237,  0.2181
-0.5298, -0.0768, -0.6028, -0.9490,  0.4588,  0.4356
 0.6870, -0.1431,  0.7294,  0.3141,  0.1621,  0.1632
-0.5985,  0.0591,  0.7889, -0.3900,  0.7419,  0.2945
 0.3661,  0.7984, -0.8486,  0.7572, -0.6183,  0.3449
 0.6995,  0.3342, -0.3113, -0.6972,  0.2707,  0.1712
 0.2565,  0.9126,  0.1798, -0.6043, -0.1413,  0.2893
-0.3265,  0.9839, -0.2395,  0.9854,  0.0376,  0.4770
 0.2690, -0.1722,  0.9818,  0.8599, -0.7015,  0.3954
-0.2102, -0.0768,  0.1219,  0.5607, -0.0256,  0.3949
 0.8216, -0.9555,  0.6422, -0.6231,  0.3715,  0.0801
-0.2896,  0.9484, -0.7545, -0.6249,  0.7789,  0.4370
-0.9985, -0.5448, -0.7092, -0.5931,  0.7926,  0.5402

Test data:

# synthetic_test_40.txt
#
 0.7462,  0.4006, -0.0590,  0.6543, -0.0083,  0.1935
 0.8495, -0.2260, -0.0142, -0.4911,  0.7699,  0.1078
-0.2335, -0.4049,  0.4352, -0.6183, -0.7636,  0.5088
 0.1810, -0.5142,  0.2465,  0.2767, -0.3449,  0.3136
-0.8650,  0.7611, -0.0801,  0.5277, -0.4922,  0.7140
-0.2358, -0.7466, -0.5115, -0.8413, -0.3943,  0.4533
 0.4834,  0.2300,  0.3448, -0.9832,  0.3568,  0.1360
-0.6502, -0.6300,  0.6885,  0.9652,  0.8275,  0.3046
-0.3053,  0.5604,  0.0929,  0.6329, -0.0325,  0.4756
-0.7995,  0.0740, -0.2680,  0.2086,  0.9176,  0.4565
-0.2144, -0.2141,  0.5813,  0.2902, -0.2122,  0.4119
-0.7278, -0.0987, -0.3312, -0.5641,  0.8515,  0.4438
 0.3793,  0.1976,  0.4933,  0.0839,  0.4011,  0.1905
-0.8568,  0.9573, -0.5272,  0.3212, -0.8207,  0.7415
-0.5785,  0.0056, -0.7901, -0.2223,  0.0760,  0.5551
 0.0735, -0.2188,  0.3925,  0.3570,  0.3746,  0.2191
 0.1230, -0.2838,  0.2262,  0.8715,  0.1938,  0.2878
 0.4792, -0.9248,  0.5295,  0.0366, -0.9894,  0.3149
-0.4456,  0.0697,  0.5359, -0.8938,  0.0981,  0.3879
 0.8629, -0.8505, -0.4464,  0.8385,  0.5300,  0.1769
 0.1995,  0.6659,  0.7921,  0.9454,  0.9970,  0.2330
-0.0249, -0.3066, -0.2927, -0.4923,  0.8220,  0.2437
 0.4513, -0.9481, -0.0770, -0.4374, -0.9421,  0.2879
-0.3405,  0.5931, -0.3507, -0.3842,  0.8562,  0.3987
 0.9538,  0.0471,  0.9039,  0.7760,  0.0361,  0.1706
-0.0887,  0.2104,  0.9808,  0.5478, -0.3314,  0.4128
-0.8220, -0.6302,  0.0537, -0.1658,  0.6013,  0.4306
-0.4123, -0.2880,  0.9074, -0.0461, -0.4435,  0.5144
 0.0060,  0.2867, -0.7775,  0.5161,  0.7039,  0.3599
-0.7968, -0.5484,  0.9426, -0.4308,  0.8148,  0.2979
 0.7811,  0.8450, -0.6877,  0.7594,  0.2640,  0.2362
-0.6802, -0.1113, -0.8325, -0.6694, -0.6056,  0.6544
 0.3821,  0.1476,  0.7466, -0.5107,  0.2592,  0.1648
 0.7265,  0.9683, -0.9803, -0.4943, -0.5523,  0.2454
-0.9049, -0.9797, -0.0196, -0.9090, -0.4433,  0.6447
-0.4607,  0.1811, -0.2389,  0.4050, -0.0078,  0.5229
 0.2664, -0.2932, -0.4259, -0.7336,  0.8742,  0.1834
-0.4507,  0.1029, -0.6294, -0.1158, -0.6294,  0.6081
 0.8948, -0.0124,  0.9278,  0.2899, -0.0314,  0.1534
-0.1323, -0.8813, -0.0146, -0.0697,  0.6135,  0.2386 
This entry was posted in Machine Learning. Bookmark the permalink.

Leave a Reply