逻辑回归实现多分类

hello,今天天气好冷,而且还下雨。不过很符合初春的季节。

好雨知时节,当春乃发生。。。。。(忘了。)

今天想跟大家聊聊deeplearning 的逻辑回归分类问题,虽然这视乎是一个基础的问题。但说起来好像还有许多的意义(好冷,先躲进被窝里)。

tools:node + tf.js

假定有如下的二维物体分布

从直观上看,a ,b , c各为一类,从肉眼上我们很容易给他们之间的关系划清界限。但是如果是计算机自己从这些数据中去自主的划分他们,那么要如何做呢。还有一点假设在这个分布中增加若干数量物体,那么他们应该从属哪一类呢(w,n,z)?或者说是预测。

那么我们如何来做呢?(直接上代码)

tip:(逻辑回归是机器学习常见的模型,逻辑回归一般分两步:a,更线性回归模型形式相同,一个关于输入x的函数。b,将线性函数转换成非线性函数)

const tf =require("@tensorflow/tfjs-node");

function logistic_regression(tran_data,tran_label) {

const numIterations=100;//迭代学习次数

const learningRate=0.1;//学习率

const optimizer=tf.train.adam(learningRate);

//构造一个使用adam算法的优化器

const number_of_labels=Array.from(new Set(tran_label)).length;

//从set集合中构建array(它将剔除重复的项)

const number_of_data=tran_label.length;

//训练的数据长度

const w=tf.variable(tf.zeros([2,number_of_labels]));

const b=tf.variable(tf.zeros([number_of_labels]));

//z=w^t+b

const train_x=tf.tensor2d(tran_data);

//train_x:二维矩阵,每一个分布的点的数据由(x,y)坐标组成的二元数组[x,y]

const train_y=tf.tensor1d(tran_label,"int32");

//train_y:每一个点的分类

function predict(x) {

//预测函数,尽可能的拟合观测的数据,也希望那些未被观测的数据,尽可能符合该函数

return tf.softmax(tf.add(tf.matMul(x,w),b));

// tf.softmax:给出logits,计算softmax标准化向量。

// tf.matMul(x,w):矩阵x 乘 矩阵w

//softmax和逻辑回归的关系

//看文末(给你一种豁然开朗的感觉)

}

function loss(predictions,labels) {

//损失函数:交叉熵->Li=-log((e^fˇ(yi))/(Eˇje^j))

const y=tf.oneHot(labels,number_of_labels);

const entropy=tf.mean(tf.sub(tf.scalar(1),tf.sum(tf.mul(y,tf.log(predictions)),1)));

//oneHot: 如[0,0,1,1,2,2]将被转化成

[[1,0,0],

[1,0,0].

[0,1,0],

[0,1,0],

[0,0,1],

[0,0,1]]

return entropy;

}

for(let iter=0;iter

//开始‘学习’

optimizer.minimize(()=>{

//最小化:()=>{...(也就是下面这部分)}

const loss_var=loss(predict(train_x),train_y);

loss_var.print();

return loss_var;

});

}

return function (x) {

const d=tf.tensor2d(x);

var predict_result=predict(d);

//这个将返回一个函数给外面(想想我们经过了漫长的训练,我们求得了一个最佳的拟合函数,假设这个函数为y=ax+b,其中a,b已经是一已知的,那么如果我们代入x,不就可以求得y了吗)

return predict_result.argMax(1).dataSync();

//argMax(1):返回最大的数字所在的下标(下标这里即代表所属类别)

}

}

//集合1 下面是他的所属类别 0 其他如此类推

let type1=[[1.0,1.0],[2.0,1.0],[2.0,2.0],[3.0,2.0],[3.0,3.0]];

let label1=[0,0,0,0,0];

let type2=[[2.0,4.0],[2.0,5.0],[3.0,4.0],[3.0,5.0],[4.0,5.0]];

let label2=[1,1,1,1,1];

let type3=[[4.0,2.0],[4.0,3.0],[5.0,2.0],[5.0,3.0],[6.0,3.0]];

let label3=[2,2,2,2,2];

let tempdata=type1.concat(type2).concat(type3);

let temelabel=label1.concat(label2).concat(label3);

let v=logistic_regression(tempdata,temelabel);

那么假定集合1的分布如下:

那么求k,的所属类别:

let k=[[2.0,3.0]];

let value=v(k);

console.log("类别:"+value.toLocaleString());

输出:

softmax和逻辑回归的关系

softmax函数可以把它的输入,它的输入通常被称为Logits有时也被叫做logit scores,会被处理成0-1之间。并且能够把输入

归一到和为1,那么这就意味着softmax函数和分类的概率分布等价。

举一个例子吧:

你可能感兴趣的:(逻辑回归实现多分类)