标签:
=====================================================================
github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python
算法实现均采用Python 如需转载请注明出处,谢谢





#加载数据集
def loadSimData():
datMat = matrix([[1.0 , 2.1],
[2. , 1.1],
[1.3 , 1. ],
[1. , 1. ],
[2. , 1. ]])
classLabels = [1.0, 1.0, -1.0, -1.0, 1.0]
return datMat,classLabels
#main函数
if __name__=="__main__":
#加载数据集
datMat,classLabels = loadSimData()
print "datMat:",datMat
print "classLabels:",classLabels
#单层决策树生成函数
def stumpClassify(dataMatrix, dimen,threshVal, threshInsq):
retArray = ones((shape(dataMatrix)[0],1))
if threshInsq == 'lt':
retArray[dataMatrix[:,dimen] <= threshVal] = -1.0
else:
retArray[dataMatrix[:,dimen] > threshVal] = -1.0
return retArray
def buildStump(dataArr,classLabels,D):
dataMatrix = mat(dataArr)
#matrix必须是二维的,numpy可以是多维的
labelMat = mat(classLabels).T #.T表示转置矩阵
m,n = shape(dataMatrix) #给定数据集的行列数
numSteps = 10.0 #变用于在特征的所有可能值上进行遍历
bestStump = {} #字典用于存储给定权重向量0时所得到的最佳单层决策树的相关信息
bestClassEnt = mat(zeros((m,1)))
minError = inf #首先将minError初始化为正无穷大
for i in range(n):
rangeMin = dataMatrix[:,i].min()
rangeMax = dataMatrix[:,i].max()
stepSize = (rangeMax-rangeMin)/numSteps
for j in range(-1,int(numSteps)+1):
#lt :小于,lte,le:小于等于
#gt:大于,,gte,ge:大于等于
#eq:等于 ne,neq:不等于
for inequal in ['lt','gt']:
threshVal = (rangeMin + float(j) * stepSize)
predictedVals = stumpClassify(dataMatrix,i,threshVal, inequal)
errArr = mat(ones((m,1)))
errArr[predictedVals==labelMat]=0
weightedError = D.T * errArr #计算加权错误概率
print "split: dim %d, thresh % .2f, thresh inequal: %s, the weighted error is %.3f" % (i, threshVal,inequal,weightedError)
#更新bestStump中保存的最佳单层决策树的相关信息
if weightedError < minError:
minError = weightedError
bestClassEnt = predictedVals.copy()
bestStump['dim'] = i
bestStump['thresh'] = threshVal
bestStump['ineq'] = inequal
return bestStump,minError,bestClassEnt
#单层决策树生成函数
D = mat(ones((5,1))/5)
print buildStump(datMat, classLabels, D)

#基于单层决策树的AdaBoost训练过程
#numIt:迭代次数,默认为40
def adaBoostTrainDS(dataArr,classLabels,numIt=40):
weakClassArr = []
m= shape(dataArr)[0]
D = mat(ones((m,1))/m)
aggClassEst = mat(zeros((m,1)))
#迭代
for i in range(numIt):
#调用单层决策树
bestStump,error,classEst = buildStump(dataArr, classLabels, D)
print "D:",D.T #打印D的转置矩阵
alpha = float(0.5 * log((1.0 - error) / max(error,1e-16)))
bestStump['alpha'] = alpha
weakClassArr.append(bestStump)
print "classEst:",classEst.T
#为下一次迭代计算D
expon = multiply(-1 * alpha * mat(classLabels).T,classEst)
D = D /D.sum()
#错误率累加计算
aggClassEst += alpha* classEst
print "aggClassEst:",aggClassEst.T
aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T, ones((m,1)))
errorRate = aggErrors.sum()/m
print "total error:",errorRate
#如果不发生错误,返回
if errorRate == 0.0:
break
return weakClassArr #基于单层决策树的Adaboost训练过程
classifierArray = adaBoostTrainDS(datMat, classLabels, 9)
print classifierArray

#AdaBoost分类函数
#输入参数为待分类样例datToClass和多个弱分类器classifierArr
def adaClassify(datToClass,classifierArr):
dataMatrix = mat(datToClass)
m = shape(dataMatrix)[0]
aggClassEst = mat(zeros((m,1)))
for i in range(len(classifierArr)):
classEst = stumpClassify(dataMatrix,classifierArr[i]['dim'], classifierArr[i]['thresh'], classifierArr[i]['ineq'])
aggClassEst+= classifierArr[i]['alpha'] * classEst
print aggClassEst
return sign(aggClassEst)#测试AdaBoost分类函数
print "[0,0]:\n",adaClassify([0,0], classifierArray)
print "\n\n[[5,5],[0,0]]:\n",adaClassify([[5,5],[0,0]], classifierArray)


标签:
原文地址:http://blog.csdn.net/gamer_gyt/article/details/51372309