outputs = tf.tidy(() => {
const a = tf.variable(tf.randomNormal([], 0, .1));
const b = tf.variable(tf.randomNormal([], 0, .1));
const c = tf.variable(tf.randomNormal([], 0, .1));
const d = tf.variable(tf.randomNormal([], 0, .1));
const optimizer = tf.train.sgd(learningRate);
const ymin = inputData.ys.min();
const ymax = inputData.ys.max();
const yrange = ymax.sub(ymin);
const ynormalized = inputData.ys.sub(ymin).div(yrange);
const three = tf.scalar(3, 'int32');
const f = x =>
a.mul(x.pow(three))
.add(b.mul(x.square()))
.add(c.mul(x))
.add(d);
const loss = (preds, label) => preds.sub(label).square().mean();
for (let i = 0; i < iterations; i++) {
optimizer.minimize(() => loss(f(inputData.xs), ynormalized));
}
const modelOutput = f(inputData.xs);
const predictions = modelOutput.mul(yrange).add(ymin);
a.dispose();
b.dispose();
c.dispose();
d.dispose();
return {predictions};
})