无监督学习–聚类算法
聚类算法是一种无监督学习算法,监督学习指的是我们的训练数据有一系列标签,我们通过假设函数去拟合它,而在无监督学习中,我们的数据不带有任何标签
聚类的定义
将物理或抽象的对象的集合分组成为由类似的对象组成的多个类的过程被称为聚类。 同一类中的对象之间具有较高的相似度,而不同类中的对象差别较大。
注:相似度是基于描述对象的属性计算的,计算是对对象之间距离进行计算
`长路漫漫,唯剑作伴`
1、决策树是一种分类器,是一个有向、无环树。
2、树中根节点没有父节点,一个节点可以有1-2个或者没有子节点。
3、每个叶节点都对应一个类别标识C的值;每个内部节点都对应一个用于分割数据集的属性Xi,称为分割属性;每个内部节点都有一个分割判断规则qj
。
4、节点n的分割属性和分割判断规则组成了节点n的分割标准。
1、决策树原理:归纳推理
2、归纳:是从特殊到一般的过程
3、归纳推理:从若干个事实表现出的特征、特性或属性中,通过比较、总结、概括而得出一个规律性的结论。
4、归纳推理的基本假定:任一假设如果能在足够大的训练样本集中很好地逼近目标函数,则它也能在未见样本中很好地逼近目标函数。
• 是一种统计学分类方法
• 可以用来对一个未知的样本判定其属于特定类的概率
• 分类模型是在有指导的学习下获得
• 分类算法可与决策树和神经网络算法媲美
• 用于大型数据库时具有较高的分类准确率和高效率。
朴素贝叶斯分类的假设前提:类别C确定的情况下,不同属性(X1,X2)间是相互独立的,即条件独立。(朴素即为条件独立)
即:C确定下,P(X1,X2)=P(X1)P(X2) ;或表示为:P(X1,X2|C)=P(X1|C)P(X2|C)
设X是未知类别的数据样本(属性值已知),H为假定:X属于某特定类的类C。分类问题即为,确定P(H|X)——给定观测数据样本X,假定H成立的概率。
后验概率:P(H|X),在条件X下,H的后验概率
先验概率:P(H)
注:P(X/H)相当于已知带标签的数据,即有导师了。
换个表达形式就会明朗很多:
啤酒与尿布的故事:
在美国,一些年轻的父亲下班后经常要到超市去买婴儿尿布,超市也因此发现了一个规律,在购买婴儿尿布的年轻的父亲们中,有30%~40%的人同时要买一些啤酒。超市随后调整了货架的摆放,将尿布和啤酒放在一起,因此,明显增加了销售额。
1、兴趣度度量的概念
挖掘出的模式(规律的表示形式)的简洁性、确定性和实用性即为兴趣度度量。
2、兴趣度度量的必要性
大量的数据 –> 挖掘出大量的规则 –> 规则一小部分是用户感兴趣的 –> 有必要进行兴趣度度量
3、兴趣度度量方法
简洁性度量:模式的便于人理解的度量
确定性度量:模式的可信性
方法:对于关联规则,确定性度量使用置信度。
设A和B为项目集合,A与B关联的规则A–>B的置信度定义为:
置信度(A–>B)= 同时包含A和B的元组数/包含A的元组数
举例:对某计算机商店购买物品的相关情况进行挖掘,得到一个置信度为85%的关联规则:
buys(X,”computer”) –> buys(X,”printer”)
意味着买计算机的顾客85%也买打印机。A的元组数为买计算机的事务数(顾客数),同时包含A和B的元组数为买计算机同时又买打印机的事务数(顾客数)。
实用性度量:模式的有用性
方法:对于关联规则,实用性度量使用支持度。
设A和B为项目集合,A与B关联的规则A”B的支持度定义为:
支持度(A–>B)= 同时包含A和B的元组数/元组总数
举例:对某计算机商店购买物品的相关情况进行挖掘,得到一个支持度为30%的关联规则:
buys(X,”computer”) –> buys(X,”printer”)
意味着该计算机商店的所有顾客的30%同时购买了计算机和打印机。元组总数为购买计算机或购买打印机的事务数(顾客数),同时包含A和B的元组数为买计算机同时又买打印机的事务数(顾客数)。
关于训练损失不下降,根据我的一些经验和理论知识,可以从以下角度来分析
首先,从数据集来分析:
其次,从数据预处理来分析:
最后,从模型结构和参数来分析:
激活函数、损失函数是否选错了?
优化器和学习速率不合适,需要调整;
模型结构太简单,学习能力不够;
正则化过度,L1、L2和dropout
是用来防止过拟合的,如果训练集loss下不来时,就要考虑一下是不是正则化过度,导致模型欠拟合;
Batch_Size过大会导致收敛很慢,损失下降也就很慢,给人一种训练损失不下降的感觉;
模型训练遇到瓶颈
这里的瓶颈一般包括:梯度消失、大量神经元失活、梯度爆炸和弥散、学习率过大或过小等。
Pytorch
识别字符验证码之前已经学习过利用Keras
搭建神经网络模型来识别字符验证码,近期又学习了pytorch
实现卷积神经网络相关的技术,正好遇到一个验证码识别的需求,所以尝试使用pytorch
来实现。
要训练的验证码如下所示:
其为中文汉字的简单运算,实际上仅包括零壹贰叁肆伍陆柒捌玖加减乘等于,这15个汉字,等于可以不识别(其实识别也完全没问题,只不过问题能简化就尽量简化嘛),那最后也就是总共要识别13个汉字,分类数就是13。
另外我们可以用’0123456789+-x’来代替汉字,避免文件名称无法使用汉字(windows下open-cv不能读取带有中文路径或文件名称)的问题。
下载并标注了1000张验证码,观察其字体颜色和干扰线、点均多变,无法根据特定规则将其区分;另外,尝试中值模糊、均值模糊和高斯模糊,均得不到较好的效果(肉眼观察)。只有灰度化和二值化后,感觉稍微变得清晰了一些。
另外,针对数据集我还统计了一下各个类别的数量是否均衡(主要怕有的文字训练样本太少,训练效果差)。
1 | {'捌': 206, '减': 346, '肆': 220, '柒': 205, '零': 200, '伍': 214, '加': 358, |
数据集的分布情况如上数据,总体还算均衡,那就表示可以开始处理数据和进行训练了。
参考文章:https://xiaobaibubai.blog.csdn.net/article/details/115862743
GitHub项目:https://github.com/meijieru/crnn.pytorch
预训练模型下载地址:https://pan.baidu.com/s/1pLbeCND
CRNN 全称为 Convolutional Recurrent Neural Network,主要用于端到端地对不定长的文本序列进行识别,不用先对单个文字进行切割,而是将文本识别转化为时序依赖的序列学习问题,就是基于图像的序列识别。
该算法出自An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Secene Text Recognition
,这篇文章来自华中科技大学白翔团队,并在2017年被人工智能顶级期刊《TPAMI》收录。
之前对yolov3
学习了挺多,包括Keras
和Pytorch
版本的框架代码都有使用过,而且还针对网易易盾的滑块验证码做过训练和识别,因为整体上所有滑块仅可看作一类目标,所以任务比较简单;接下来打算对网易易盾的文字点选验证码进行尝试,其中又分为有语序要求和无语序要求的两类。
无语序要求的就是一张验证码图片上给4~5个字,然后再给你三个字,让你按顺序点击。
有语序要求的就是一张验证码图片上给4~5个字,但是不再直接给出让你点击的文字,而是让你根据语义顺序点击,一般是一个成语(词语)或古诗(古文里的句子,比如这里”感时花溅泪”),成语的话比较简单,利用结巴分词一般就可以解决,古诗不太好弄。