美文网首页
逻辑回归实现多分类

逻辑回归实现多分类

作者: 与时间赛跑_ | 来源:发表于2019-03-20 22:05 被阅读0次

    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函数和分类的概率分布等价。

    举一个例子吧:

    相关文章

      网友评论

          本文标题:逻辑回归实现多分类

          本文链接:https://www.haomeiwen.com/subject/avyxvqtx.html