# 逻辑回归-二分类

逻辑回归解决的是分类问题

# 代码展示

import * as tf from '@tensorflow/tfjs';
import * as tfvis from '@tensorflow/tfjs-vis';
import { getData } from './data';

window.onload = async () => {
  /*构造数据*/
  const data = getData(400);
  console.log('data', data);

  /*可视化数据*/
  tfvis.render.scatterplot(
    { name: '逻辑回归训练数据' },
    {
      values: [
        data.filter((p) => p.label === 1),
        data.filter((p) => p.label === 0),
      ],
    }
  );

  /* 初始化模型 */
  const model = tf.sequential(); // 连续模型

  /*添加层(全连接层)*/
  model.add(
    tf.layers.dense({
      units: 1, // 神经元个数
      inputShape: [2], // 神经元接受的形状
      activation: 'sigmoid', // 激活函数(这个激活函数作用为将值压缩在0-1之间)
    })
  );

  /*设置对数损失函数(适合算概率)*/
  model.compile({
    loss: tf.losses.logLoss, // 对数损失
    optimizer: tf.train.adam(0.1), // 设置优化率(如果不知道选什么优化器选这个就行,可以自动调整步数)
  });

  const inputs = tf.tensor(data.map((p) => [p.x, p.y])); // 输入值转tensor
  const labels = tf.tensor(data.map((p) => p.label)); // 输出值转tensor

  await model.fit(inputs, labels, {
    batchSize: 40, // 一次训练40个数据(点)10次训练就是一个epochs
    epochs: 20, // 训练轮数
    callbacks: tfvis.show.fitCallbacks(
      // 可视化模拟训练过程
      { name: '训练过程' },
      ['loss'] // 制定度量单位(制作损失曲线)
    ),
  });
  $('#test')
    .removeAttr('disabled')
    .on('click', function() {
      const pred = model.predict(
        tf.tensor([[$('#x').val() * 1, $('#y').val() * 1]]) // * 1是js转number的一种方法
      );
      alert(`预测结果:${pred.dataSync()[0]}`);
    });
};

# 重点笔记

  • scatterplot 渲染多种类别的点时候数据为嵌套数组scatterplot

  • 带有激活函数的的单个神经元可以解决二分类问题

  • 值具有线性关系的二分类问题同样可以用 dense 层解决

  • 激活函数之 sigmoid,目的是将输出值压缩到 0-1 之间

参考文献

参考文献

  • 重点理解如何将特征数量为 2 的数据转化为 tensor,如 tf.tensor([1,2],[3,4],[5,6])

  • 需要注意预测的时候因为 inputShape 为 2,所以格式应该是 tf.tensor([[val1, val2]]) 因为本身就要求是一个[]