1.Adaboost算法的思想:
Adaboost算法基于的思想有点儿“三个臭皮匠顶个诸葛亮”的味道:我们在处理复杂任务时,将多位专家的判断进行适当的综合所得到的判断,要比其中任一单独专家的判断好,正是基于这种思想,就有了我们今天要学的Adaboost算法。
Adaboost算法通过对所有样本点训练多个弱分类器,通过线性方式将其组合成一个强分类器。每个弱分类器都有一个权重参数,该参数与其对应弱分类器对所有样本点分类决策的错误率有关。
1.假设有数据集,其中接下来为每个样本点分配一个权重参数,初始时每个样本点的权重参数相同,接下来就是训练分类器,使该分类器有最小的错误率,并求得该分类器的错误率,通过错误率计算该分类器的权重系数:,将该分类器添加到强分类器中。然后更新每个样本点儿的权重
,然后重复之前的运算,得到第二个弱分类器,一次类推,直到弱分类器的错误率为零或者达到某个阈值停止计算。最后的强分类器就是由上面得出的弱分类器的线性组合而成
所以最终的分类器为
下面是《机器学习实战》上关于adaboost算法的代码,我自己在理解的基础上一步步敲上去的,并在一些地方做了注释,如果理解的不对,还让大家理解。
def loadSimpleData2():#加载数据集
datMat=np.matrix([[0],[1],[2],[3],[4],[5],[6],[7],[8],[9]])
classLabels=[1.0,1.0,1.0,-1.0,-1.0,-1.0,1.0,1.0,1.0,-1.0]
return datMat,classLabels
#dataMat为数据集,i为第i个特征,aa为第i个特征的某个特征值,inqe为'lt'(小于等于)或'gt'(大于)
#该函数的功能是:对第i个特征而言,将inqe aa的数据分到类别-1,其余的据保持类别1
def stumpClassify(dataMat, i, aa, inqe):
returnMat=np.mat(np.ones((np.shape(dataMat)[0],1)))
if inqe=='lt':
returnMat[dataMat[:,i]<=aa]=-1.0
else:returnMat[dataMat[:,i]>aa]=-1.0
#然后返回比较后的类别矩阵
return returnMat
#建立单层的决策树,选择错误率最低的弱分类器
def buildStump(dataSet,labels,D):
dataMat=np.mat(dataSet)
labelsMat=np.mat(labels).T
m,n=np.shape(dataMat)
bestClassz=np.mat(np.zeros((m,1)))
bestStump={}
numSteps=10.0
error=np.inf
#遍历每个特征
for i in range(n):
minData=dataMat[:,i].min()
maxData=dataMat[:,i].max()
ranges=(maxData-minData)/numSteps
#对第i个特征的取值顺序得按照一定的步数进行遍历
for j in range(-1,int(numSteps)+1):
for inqe in ['lt','gt']:
aa=minData+float(j)*ranges
newClassz=stumpClassify(dataMat,i,aa,inqe)
newerror=np.mat(np.ones((m,1)))
newerror[newClassz==labelsMat]=0
newerrs=D.T*newerror#错误率需要用权重去算
if newerrs