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函数和分类的概率分布等价。
举一个例子吧: