一、Best First Search
1.介绍
最佳优先搜索(Best First Search),是一种启发式搜索算法(Heuristic Algorithm),我们也可以将它看做广度优先搜索算法的一种改进;最佳优先搜索算法在广度优先搜索的基础上,用启发估价函数对将要被遍历到的点进行估价,然后选择代价小的进行遍历,直到找到目标节点或者遍历完所有点,算法结束。
2.图解
Figure-1
Figure-2
假设我们现在有一棵树如Figure-1所示,A是根节点,L节点是我们的目标节点,假设我们已有启发估价函数,最佳优先搜索过程将会如Figure-2所示(右边数字为估价值),节点的遍历顺序会是A-5->B-4->C-4->H-3->G-4->L-3(这里的估价值是由我们假定的估价函数算出,实际情况估价值不一定为图示),找到L节点,算法结束。
3.实现
要实现最佳优先搜索我们必须使用一个优先队列(priority queue)来实现,通常采用一个open优先队列和一个closed集,open优先队列用来储存还没有遍历将要遍历的节点,而closed集用来储存已经被遍历过的节点。
最佳优先搜索的过程可以被描述为:
- 将根节点放入优先队列open中。
- 从优先队列中取出优先级最高的节点X。
- 根据节点X生成子节点Y:
3.1. X的子节点Y不在open队列或者closed中,由估价函数计算出估价值,放入open队列中。
3.2. X的子节点Y在open队列中,且估价值优于open队列中的子节点Y,将open队列中的子节点Y的估价值替换成新的估价值并按优先值排序。
3.3. X的子节点Y在closed集中,且估价值优于closed集中的子节点Y,将closed集中的子节点Y移除,并将子节点Y加入open优先队列。 - 将节点X放入closed集中。
- 重复过程2,3,4直到目标节点找到,或者open为空,程序结束。
Figure-2中的过程为:
- open = [A-5]; closed = [];
- open = [B-4, C-4, D-6]; closed = [A-5];
- open = [C-4, E-5, F-5, D-6]; closed = [A-5, B-4];
- open = [H-3, G-4, E-5, F-5, D-6]; closed = [A-5, B-4, C-4];
- open = [G-4, E-5, F-5, D-6]; closed = [A-5, B-4, C-4, H-3];
- open = [L-3, E-5, F-5, D-6]; closed = [A-5, B-4, C-4, H-3, G-4];
- 找到目标节点L,程序结束。
4.启发估价函数
在介绍中说到了,最佳优先搜索是一种启发式搜索算法。而什么是启发式搜索算法呢?
当我们在状态空间中搜索的时候,最简单的方法就是穷举,在之前文章提及到的广度优先搜索和深度优先搜索都属于穷举类型的搜索,这种搜索方法有一个很大的缺点,就是在状态空间十分大的时候效率非常的差,因为需要穷举的状态太多了。而启发式搜索就是对状态空间中的每个搜索的位置(如图中的节点)进行一个评估,然后选出最好的位置。而在启发估价中使用到的函数我们称之为启发估价函数。
启发估价函数:f(n) = g(n) + h(n),其中
- n为现在所在的节点,g(n)为从起始点到点n的实际代价,h(n)为从点n到目标点的估价。
我们要怎么去实现估价函数呢?
在本文章的第一个例子当中仅给出了估价值而没有给出估价方法只是为了更简单的描述出算法的过程,下面我们会举一些例子来说明怎么去实现估价函数。
假设我们有一串字符[CBAD],我们要将它转变成[ABCD],而每次只能相邻的字母做一次交换。
我们令估价函数中g(n)实际遍历的代价,h(n)为字母不在自己目标位置上的数目。估价将如Figure-3所示(图中每个节点左侧[****]表示状态,右侧数字表示为f(n) = g(n) + h(n)):
Figure-3
此时最佳优先搜索的遍历顺序为:[CBAD]->[CBDA]->[CABD]->[BCAD]->[ACBD]->[ABCD]。
当然你也可以使用别的估价函数,具体问题得具体分析,这里只是给出一种估价方法。
5.补充
A算法:最佳优先搜索算法我们也称为A算法(algorithm A)。
可采纳性(Admissibility):一个搜索算法如果能找到最短路径(也就是最优解),我们称这个算法为可采纳的。
A星算法:一个可采纳的A算法,我们称为A星算法(A* algorithm)。
单调性:如果一个启发估价函数满足以下条件,我们称这个估价函数是单调的:
1.对于任意的节点ni,nj,nj为ni的子节点:
h(ni) – h(nj) <= cost(ni,nj),
cost(ni,nj)为ni节点到nj节点的实际耗费。2.目标节点的估价为0,h(goal) = 0。
贪婪最佳优先搜索(Greedy Best-First Search):在估价函数当中,当h(n)比g(n)大很多,此时仅有h(n)对估价起作用是,我们称这种算法为贪婪最佳优先搜索。
二、Re-sampling
本上是平衡的。需要提醒的是,boosting方法也可以被递归地使用,
即对分量分类器本身也进行boosting。用这种方式,可以获得非常小的
分类误差率。甚至,在类别之间可分的情况下可以达到零误差。
随机欠采样(RUS)减少多数实例的数量,以获得更平衡的数据分布。它从少数派类中选择所有的实例。假设在少数类中有m个实例,它从大多数类中随机选择大约m个实例替换。最后,得到了一个平衡子集,其中正实例数与负实例数相近。
相反,ROS(随机过采样)增加少数派类实例的数量,以获得更平衡的数据分布。大多数类的实例都被选中,然后进行随机抽样替换,从少数类中选择实例,直到所选实例与大多数类中的实例相等。
smote 过采样算法
JAIR'2002的文章《SMOTE: Synthetic Minority Over-sampling Technique》提出了一种过采样算法SMOTE。概括来说,本算法基于“插值”来为少数类合成新的样本。下面介绍如何合成新的样本。
设训练集的一个少数类的样本数为 TT ,那么SMOTE算法将为这个少数类合成 NT 个新样本。这里要求 N 必须是正整数,如果给定的 N<1 那么算法将“认为”少数类的样本数 T=NT ,并将强制 N=1 。
考虑该少数类的一个样本 i ,其特征向量为 xi,i∈{1,...,T} :
1.首先从该少数类的全部 T 个样本中找到样本 xi 的 k 个近邻(例如用欧氏距离),记为 xi(near),near∈{1,...,k} ;
2.然后从这 k 个近邻中随机选择一个样本 xi(nn) ,再生成一个 0 到 1 之间的随机数 ζ1 ,从而合成一个新样本 xi1 :
xi1=xi+ζ1⋅(xi(nn)−xi)
3. 将步骤2重复进行 N 次,从而可以合成 N 个新样本:xinew,new∈1,...,N。
那么,对全部的 T 个少数类样本进行上述操作,便可为该少数类合成 NT 个新样本。
如果样本的特征维数是 2 维,那么每个样本都可以用二维平面上的一个点来表示。SMOTE算法所合成出的一个新样本 xi1 相当于是表示样本 xi 的点和表示样本 xi(nn) 的点之间所连线段上的一个点。所以说该算法是基于“插值”来合成新样本。