算法一:k-近邻算法
1、优缺点总结:
优点:精度高,对异常值不敏感,无数据输入假定
缺点:计算复杂度高、空间复杂度高
使用数据范围:数值型和标称型
2、算法流程:
K-近邻算法的一般流程
(1) 收集数据:可以使用任何方法;
(2) 准备数据:距离计算所需要的数据,最好是结构化的数据格式;
(3) 分析数据:可以使用任何方法;
(4) 训练算法:此步骤不适用于k-近邻算法;
(5) 测试算法:计算错误率;
(6) 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的结果。
3、实施knn算法
对未知类别属性的数据集中的每个点一次执行以下操作
(1) 计算已知类别数据集中的每个点与当前点之间的距离;
(2) 按照距离递增次序排序;
(3) 选取与当前点距离最小的k个点
(4) 确定前k个点所在类别的出现概率;
(5) 返回前k个点出现频率最高的类别做为当前点的预测分类。
算法二:决策树
1、 优缺点:
优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。
缺点:可能产生过度匹配问题
使用数据类型:数值型和标称型
2、 决策树的一般流程
(1) 收集数据:可以使用任何方法;
(2) 准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化;
(3) 分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期;
(4) 训练算法:构造树的数据结构;
(5) 测试算法:使用经验树计算错误率;
(6) 使用算法:此步骤可以适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。
主要使用公式:信息增益
划分数据集的最大原则是:将无序的数据变得更加有序
信息理论的鼻祖之一Claude E. Shannon把信息(熵)定义为离散随机事件的出现概率
组织杂乱无章数据的一种方法就是使用信息论度量信息,信息论是量化处理信息的分支科学
集合信息的度量方式称为香农熵或者简称为熵,名字来源于信息论之父克劳德.香农
熵(entropy)定义为:信息的期望,如果待分类的事物可能划分在多个分类之中,则符号xi的信息定义为:
一个信源发送出什么符号是不确定的,衡量它可以根据其出现的概率来度量。概率大,出现机会多,不确定性小;反之就大。
不确定性函数f是概率P的单调递降函数;两个独立符号所产生的不确定性应等于各自不确定性之和,即f(P1,P2)=f(P1)+f(P2),这称为可加性。同时满足这两个条件的函数f是对数函数,即
3、 示例:使用决策树预测隐形眼镜类型
(1) 收集数据:提供的文本文件;
(2) 准备数据:解析tab键分割的数据行
(3) 快速检查数据,确保正确地解析数据内容,使用createPlot()函数绘制最终的树形图
(4) 训练算法:使用3.1节的cretePlot()函数
(5) 测试算法:编写测试函数验证决策树可以正确分类给定的数据实例。
(6) 使用算法:存储树的数据结构,以便下次使用时无需重新构造树。
算法三:朴素贝叶斯:
1、 优缺点:
优点:在数据少的情况下仍然有效,可以处理多类别问题。
缺点:对于数据的准备方式较为敏感。
使用数据类型:标称型数据
2、 朴素贝叶斯的一般过程
(1) 收集数据:可以使用任何方法
(2) 准备数据:需要数值型或者布尔型数据。
(3) 分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好。
(4) 训练算法:计算不同的独立特征的条件概率。
(5) 测试算法:计算错误率。
(6) 使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本。
3、 示例:使用朴素贝叶斯对电子邮件进行分类
(1) 收集数据:提供文本文件。
(2) 准备数据:将文本解析成词条向量。
(3) 分析数据:检查词条确保解析的正确性。
(4) 训练算法:使用我们之前建立的trainNB0()函数
(5) 测试算法:使用classifyNB(),并且构建一个新的测试函数来计算文档集的错误率
(6) 使用算法:构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上。
朴素贝叶斯两个假设:
(1) 特征之间相互独立
(2) 特征同等重要
尽管上述假设有问题,但是贝叶斯的实际效果却很好,朴素贝叶斯仍然是一种有效的分类器。
通过特征之间的条件独立性假设,降低对数据量的需求(由N**t变为N*t个样本)
算法四:Logistic回归
4.1、Logistic回归的一般过程
1) 收集数据:采用任一方法收集数据;
2) 准备数据:由于需要进行距离计算,因此要求数据类型为数值型。另外结构化数据格式则最佳;
3) 分析数据:采用任意方法对数据进行分析;
4) 训练算法:大部分的时间将用于训练,训练的目的是为了找到最佳的分类回归系数。
5) 测试算法:一旦训练步骤完成,分类将会很快。
6) 使用算法:首先,我们需要输入一些数据,并将其转换成对应的结构化数值;
接着基于驯练好的回归系数就可以对这些数值进行简单的回归计算,判定它们属于哪个类别;在这之后,我们就可以在输出的类别上做一些其他分析工作。
4.2、Logistic回归的优缺点:
Ø 优点:计算代价不高,易于理解和实现。
Ø 缺点:容易欠拟合,分类精度可能不高。
Ø 使用数据类型:数值型和标称型数据。
4.3、使用Logistic回归估计马疝病的死亡率
1) 收集数据:给定数据文件
2) 准备收据:用python解析文本文件并填充缺失值;
3) 分析数据:可视化病观察数据。
4) 训练算法:使用优化算法,找到最佳的系数;
5) 测试算法:为了量化回归的效果,需要观察错误率。根据错误率决定是否回退到训练阶段,通过改变迭代的次数和步长等参数来得到更好地回归系数。
6) 使用算法:使用一个简单的命令行程序来收集马的症状并输出预测结果并非难事。
4.4、缺失值得一些可选的方法:
v 使用可用特征的均值来填充缺失值
v 使用特殊值来跳虫缺失值,如-1
v 忽略有缺失值得样本
v 使用相似样本的均值来添补缺失值
v 使用另外的机器学习算法预测缺失值
Sigmoid函数:
在信息科学中,由于其单增以及反函数单增等性质,Sigmoid函数常被用作神经网络的阈值函数,将变量映射到0,1之间
4.3、梯度上升法:
Gradient descent 又叫 steepest descent,是利用一阶的梯度信息找到函数局部最优解的一种方法,也是机器学习里面最简单最常用的一种优化方法。它的思想很简单,和我开篇说的那样,要找最小值,我只需要每一步都往下走(也就是每一步都可以让代价函数小一点),然后不断的走,那肯定能走到最小值的地方,例如下图所示:
但,我同时也需要更快的到达最小值啊,怎么办呢?我们需要每一步都找下坡最快的地方,也就是每一步我走某个方向,都比走其他方法,要离最小值更近。而这个下坡最快的方向,就是梯度的负方向了。
对logisticRegression来说,梯度下降算法新鲜出炉,如下:
其中,参数α叫学习率,就是每一步走多远,这个参数蛮关键的。如果设置的太多,那么很容易就在最优值附加徘徊,因为你步伐太大了
随机梯度下降SGD (stochastic gradient descent)
梯度下降算法在每次更新回归系数的时候都需要遍历整个数据集(计算整个数据集的回归误差),该方法对小数据集尚可。但当遇到有数十亿样本和成千上万的特征时,就有点力不从心了,它的计算复杂度太高。改进的方法是一次仅用一个样本点(的回归误差)来更新回归系数。这个方法叫随机梯度下降算法。由于可以在新的样本到来的时候对分类器进行增量的更新(假设我们已经在数据库A上训练好一个分类器h了,那新来一个样本x。对非增量学习算法来说,我们需要把x和数据库A混在一起,组成新的数据库B,再重新训练新的分类器。但对增量学习算法,我们只需要用新样本x来更新已有分类器h的参数即可),所以它属于在线学习算法。与在线学习相对应,一次处理整个数据集的叫“批处理”。
改进的随机梯度下降
对随机梯度下降算法,我们做两处改进来避免上述的波动问题:
1)在每次迭代时,调整更新步长alpha的值。随着迭代的进行,alpha越来越小,这会缓解系数的高频波动(也就是每次迭代系数改变得太大,跳的跨度太大)。当然了,为了避免alpha随着迭代不断减小到接近于0(这时候,系数几乎没有调整,那么迭代也没有意义了),我们约束alpha一定大于一个稍微大点的常数项,具体见代码。
2)每次迭代,改变样本的优化顺序。也就是随机选择样本来更新回归系数。这样做可以减少周期性的波动,因为样本顺序的改变,使得每次迭代不再形成周期性。
二. 模拟退火(SA,Simulated Annealing)思想
爬山法是完完全全的贪心法,每次都鼠目寸光的选择一个当前最优解,因此只能搜索到局部的最优值。模拟退火其实也是一种贪心算法,但是它的搜索过程引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。以图1为例,模拟退火算法在搜索到局部最优解A后,会以一定的概率接受到E的移动。也许经过几次这样的不是局部最优的移动后会到达D点,于是就跳出了局部最大值A。
模拟退火算法描述:
若J(Y(i+1) )>= J( Y(i) ) (即移动后得到更优解),则总是接受该移动
若J(Y(i+1) )< J( Y(i) ) (即移动后的解比当前解要差),则以一定的概率接受移动,而且这个概率随着时间推移逐渐降低(逐渐降低才能趋向稳定)
这里的“一定的概率”的计算参考了金属冶炼的退火过程,这也是模拟退火算法名称的由来。
根据热力学的原理,在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为:
P(dE) = exp( dE/(kT))
其中k是一个常数,exp表示自然指数,且dE<0。这条公式说白了就是:温度越高,出现一次能量差为dE的降温的概率就越大;温度越低,则出现降温的概率就越小。又由于dE总是小于0(否则就不叫退火了),因此dE/kT< 0 ,所以P(dE)的函数取值范围是(0,1) 。
随着温度T的降低,P(dE)会逐渐降低。
我们将一次向较差解的移动看做一次温度跳变过程,我们以概率P(dE)来接受这样的移动。
关于爬山算法与模拟退火,有一个有趣的比喻:
爬山算法:兔子朝着比现在高的地方跳去。它找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。
模拟退火:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高方向跳去。这就是模拟退火。