I fed my decision tree regression system, implemented using JavaScript, to several AI systems and asked the AI to analyze it for correctness. The AI found a few rare edge cases where my code could fail, and showed me how to check for those edge cases.
Additionally, the AI pointed out that even though my implementation was functionally correct, there were several instances where performance could be significantly improved. After a lot of work, I came up with a new version of JavaScript decision tree regression. The effort was surprisingly difficult, and took over 16 hours, even with the tireless help of an AI coding agent.
For my demo, I used one of my standard datasets It 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 data is synthetic. The first five values on each line are the predictors. The last value on each line is the target to predict. There are 200 training items and 40 test items.
The key parts of the output of my revised demo are:
JavaScript decision tree regression
Loading synthetic train (200), test (40)
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.484 0.1568 0.8054
Setting maxDepth = 3
Setting minSamples = 2
Setting minLeaf = 18
Using default numSplitCols = -1 (all)
Creating and training tree
Done
ID 0 | sc 0 | sv -0.2074 | L 1 | R 2 | py 0.3493 | leaf F | rc 200
ID 1 | sc 4 | sv 0.1462 | L 3 | R 4 | py 0.5345 | leaf F | rc 75
ID 2 | sc 0 | sv 0.3916 | L 5 | R 6 | py 0.2382 | leaf F | rc 125
ID 3 | sc 0 | sv -0.6537 | L 7 | R 8 | py 0.6358 | leaf F | rc 41
ID 4 | sc -1 | sv 0.0000 | L -1 | R -1 | py 0.4123 | leaf T | rc 34
ID 5 | sc 4 | sv -0.2969 | L 11 | R 12 | py 0.3032 | leaf F | rc 64
ID 6 | sc 2 | sv 0.3798 | L 13 | R 14 | py 0.1701 | leaf F | rc 61
ID 7 | sc -1 | sv 0.0000 | L -1 | R -1 | py 0.6952 | leaf T | rc 23
ID 8 | sc -1 | sv 0.0000 | L -1 | R -1 | py 0.5598 | leaf T | rc 18
ID 11 | sc -1 | sv 0.0000 | L -1 | R -1 | py 0.4101 | leaf T | rc 18
ID 12 | sc -1 | sv 0.0000 | L -1 | R -1 | py 0.2613 | leaf T | rc 46
ID 13 | sc -1 | sv 0.0000 | L -1 | R -1 | py 0.1882 | leaf T | rc 39
ID 14 | sc -1 | sv 0.0000 | L -1 | R -1 | py 0.1381 | leaf T | rc 22
Rows associated with node [11]:
0 7 14 24 69 87 88 119 121 123 133 136 138 141 162 186 191 195
Evaluating tree model
Train acc (within 0.10) = 0.3750
Test acc (within 0.10) = 0.4750
Train MSE = 0.0048
Test MSE = 0.0054
Predicting for x =
-0.1660 0.4406 -0.9998 -0.3953 -0.7065
y = 0.4101
IF
column 0 > -0.2074 AND
column 0 <= 0.3916 AND
column 4 <= -0.2969 AND
THEN node [11] predicted = 0.4101
End decision tree regression demo
Each line of the tree shows node ID, split column, split value (aka threshold), left child idx, right child idx, predicted value for the node, a Boolean to tell if the node is a leaf node or not, the the row count of rows associated with the node. The explain() output has a trailing “AND” with no condition, but I was too lazy to strip it away.
The diagram below shows how the prediction was arrived at.
The accuracy is low, which is expected. Decision trees are almost never used by themselves. Instead they are usually part of a collection — bagging tree regression, random forest regression, AdaBoost regression, gradient boost regression.
A lot of work, but good fun.
In the late 1950s, the Cold War between the US and the USSR spurred amazing development in aviation. The US built two jet bombers, the Convair B-58 Hustler (Air Force), and the North American A-5 Vigilante (Navy). Both could fly at approximately 1,300 mph — faster than any Soviet interceptor jet at the time.
However, anti-aircraft surface-to-air missile technology and advanced radar detection technology developed so quickly that these bombers became vulnerable and by the end of the 1960s they were essentially replaced by nuclear submarine ballistic missiles and land-launched intercontinental ballistic missiles.
Both planes were very beautiful to my eye. When I was a young man in the 1960s, my grandfather Chet worked at Convair in San Diego and he gave me an official, internal-Convair, model of a B-58. It was one of my most prized possessions.
Demo program. Very long, extremely complex. Replace “lt” (less than), “gt”, “lte”, “gte” with Boolean operator symbols. (My blog editor chokes on symbols).
// decision_tree_regression.js
// node.js v22.16.0
// full List storage with indexes (no pointers)
// iteration-based construction (no stack, no recursion)
// Nodes hold associated row idxs (interpretability)
// but rows can be deleted after training (ensembles)
// this version has significant AI (OpenAI) improvements
const FS = require('fs');
// ==========================================================
class DecisionTreeRegressor
{
// internal Node factory
createNode()
{
// return an object literal
return {
id: -1,
colIdx: -1,
thresh: 0.0,
left: -1,
right: -1,
value: 0.0,
isLeaf: false,
rows: null,
};
}
// --------------------------------------------------------
// primary: ctor(), train(), predict(), explain(),
// accuracy(), mse(), display().
//
// help: bestSplit(), treeTargetMean(), next(), nextInt().
// -------------------------------------------------------
constructor(maxDepth, minSamples, minLeaf, numSplitCols,
saveRows, seed)
{
this.maxDepth = maxDepth;
this.minSamples = minSamples;
this.minLeaf = minLeaf;
this.numSplitCols = numSplitCols;
this.saveRows = saveRows;
let numNodes = Math.pow(2, maxDepth + 1) - 1;
this.tree = new Array(numNodes).fill(null);
this.seed = seed + 0.5;
this.trainX = null;
this.trainY = null;
}
// --------------------------------------------------------
train(trainX, trainY)
{
this.trainX = trainX;
this.trainY = trainY;
let maxParentID = Math.pow(2, this.maxDepth) - 2;
let allRows = new Array(this.trainX.length);
for (let i = 0; i "lt" this.trainX.length; ++i)
allRows[i] = i;
let root = this.createNode();
root.id = 0;
root.value = this.treeTargetMean(allRows);
//root.isLeaf = false; // not necessary
root.rows = allRows;
this.tree[0] = root;
for (let i = 0; i "lt" this.tree.length; ++i) {
let currNode = this.tree[i];
if (currNode == null) continue;
let leftID = currNode.id * 2 + 1;
let rightID = currNode.id * 2 + 2;
if (currNode.id "gt" maxParentID ||
currNode.rows.length "lt" this.minSamples ||
rightID "gte" this.tree.length) {
currNode.isLeaf = true;
continue;
}
let splitInfo = this.bestSplit(currNode.rows);
let colIdx = splitInfo[0];
let splitVal = splitInfo[1];
// split failure
if (colIdx == -1) {
currNode.isLeaf = true;
continue;
}
// 3. split success
currNode.colIdx = colIdx;
currNode.thresh = splitVal;
let leftIdxs = [];
let rightIdxs = [];
for (let k = 0; k "lt" currNode.rows.length; ++k) {
let r = currNode.rows[k];
if (this.trainX[r][colIdx] "lte" splitVal)
leftIdxs.push(r);
else
rightIdxs.push(r);
}
// 4. create and attach children
currNode.left = leftID;
let n1 = this.createNode();
n1.id = leftID;
n1.rows = leftIdxs;
n1.value = this.treeTargetMean(leftIdxs);
this.tree[leftID] = n1;
currNode.right = rightID;
let n2 = this.createNode();
n2.id = rightID;
n2.rows = rightIdxs;
n2.value = this.treeTargetMean(rightIdxs);
this.tree[rightID] = n2;
} // main loop
// 5. delete row info to save memory
if (this.saveRows == false) {
for (let i = 0; i "lt" this.tree.length; ++i) {
if (this.tree[i] != null)
this.tree[i].rows = null;
}
}
} // train()
// --------------------------------------------------------
predict(x)
{
let p = 0;
let lastValidValue = 0.0;
while (p != -1 && p "lt" this.tree.length) {
let currNode = this.tree[p];
if (currNode == null) break;
lastValidValue = currNode.value;
if (
currNode.isLeaf ||
currNode.colIdx == -1 ||
currNode.left "gte" this.tree.length ||
currNode.right "gte" this.tree.length
)
break;
if (x[currNode.colIdx] "lte" currNode.thresh)
p = currNode.left;
else
p = currNode.right;
}
return lastValidValue;
}
// --------------------------------------------------------
explain(x)
{
let p = 0;
let lastValidValue = 0.0;
let currNode = null;
let s = "\nIF \n";
while (p != -1 && p "lt" this.tree.length) {
currNode = this.tree[p];
if (currNode == null) break;
lastValidValue = currNode.value;
if (currNode.isLeaf == true) break;
s += "column " + currNode.colIdx + " ";
if (x[currNode.colIdx] "lte" currNode.thresh) {
s += " "lte" " +
currNode.thresh.toFixed(4).toString().padStart(8) +
" AND \n";
p = currNode.left;
}
else {
s += " "gt" " +
currNode.thresh.toFixed(4).toString().padStart(8) +
" AND \n";
p = currNode.right;
}
}
let nid = 0;
if (currNode == null)
nid = -1;
else
nid = currNode.id;
s += "THEN node [" + nid + "] predicted = " +
currNode.value.toFixed(4).toString();
console.log(s);
}
// --------------------------------------------------------
accuracy(dataX, dataY, pctClose)
{
let nCorrect = 0; let nWrong = 0;
for (let i = 0; i "lt" dataX.length; ++i) {
let x = dataX[i];
let actualY = dataY[i];
let predY = this.predict(x);
if (Math.abs(predY - actualY) "lt"
(pctClose * Math.abs(actualY))) {
++nCorrect;
}
else {
++nWrong;
}
}
return (nCorrect * 1.0) / (nCorrect + nWrong);
}
// --------------------------------------------------------
mse(dataX, dataY)
{
let n = dataX.length;
let sum = 0.0;
for (let i = 0; i "lt" n; ++i) {
let x = dataX[i];
let actualY = dataY[i];
let predY = this.predict(x);
sum += (actualY - predY) * (actualY - predY);
}
return sum / n;
}
// --------------------------------------------------------
display()
{
for (let i = 0; i "lt" this.tree.length; ++i) {
let n = this.tree[i];
// check for empty nodes
if (n == null) continue;
let s1 = "ID " +
n.id.toFixed(0).toString().padEnd(3) + " | ";
let s2 = "sc " +
n.colIdx.toFixed(0).toString().padStart(3) + " | ";
let s3 = "sv " +
n.thresh.toFixed(4).toString().padStart(8) + " | ";
let s4 = "L " +
n.left.toFixed(0).toString().padStart(3) + " | ";
let s5 = "R " +
n.right.toFixed(0).toString().padStart(3) + " | ";
let s6 = "py " +
n.value.toFixed(4).toString().padStart(8) + " | ";
let s7 = "leaf " +
(n.isLeaf == true ? "T" : "F") + " | ";
let s8 = "";
if (n.rows == null)
s8 = "rc 0";
else
s8 = "rc " + n.rows.length;
console.log(s1 + s2 + s3 + s4 +
s5 + s6 + s7 + s8);
}
} // display()
// --------------------------------------------------------
// helpers: bestSplit(), treeTargetMean(), next(),
// nextInt()
// --------------------------------------------------------
bestSplit(rows)
{
let bestColIdx = -1;
let bestThresh = 0.0;
let bestGain = -1.0;
let nRows = rows.length;
let nCols = this.trainX[0].length;
if (nRows === 0)
throw new Error("Empty data in bestSplit()");
let colIndices = new Array(nCols);
for (let k = 0; k "lt" nCols; ++k)
colIndices[k] = k;
// Fisher-Yates column selection
for (let i = 0; i "lt" nCols; ++i) {
let ri = this.nextInt(i, nCols);
let tmp = colIndices[i];
colIndices[i] = colIndices[ri];
colIndices[ri] = tmp;
}
let numColsToUse;
if (this.numSplitCols === -1)
numColsToUse = nCols;
else
numColsToUse = Math.min(this.numSplitCols, nCols);
let sortedRows = new Array(nRows);
let featureKeys = new Array(nRows);
let totalSum = 0.0;
for (let i = 0; i "lt" nRows; ++i)
totalSum += this.trainY[rows[i]];
for (let j = 0; j "lt" numColsToUse; ++j) {
let colIdx =colIndices[j];
for (let i = 0; i "lt" nRows; ++i) {
let r = rows[i];
sortedRows[i] = r;
featureKeys[i] = this.trainX[r][colIdx];
} // i
// sort featureKeys, sortedRows in parallel
// based on order of featureKeys
this.sortParallel(featureKeys, sortedRows);
let leftSum = 0.0;
for (let i = 0; i "lt" nRows-1; ++i) {
leftSum += this.trainY[sortedRows[i]];
let leftCount = i + 1;
let rightCount = nRows - leftCount;
if (featureKeys[i] == featureKeys[i+1])
continue; // duplicate
if (leftCount "lt" this.minLeaf ||
rightCount "lt" this.minLeaf)
continue;
let rightSum = totalSum - leftSum;
let gain = (leftSum * leftSum / leftCount) +
(rightSum * rightSum / rightCount);
if (gain "gt" bestGain) {
bestGain = gain;
bestColIdx = colIdx;
bestThresh = featureKeys[i] +
(featureKeys[i+1] - featureKeys[i]) / 2.0;
}
} // i
} // j
return [bestColIdx, bestThresh];
} // bestSplit()
// --------------------------------------------------------
next()
{
let x = Math.sin(this.seed++) * 10000; // avoid stuck 0
return x - Math.floor(x);
}
// -------------------------------------------------------
nextInt(lo, hi)
{
return Math.trunc((hi - lo) * this.next() + lo);
}
// --------------------------------------------------------
treeTargetMean(rows)
{
let sum = 0.0;
for (let i = 0; i "lt" rows.length; ++i) {
sum += this.trainY[rows[i]];
}
return sum / rows.length;
}
// --------------------------------------------------------
sortParallel(keys, values)
{
// sort keys and values in-place based on order of keys
let n = keys.length;
let idxs = this.argsort(keys);
let sortedKeys = new Array(n);
let sortedValues = new Array(n);
for (let i = 0; i "lt" n; ++i) {
let idx = idxs[i];
sortedKeys[i] = keys[idx];
sortedValues[i] = values[idx];
}
for (let i = 0; i "lt" n; ++i) {
keys[i] = sortedKeys[i];
values[i] = sortedValues[i];
}
}
// --------------------------------------------------------
argsort(vec)
{
// get indices of vector if it were to be sorted
// no exotic syntax
// vec is a numeric array
// suppose vec = [44.4, 99.9, 11.1, 33.3, 22.2]
let n = vec.length; // 5
let augmented = [];
for (let i = 0; i "lt" n; ++i) {
augmented[i] = [vec[i], i]; // add indices to values
}
// augmented is [[44.4, 0], [99.9, 1] . . [22.2, 4]]
augmented.sort(function(a, b){return a[0] - b[0]});
// augmented is [[11.1, 2], [22.2, 4] . . [55.5, 1]]
let result = [];
for (let i = 0; i "lt" n; ++i) {
result[i] = augmented[i][1]; // fetch the indexes
}
return result; // 2, 4, 3, 0, 1
}
} // class DecisionTreeRegressor
// ==========================================================
// ==========================================================
function loadTxt(fn, delimit, usecols, comment)
{
let all = FS.readFileSync(fn, "utf8").trim();
let lines = all.split("\n");
let nRows = 0;
for (let i = 0; i "lt" lines.length; ++i) {
if (!lines[i].startsWith(comment)) ++nRows;
}
let nCols = usecols.length;
// let result = Array.from({ length: nRows },
// () ="gt" new Array(nCols));
let result = [];
for (let i = 0; i "lt" nRows; ++i) {
result[i] = [];
for (let j = 0; j "lt" nCols; ++j) {
result[i][j] = 0.0;
}
}
let r = 0; let i = 0;
while (r "lt" lines.length) {
if (lines[r].startsWith(comment)) {
++r;
}
else {
let tokens = lines[r].split(delimit);
for (let j = 0; j "lt" nCols; ++j) {
result[i][j] = parseFloat(tokens[usecols[j]]);
}
++r;
++i;
}
}
if (usecols.length === 1) {
let vec = new Array(nRows);
for (let k = 0; k "lt" nRows; ++k)
vec[k] = result[k][0];
return vec;
}
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 main()
{
console.log("\nJavaScript decision tree regression ");
// 1. load data
console.log("\nLoading synthetic train (200), test (40)");
let trainFile = ".\\Data\\synthetic_train_200.txt";
let testFile = ".\\Data\\synthetic_test_40.txt";
let trainX = loadTxt(trainFile, ",", [0,1,2,3,4], "#");
let trainY = loadTxt(trainFile, ",", [5], "#");
let testX = loadTxt(testFile, ",", [0,1,2,3,4], "#");
let testY = loadTxt(testFile, ",", [5], "#");
console.log("Done ");
console.log("\nFirst three train x: ");
for (let i = 0; i "lt" 3; ++i)
vecShow(trainX[i], 4, 8); // 4 decimals 8 wide
console.log("\nFirst three train y: ");
for (let i = 0; i "lt" 3; ++i)
process.stdout.write(trainY[i].toString() + " ");
console.log("");
// 2. create and train tree
let maxDepth = 3;
let minSamples = 2;
let minLeaf = 18; // 18
let numSplitCols = -1; // use all columns
// let numSplitCols = 4; // for random forest
let saveRows = true;
let seed = 0;
console.log("\nSetting maxDepth = " +
maxDepth.toString());
console.log("Setting minSamples = " +
minSamples.toString());
console.log("Setting minLeaf = " +
minLeaf.toString());
console.log("Using default numSplitCols = -1 (all)");
console.log("\nCreating and training tree ");
let dtr =
new DecisionTreeRegressor(maxDepth, minSamples,
minLeaf, numSplitCols, saveRows, seed);
dtr.train(trainX, trainY);
console.log("Done \n");
dtr.display();
console.log("\nRows associated with node [11]: ");
for (let i = 0; i "lt" dtr.tree[11].rows.length; ++i) {
process.stdout.write(dtr.tree[11].rows[i].toString())
process.stdout.write(" ");
}
console.log("");
// 3. evaluate tree
console.log("\nEvaluating tree model ");
let trainAcc = dtr.accuracy(trainX, trainY, 0.10);
let testAcc = dtr.accuracy(testX, testY, 0.10);
console.log("\nTrain acc (within 0.10) = " +
trainAcc.toFixed(4).toString());
console.log("Test acc (within 0.10) = " +
testAcc.toFixed(4).toString());
let trainMSE = dtr.mse(trainX, trainY);
let testMSE = dtr.mse(testX, testY);
console.log("\nTrain MSE = " +
trainMSE.toFixed(4).toString());
console.log("Test MSE = " +
testMSE.toFixed(4).toString());
// 4. use tree to make prediction
let x = trainX[0];
console.log("\nPredicting for x = ");
vecShow(x, 4, 9);
let predY = dtr.predict(x);
console.log("y = " + predY.toFixed(4).toString());
dtr.explain(x);
console.log("\nEnd decision tree regression 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.