# 逻辑回归-二分类
逻辑回归解决的是分类问题
# 代码展示
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]]) 因为本身就要求是一个[]
← 归一化 多层神经网络(xor 问题) →