这几天的时间里看了一下关于分类算法的一些知识,趁热打铁写下博客来拯救下记忆力不好的自己,话不读多说,马上开始!
先说一下前提的题设条件.假设我们现在有了一封邮件,那么我们应该怎么根据这个邮件里的一些关键的词语来给这个邮件进行分类呢?
首先我们先想可以用贝叶斯公式来进行处理:
c是一个详细的类别,比如”朋友的邮件”,”工作邮件”等等,而d就是一些关键的词语(注意:关键词可能会有多个),上边等式的左边是指:在给出当前的关键词的条件下,类型为C的概率,更多的情况就不详细说了,有兴趣的可以翻一下数理统计书.
接下来利用相关的统计学的知识对邮件进行处理(水平太菜了,就一切简化着来)
上面的这个NB的公式,就是最简化的参数公式了
下面给出相关参数的计算方法:
但是上边的第二个公式有以下缺点:
What if we have seen no training documents with the word fantastic and classified in the topic positive(thumbs-up)?
为了避免这一种情况,我们特地的给加上一些数
所以上述的这个问题就解决了.
现在我们举一个例子吧,这样可以加深理解
这个部分我也在继续学习,会将陆续更新!
———————————————我是华丽的分割线—————————————
现在用实际的代码来实现这个分类的问题吧.在这里我们会使用TensorFlow来解决分类的问题,以前的时候我写过关于线性回归的问题.相信看过的小伙伴可能在这里就会想这个回归的问题.那么这个回归和分类有什么区别可以值得说道说道.分类和回归的区别在我看来是在于输出变量的类型上.通俗理解上定量输出是回归,或者是连续变量的预测.定性的输出是一个分类,或者说是离散变量的预测,比如说是预测我们北京的放假会是一个回归的任务,但是把一堆水果分为苹果,桃,梨子这些区别,这其实就是一个分类的任务.
在这个例子中我们会使用的是MINIST数据库,MINIST是一个手写字体的数字库,长得大概是下边这个样子
现在我们导入MNIST数字库:
这个数据中大概是包含了55000张训练的图片,每个图片的分辨率大概是28*28,所以我们训练网络的输入实际上是一个784个的像素数据.
每张图片都表示一个数字,所以我们的输出是数字0到9,共10类。
prediction = add_layer(xs,784,10,activation_function=tf.nn.softmax)
调用add_layer函数构建一个只有输入输出层的简单的训练神经网络,其中输入的数据是784个特征,输出的是10个特征,激励的是使用softmax函数,大致结构类似这样:
loss函数(即最优化目标函数)选用交叉熵函数。交叉熵用来衡量预测值和真实值的相似程度,如果完全相同,它们的交叉熵等于零。
train方法这里使用的是梯度下降法:
现在开始train,每次只取100张图片,免得数据太多训练太慢。每训练50次输出一下预测精度
在经过10000次计算后我们得到结果: