【问题标题】:How to Use TensorFlow.js for Multi-variable Regression如何使用 TensorFlow.js 进行多变量回归
【发布时间】:2019-04-03 16:00:56
【问题描述】:

我想使用 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 中拟合多变量函数?我不这么认为。我将不胜感激。

【问题讨论】:

    标签: javascript math regression mathematical-optimization tensorflow.js


    【解决方案1】:

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

    调整学习率将使模型能够找到最佳参数。在这种情况下,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>

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多