I will keep doing researches in adversarial machine learning, so I need to master the basci knowledge stuff. I want to use this blog to record the important and interesting things.
Some repositories which can achieve useful information about how to learn Machine Learning or Tensorflow:
接下来,我将总结一下机器学习相关知识,并进行分析和反思。第一节主要根据《Machine Learning in Action》的内容,但是这书讲得太烂了,介绍算法混乱,定义不明确,代码过时并且意义不大,弃之。使用《统计学习方法》进行补充和继续。
1. 分类
1.1 基本概念
首先,什么是机器学习?机器学习是把无序的数据转换成有用的信息。无序的数据主要分为两种:数值型(浮点数)、多值型(整数)。而机器学习的主要任务包括回归(预测数值型数据)和分类(将数据划分到合适类别)。两者皆属于监督学习,及需要知道任务的答案。而无监督学习是在没有类别信息或目标值的情况下通过数据本身进行聚类。
接下来介绍一下机器学习的开发步骤:
(1)收集数据:通过把前人公开或者自行爬取的数据进行归纳总结,得到最原始的数据库。
(2)准备数据:根据机器学习的输入要求,把原始数据标准化以及数量化。
(3)分析数据:分析当前获得的数据是否合理,是否存在数据平衡性或数据量不足的问题。
(4)训练算法:挑选合适的机器学习算法或模型进行训练,并在训练过程中调整超参数。
(5)分析结果:分析实验结果的真实性,反复调整超参数和模型提高准确率或效果。
(6)可视化展示:通过图表或其他方式对实验结果进行分析展示。
目前主要的机器学习开发语言是Python,此外还会涉及到Numpy, Scipy, Matplotlib, Pandas等库进行补充。
1.2 KNN算法
K临近算法(K-Nearest-Neighbor)是通过比较数据的特征值之间的距离进行分类。该算法的优点是对异常值不明感,缺点是时间复杂度和空间复杂度高。具体来说,通过把数据特征量化后,根据特征的差异定义距离,将距离最近的数据设置成同一类别的过程。KNN算法的伪代码如下: (1)计算已知类别数据集中的所有点与当前需要分类点之间的距离;
(2)将所有点按距离远近从小到大排列;
(3)选取与当前点距离最近的K个点;
(4)确定这些点的类别,返回出现频率最高的点的类别作为预测结果;
比较基础的距离计算公式是计算欧式距离,即初中学习的两点间距离公式的多维度展开,具体公式如下:
\[distance=\sqrt{\sum_{i=0}^{n}(a_i-b_i)^2}\]显而易见,KNN算法并不一定能得到完全正确的预测结果,因此需要通过一些衡量标准来实现对算法效果的评估。一般来说,通过准确率可以较直观地了解分类器在某数据集上的效果,即准确率=分类正确个数/总个数。
在处理特征的过程中,需要对数据进行归一化处理,其公式如下:
\[newValue = \frac{oldValue-min}{max-min}\]通过该公式可以把原本取值范围极大的特征映射到0到1之间。
1.3 决策树
决策树是通过针对数据的特征进行划分并最终完成对数据的分类的一种树形结构,由结点和有向边组成。结点包括内部结点(表示特征或属性)和叶结点(类)。在判断如何划分数据时,需要引进信息熵或者基尼不纯度(Gini Impurity)等概念。
(1)信息熵,即信息的期望值。
对于\(x_i\)的信息定义为:\(l(x_i)=-log_{2}p(x_i)\)。其中\(p(x_i)\)表示该分类的概率。那么所以类别可能值包含的信息期望值:\(H=-\sum_{i=1}^np(x_i)log_2p(x_i)\)。因此,如果划分之后信息熵变大,则说明数据更加无序;相反如果熵值变低,则说明数据有序,分类合理。
(2)基尼不纯度:通过对信息熵定义中的\(log_2p(x_i)\)泰勒展开舍弃高阶小量得到。因此可以把基尼不纯度看作是熵的近似值。
\[Gini(X)=\sum_{x\in\chi}p(x)(1-p(x))\]目前主流的决策树包括:ID3、C4.5、CART、随机森林等。
1.4 朴素贝叶斯分类
贝叶斯分类,即以贝叶斯定理为基础进行分类,而朴素贝叶斯份额里则是其中有代表性的一种算法。
首先,概率论中通过贝叶斯法则可以计算条件概率。若要计算\(c\)在\(x\)情况下的概率,则可以使用如下公式:
\[\large{P(c|x)=\frac{p(x|c)p(c)}{p(x)}}\]而朴素贝叶斯分类则是通过计算概率来进行分类。
比如,在对文档进行分类时,\(w\)代表该文档的词向量,\(c_i\)表示把该文档归为\(i\)类,则公式为:
\[\large{P(c_i|w)=\frac{p(w|c_i)p(c_i)}{p(w)}}\]其中\(p(c_i)=\frac{i类文档数量}{文档总数量}\);假设文档中所有词出现概率相互独立,根据朴素贝叶斯假设,通过如下公式来简化计算: \(p(w\vert c_i)=p(w_0,w_1,\ldots ,w_n\vert c_i)=p(w_0\vert c_i)p(w_1\vert c_i)\ldots p(w_n\vert c_i)\);由于只需要比较概率大小,所以\(p(w)\)无需计算。
1.5 Logistic回归
1.6 支持向量机(SVM)
1.7 Adaboost元算法