如何使用 TensorFlow.js 进行多变量回归

How to Use TensorFlow.js for Multi-variable Regression

我想使用 TensorFlow 拟合非线性多变量方程。下面给出了等式。要拟合的参数是 a0、a1 和 a2。自变量是 S 和 R,而 F 是因变量。 S,R,F对应的数据在下面的代码中分别为Sdata,Rdata,Fdata。

F = a0 + a1*S + a2*R

const Sdata = tf.tensor1d([13.8,13.8,20.2,12.1,14.1,29.4,13.7,16.6,18.9,15.5]);
const Fdata = tf.tensor1d([46.7,130.7,78.1,72.2,40.1,78.6,57.4,170.7,80.2,45.2]);
const Rdata = tf.tensor1d([1.5,4.5,2.5,3.0,3.5,3.0,2.5,3.0,3.0,2.5])

const a0 = tf.scalar(Math.random()).variable();
const a1 = tf.scalar(Math.random()).variable();
const a2 = tf.scalar(Math.random()).variable();

const fun = (r,s) => a2.mul(r).add(a1.mul(s)).add(a0)
const cost = (pred, label) => pred.sub(label).square().mean();

const learningRate = 0.01;
const optimizer = tf.train.sgd(learningRate);

// Train the model.
for (let i = 0; i < 800; i++) {
    optimizer.minimize(() => cost(fun(Rdata,Sdata), Fdata));
}

如我的代码所示,我假设函数 "fun" 可以采用两个自变量。我得到的不是 a0 = -6.6986、a1 = 0.8005 和 a2 = 25.2523,而是 NaN。

这是否意味着无法在 tensorflow.js 中拟合多变量函数?我不这么认为。如果对此有任何见解,我将不胜感激。

由于学习率的原因,模型正在振荡以找到最佳参数。实际上,参数不断增加到无穷大。

调整学习率将使模型找到最佳参数。在这种情况下 0.001 似乎给出了好的结果。如果你想提高模型的准确性,你可以考虑将所有输入数据归一化为相同的数量级 - 在 0 和 1 之间

const Sdata = tf.tensor1d([13.8,13.8,20.2,12.1,14.1,29.4,13.7,16.6,18.9,15.5]);
const Fdata = tf.tensor1d([46.7,130.7,78.1,72.2,40.1,78.6,57.4,170.7,80.2,45.2]);
const Rdata = tf.tensor1d([1.5,4.5,2.5,3.0,3.5,3.0,2.5,3.0,3.0,2.5])

const a0 = tf.scalar(Math.random()).variable();
const a1 = tf.scalar(Math.random()).variable();
const a2 = tf.scalar(Math.random()).variable();

const fun = (r,s) => a2.mul(r).add(a1.mul(s)).add(a0)
const cost = (pred, label) => pred.sub(label).square().mean();

const learningRate = 0.001;
const optimizer = tf.train.sgd(learningRate);

// Train the model.
for (let i = 0; i < 800; i++) {
    console.log("training")
    optimizer.minimize(() => cost(fun(Rdata,Sdata), Fdata));
}

console.log(`a: ${a0.dataSync()}, b: ${a1.dataSync()}, c: ${a2.dataSync()}`);

const preds = fun(Rdata,Sdata).dataSync();
preds.forEach((pred, i) => {
   console.log(`x: ${i}, pred: ${pred}`);
});
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"> </script>
  </head>

  <body>
  </body>
</html>