One morning before work, I realized that I hadn’t written any JavaScript code for several weeks. For mental exercise, 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 JavaScript.
The effort was an interesting challenge. It didn’t take me very long (about 90 minutes) because I had recently coded the same system using both C# and Python, and all the ideas were still fresh in my head.
The output of my demo:
Begin JavaScript deep NN regression demo Loading synthetic train (200) and test (40) data Done First three train X: -0.1660 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() neural network regressor Done Setting lrnRate = 0.05 Setting maxEpochs = 8000 epoch: 0 MSE = 0.0369 acc = 0.1050 epoch: 800 MSE = 0.0005 acc = 0.7700 epoch: 1600 MSE = 0.0004 acc = 0.8250 epoch: 2400 MSE = 0.0003 acc = 0.8550 epoch: 3200 MSE = 0.0002 acc = 0.9150 epoch: 4000 MSE = 0.0002 acc = 0.8950 epoch: 4800 MSE = 0.0002 acc = 0.8900 epoch: 5600 MSE = 0.0001 acc = 0.9000 epoch: 6400 MSE = 0.0001 acc = 0.9050 epoch: 7200 MSE = 0.0001 acc = 0.9100 Done Evaluating model Accuracy (10%) on training data = 0.9400 Accuracy (10%) on test data = 0.9500 MSE on training data = 0.0001 MSE on test data = 0.0002 Predicting y for train[0] Predicted y = 0.4815 End demo
The accuracy results of the JavaScript implementation were essentially the same as the results from the C# and Python implementations. The JavaScript version was a bit slower than the C# version, but significantly faster than the Python version.
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.

The JavaScript language is filled with ironies. For example, JavaScript is a language that was written in just 10 days as a quick utility for web animations, but is now arguably the most dominant and omnipresent programming language in the world.
Here are two examples of job-hiring irony.
Left: The “Accepting Resumes” sign for the Verizon mobile phone company is unfortunately placed relative to the garbage can. The woman pointing directly to the garbage can opening is a nice, added touch.
Right: The “Now Hiring” sign for the Sports Authority sporting goods store loses a lot of credibility due to the placement directly below a sign with a decidedly different message.
Demo program. Replace “lt” (less than), “gt”, “lte”, “gte” with Boolean operator symbols (my blog editor chokes on symbols).
// neural_net_deep_regression.js
// node.js ES6
// NN with 2 hidden layers regression
// tanh, identity activations
let FS = require("fs") // to load data from file
// ==========================================================
class NeuralNetDeepRegressor
{
constructor(numInput, numHiddenA, numHiddenB, numOutput,
seed)
{
this.rnd = new Erratic(seed); // pseudo-pseudo-random
this.numInput = numInput;
this.numHiddenA = numHiddenA;
this.numHiddenB = numHiddenB;
this.numOutput = numOutput;
this.iNodes = vecMake(numInput, 0.0);
this.aNodes = vecMake(numHiddenA, 0.0);
this.bNodes = vecMake(numHiddenB, 0.0);
this.oNodes = vecMake(numOutput, 0.0);
this.iaWeights = matMake(numInput, numHiddenA, 0.0);
this.abWeights = matMake(numHiddenA, numHiddenB, 0.0);
this.boWeights = matMake(numHiddenB, numOutput, 0.0);
this.aBiases = vecMake(numHiddenA, 0.0);
this.bBiases = vecMake(numHiddenB, 0.0);
this.oBiases = vecMake(numOutput, 0.0); // [1]
}
// --------------------------------------------------------
// predict(), train(), MSE(), accuracy()
// --------------------------------------------------------
predict(x)
{
// copy input into iNodes
for (let i = 0; i "lt" this.numInput; ++i)
this.iNodes[i] = x[i];
// compute hidden layer A
for (let j = 0; j "lt" this.numHiddenA; ++j) {
let sum = 0.0;
for (let i = 0; i "lt" this.numInput; ++i)
sum += this.iNodes[i] * this.iaWeights[i][j];
sum += this.aBiases[j];
this.aNodes[j] = this.hyperTan(sum);
}
// compute hidden layer B
for (let j = 0; j "lt" this.numHiddenB; ++j) {
let sum = 0.0;
for (let i = 0; i "lt" this.numHiddenA; ++i)
sum += this.aNodes[i] * this.abWeights[i][j];
sum += this.bBiases[j];
this.bNodes[j] = this.hyperTan(sum);
}
// compute output layer
for (let j = 0; j "lt" this.numOutput; ++j) {
let sum = 0.0;
for (let i = 0; i "lt" this.numHiddenB; ++i)
sum += this.bNodes[i] * this.boWeights[i][j];
sum += this.oBiases[j];
this.oNodes[j] = this.identity(sum);
}
return this.oNodes[0]; // a single scalar value
}
// --------------------------------------------------------
train(trainX, trainY, lrnRate, maxEpochs)
{
// init weights
let lo = -0.01; let hi = 0.01;
for (let i = 0; i "lt" this.numInput; ++i)
for (let j = 0; j "lt" this.numHiddenA; ++j)
this.iaWeights[i][j] =
(hi - lo) * this.rnd.next() + lo;
for (let i = 0; i "lt" this.numHiddenA; ++i)
for (let j = 0; j "lt" this.numHiddenB; ++j)
this.abWeights[i][j] =
(hi - lo) * this.rnd.next() + lo;
for (let i = 0; i "lt" this.numHiddenB; ++i)
for (let j = 0; j "lt" this.numOutput; ++j)
this.boWeights[i][j] =
(hi - lo) * this.rnd.next() + lo;
// each weight and bias has a gradient
let boGrads = matMake(this.numHiddenB,
this.numOutput, 0.0);
let abGrads = matMake(this.numHiddenA,
this.numHiddenB, 0.0);
let iaGrads = matMake(this.numInput,
this.numHiddenA, 0.0);
let oBiasGrads = vecMake(this.numOutput, 0.0);
let bBiasGrads = vecMake(this.numHiddenB, 0.0);
let aBiasGrads = vecMake(this.numHiddenA, 0.0);
// each output and hidden node has a 'signal'
// which is gradient without associated input
// (lower case delta in Wikipedia)
let oSignals = vecMake(this.numOutput, 0.0);
let bSignals = vecMake(this.numHiddenB, 0.0);
let aSignals = vecMake(this.numHiddenA, 0.0);
let indices = vecMake(trainX.length, 0.0);
for (let i = 0; i "lt" indices.length; ++i)
indices[i] = i;
let freq = Math.trunc(maxEpochs / 10); // progress freq
for (let epoch = 0; epoch "lt" maxEpochs; ++epoch) {
this.shuffle(indices);
for (let ii = 0; ii "lt" trainX.length; ++ii) {
let idx = indices[ii];
let x = trainX[idx];
let actualY = trainY[idx];
let predY = this.predict(x);
// output node signals depends on target values
for (let k = 0; k "lt" this.numOutput; ++k) {
let error = predY - actualY; // standard form
let derivative = 1.0; // identity activation
oSignals[k] = error * derivative;
}
// signal for B nodes depends on output signals
for (let j = 0; j "lt" this.numHiddenB; ++j) {
let derivative =
(1 + this.bNodes[j]) * (1 - this.bNodes[j]);
let sum = 0.0;
for (let k = 0; k "lt" this.numOutput; ++k)
sum += oSignals[k] * this.boWeights[j][k];
bSignals[j] = derivative * sum;
}
// signal for A nodes, depends on B signals
for (let j = 0; j "lt" this.numHiddenA; ++j) {
let derivative =
(1 + this.aNodes[j]) * (1 - this.aNodes[j]);
let sum = 0.0;
for (let k = 0; k "lt" this.numHiddenB; ++k)
sum += bSignals[k] * this.abWeights[j][k];
aSignals[j] = derivative * sum;
}
// at this point, all signals have been computed
// use signals to calculate gradients left-to-right
for (let i = 0; i "lt" this.numInput; ++i)
for (let j = 0; j "lt" this.numHiddenA; ++j)
iaGrads[i][j] = this.iNodes[i] * aSignals[j];
for (let i = 0; i "lt" this.numHiddenA; ++i)
for (let j = 0; j "lt" this.numHiddenB; ++j)
abGrads[i][j] = this.aNodes[i] * bSignals[j];
for (let i = 0; i "lt" this.numHiddenB; ++i)
for (let j = 0; j "lt" this.numOutput; ++j)
boGrads[i][j] = this.bNodes[i] * oSignals[j];
// compute bias gradients
for (let j = 0; j "lt" this.numHiddenA; ++j)
aBiasGrads[j] = 1.0 * aSignals[j];
for (let j = 0; j "lt" this.numHiddenB; ++j)
bBiasGrads[j] = 1.0 * bSignals[j];
for (let j = 0; j "lt" this.numOutput; ++j)
oBiasGrads[j] = 1.0 * oSignals[j];
// use gradients to update all weights
for (let i = 0; i "lt" this.numInput; ++i)
for (let j = 0; j "lt" this.numHiddenA; ++j)
this.iaWeights[i][j] -= iaGrads[i][j] * lrnRate;
for (let i = 0; i "lt" this.numHiddenA; ++i)
for (let j = 0; j "lt" this.numHiddenB; ++j)
this.abWeights[i][j] -= abGrads[i][j] * lrnRate;
for (let i = 0; i "lt" this.numHiddenB; ++i)
for (let j = 0; j "lt" this.numOutput; ++j)
this.boWeights[i][j] -= boGrads[i][j] * lrnRate;
// update all biases
for (let j = 0; j "lt" this.numHiddenA; ++j)
this.aBiases[j] -= aBiasGrads[j] * lrnRate;
for (let j = 0; j "lt" this.numHiddenB; ++j)
this.bBiases[j] -= bBiasGrads[j] * lrnRate;
for (let j = 0; j "lt" this.numOutput; ++j)
this.oBiases[j] -= oBiasGrads[j] * lrnRate;
} // ii each train item
if (epoch % freq == 0) {
let mse =
this.MSE(trainX, trainY).toFixed(4);
let acc =
this.accuracy(trainX, trainY, 0.10).toFixed(4);
let s1 = "epoch: " +
epoch.toString().padStart(6, ' ');
let s2 = " MSE = " +
mse.toString().padStart(8, ' ');
let s3 = " acc = " + acc.toString();
console.log(s1 + s2 + s3);
}
} // epoch
return;
}
// --------------------------------------------------------
MSE(dataX, dataY)
{
let sum = 0.0;
let n = dataX.length;
for (let i = 0; i "lt" n; ++i) {
let x = dataX[i];
let actualY = dataY[i]; // target
let predY = this.predict(x);
sum += (predY - actualY) * (predY - actualY);
}
return sum / n;
}
// --------------------------------------------------------
accuracy(dataX, dataY, pctClose)
{
let n = dataX.length;
let nCorrect = 0; let nWrong = 0;
for (let i = 0; i "lt" n; ++i) {
let x = dataX[i];
let actualY = dataY[i];
let predY = this.predict(x);
if ( Math.abs(actualY - predY) "lt"
Math.abs(actualY * pctClose) ) {
++nCorrect;
}
else {
++nWrong;
}
}
return nCorrect / (nCorrect + nWrong);
}
// --------------------------------------------------------
// helpers: shuffle(), hyperTan(), identity(),
// --------------------------------------------------------
shuffle(v)
{
// Fisher-Yates
let n = v.length;
for (let i = 0; i "lt" n; ++i) {
let r = this.rnd.nextInt(i, n);
let tmp = v[r];
v[r] = v[i];
v[i] = tmp;
}
}
// --------------------------------------------------------
hyperTan(x)
{
if (x "lt" -8.0) {
return -1.0;
}
else if (x "gt" 8.0) {
return 1.0;
}
else {
return Math.tanh(x);
}
}
// --------------------------------------------------------
identity(x)
{
return x;
}
// --------------------------------------------------------
} // class NeuralNetDeepRegressor
// ==========================================================
// helpers: loadTxt(), class Erratic, vecMake(), matMake(),
// matToVec(), vecShow(), vecShow(), matShow()
// ----------------------------------------------------------
function loadTxt(fn, delimit, usecols, comment) {
// efficient but mildly complicated
let all = FS.readFileSync(fn, "utf8"); // giant string
all = all.trim(); // strip final crlf in file
let lines = all.split("\n"); // array of lines
// count number non-comment lines
let nRows = 0;
for (let i = 0; i "lt" lines.length; ++i) {
if (!lines[i].startsWith(comment))
++nRows;
}
let nCols = usecols.length;
let result = matMake(nRows, nCols, 0.0);
let r = 0; // into lines
let i = 0; // into result[][]
while (r "lt" lines.length) {
if (lines[r].startsWith(comment)) {
++r; // next row
}
else {
let tokens = lines[r].split(delimit);
for (let j = 0; j "lt" nCols; ++j) {
result[i][j] = parseFloat(tokens[usecols[j]]);
}
++r;
++i;
}
}
return result;
}
// ----------------------------------------------------------
class Erratic
{
constructor(seed)
{
this.seed = seed + 0.5; // avoid 0
}
next()
{
let x = Math.sin(this.seed) * 1000;
let result = x - Math.floor(x); // [0.0,1.0)
this.seed = result; // for next call
return result;
}
nextInt(lo, hi)
{
let x = this.next();
return Math.trunc((hi - lo) * x + lo);
}
}
// ----------------------------------------------------------
function vecMake(n, val)
{
let result = [];
for (let i = 0; i "lt" n; ++i) {
result[i] = val;
}
return result;
}
// ----------------------------------------------------------
function matMake(rows, cols, val)
{
let result = [];
for (let i = 0; i "lt" rows; ++i) {
result[i] = [];
for (let j = 0; j "lt" cols; ++j) {
result[i][j] = val;
}
}
return result;
}
// ----------------------------------------------------------
function matToVec(m)
{
let r = m.length;
let c = m[0].length;
let result = vecMake(r*c, 0.0);
let k = 0;
for (let i = 0; i "lt" r; ++i) {
for (let j = 0; j "lt" c; ++j) {
result[k++] = m[i][j];
}
}
return result;
}
// ----------------------------------------------------------
function vecShow(v, dec, len)
{
for (let i = 0; i "lt" v.length; ++i) {
if (i != 0 && i % len == 0) {
process.stdout.write("\n");
}
if (v[i] "gte" 0.0) {
process.stdout.write(" "); // + or - space
}
process.stdout.write(v[i].toFixed(dec));
process.stdout.write(" ");
}
process.stdout.write("\n");
}
// ----------------------------------------------------------
function vecShow(vec, dec, wid, nl)
{
for (let i = 0; i "lt" vec.length; ++i) {
let x = vec[i];
if (Math.abs(x) "lt" 0.000001) x = 0.0 // avoid -0.00
let xx = x.toFixed(dec);
let s = xx.toString().padStart(wid, ' ');
process.stdout.write(s);
process.stdout.write(" ");
}
if (nl == true)
process.stdout.write("\n");
}
// ----------------------------------------------------------
function matShow(m, dec, wid)
{
let rows = m.length;
let cols = m[0].length;
for (let i = 0; i "lt" rows; ++i) {
for (let j = 0; j "lt" cols; ++j) {
if (m[i][j] "gte" 0.0) {
process.stdout.write(" "); // + or - space
}
process.stdout.write(m[i][j].toFixed(dec));
process.stdout.write(" ");
}
process.stdout.write("\n");
}
}
// ==========================================================
function main()
{
// process.stdout.write("\033[0m"); // reset
// process.stdout.write("\x1b[1m" + "\x1b[37m"); // white
console.log("\nBegin JavaScript deep NN regression demo ");
// 1. load data
console.log("\nLoading synthetic train" +
" (200) and test (40) data");
let trainFile = ".\\Data\\synthetic_train_200.txt";
let trainX = loadTxt(trainFile, ",", [0,1,2,3,4], "#");
let trainY = loadTxt(trainFile, ",", [5], "#");
trainY = matToVec(trainY);
let testFile = ".\\Data\\synthetic_test_40.txt"
let testX = loadTxt(testFile, ",", [0,1,2,3,4], "#");
let testY = loadTxt(testFile, ",", [5], "#");
testY = matToVec(testY);
console.log("Done ");
console.log("\nFirst three train X: ");
for (let i = 0; i "lt" 3; ++i)
vecShow(trainX[i], 4, 8, true); // vec, dec, wid, nl
console.log("\nFirst three train y: ");
for (let i = 0; i "lt" 3; ++i)
console.log(trainY[i].toFixed(4).toString().
padStart(2, ' '));
// 2. create network
console.log("\nCreating 5-10-10-1 tanh()" +
" identity() neural network regressor ");
let seed = 1;
let nn = new NeuralNetDeepRegressor(5, 10, 10, 1, seed);
console.log("Done ");
// 3. train network
let lrnRate = 0.05;
let maxEpochs = 8000;
console.log("\nSetting lrnRate = 0.05 ");
console.log("Setting maxEpochs = 8000 ");
nn.train(trainX, trainY, lrnRate, maxEpochs);
console.log("Done ");
// 4. evaluate model
console.log("\nEvaluating model ");
let trainAcc = nn.accuracy(trainX, trainY, 0.10);
let testAcc = nn.accuracy(testX, testY, 0.10);
console.log("\nAccuracy (10%) on training data = " +
trainAcc.toFixed(4).toString());
console.log("Accuracy (10%) on test data = " +
testAcc.toFixed(4).toString());
let trainMSE = nn.MSE(trainX, trainY);
let testMSE = nn.MSE(testX, testY);
console.log("\nMSE on training data = " +
trainMSE.toFixed(4).toString());
console.log("MSE on test data = " +
testMSE.toFixed(4).toString());
// 5. use trained model
console.log("\nPredicting y for train[0] ");
let x = trainX[0];
let predY = nn.predict(x);
console.log("Predicted y = " +
predY.toFixed(4).toString());
//console.log(predY.toFixed(4).toString());
//process.stdout.write("\033[0m"); // reset
console.log("\nEnd demo");
}
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





















.NET Test Automation Recipes
Software Testing
SciPy Programming Succinctly
Keras Succinctly
R Programming
Visual Studio Live
Microsoft MLADS Conference
DevIntersection Conference
Machine Learning Week
Ai4 Conference
G2E Conference
iSC West Conference
You must be logged in to post a comment.