# 线性回归

线性回归解决的是根据特征获取某个线性的值

# 代码展示

import * as tf from '@tensorflow/tfjs';
import * as tfvis from '@tensorflow/tfjs-vis';

window.onload = async () => {
  const xs = [1, 2, 3, 4];
  const ys = [1, 3, 5, 7];

  /* 数据可视化 */
  tfvis.render.scatterplot(
    {
      name: '线性回归训练集',
    },
    {
      values: xs.map((x, i) => ({
        x,
        y: ys[i],
      })),
    },
    {
      xAxisDomain: [0, 5], // 设置x轴范围
      yAxisDomain: [0, 8], // 设置y轴范围
    }
  );

  /* 初始化模型 */
  const model = tf.sequential(); // 连续模型(绝大多数问题都用这个)

  /*给模型添加层*/
  model.add(
    tf.layers.dense({
      units: 1, // 神经元个数
      inputShape: [1], // 输入的形状-最小一纬(一纬数据,长度为一(只有一个特征))
    })
  );

  /*给模型设置损失函数与优化器*/
  model.compile({
    loss: tf.losses.meanSquaredError, // 损失函数-使用均方误差计算
    optimizer: tf.train.sgd(0.1), // 优化器-设置学习率
  });

  /*将训练数据转换成tensor*/
  const inputs = tf.tensor(xs);
  const labels = tf.tensor(ys);

  /*异步训练模型*/
  await model.fit(inputs, labels, {
    batchSize: 10, // 每次样本需要学习的样本数据量
    epochs: 200, // 训练轮数
    callbacks: tfvis.show.fitCallbacks(
      // 可视化模拟训练过程
      { name: '训练过程' },
      ['loss'] // 制定度量单位(制作损失曲线)
    ),
  });

  $('#test')
    .removeAttr('disabled')
    .on('click', function() {
      /*输出预测结果并显示*/
      const output = model.predict(tf.tensor([Number($('#input').val())])); // 输入一个tensor帮你预测结果并赋值给变量
      console.log('output', output.dataSync());
      output.dataSync();
    });
};

# 重点笔记

  • tfvis 是 tensor 封装好的可视化库可以通过tfvis文档查看

  • 训练模型流程:初始化模型-给模型添加层-给模型设置损失函数与优化器-将训练数据转换成 tensor-异步训练模型

  • 线性回归数据集

const xs = [1, 2, 3, 4];
const ys = [1, 3, 5, 7];
  • const model = tf.sequential();初始化模型,绝大多数模型都可以用 sequential(连续模型--这一层的输入一定是上一层的输出)。

  • tf.layers.dense 给模型添加“全连接层” 全连接层适用于输入*权重+偏差的计算 This layer implements the operation: output = activation(dot(input, kernel) + bias) tf.layers.dense

  • tf.losses.meanSquaredError 损失函数使用均方误差

  • const output = model.predict(tensor) 的作用是输出一个 tensor 的预测值 output.dataSync(); 获得的是转化为 javascript 的输出值

model.predict

model.predict.dataSync