Как использовать TensorFlow.js для многопараметрической регрессии - PullRequest
3 голосов
/ 03 апреля 2019

Я хочу подогнать нелинейное многомерное уравнение, используя TensorFlow. Уравнение приведено ниже. Подходящие параметры: a0, a1 и a2. Независимыми переменными являются S и R, а F - зависимая переменная. Соответствующие данные для S, R, F представлены в приведенном ниже коде как Sdata, Rdata и Fdata соответственно.

F = a0 + a1 * S + a2 * R

I

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.

Означает ли это, что невозможно разместить многопараметрические функции в tenorflow.js? Я так не думаю. Я буду признателен за понимание этого вопроса.

1 Ответ

1 голос
/ 03 апреля 2019

Из-за скорости обучения модель колеблется, чтобы найти лучшие параметры.Фактически, параметры продолжают увеличиваться до бесконечности.

Настройка скорости обучения позволит модели найти лучшие параметры.В этом случае 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>
...