文章出處
文章列表
一、加載數據(正樣本、負樣本特征)
def loadSimpData(): #樣本特征 datMat = matrix([[ 1. , 2.1, 0.3], [ 2. , 1.1, 0.4], [ 1.3, 1. , 1.2], [ 1. , 1. , 1.1], [ 2. , 1. , 1.3], [ 7. , 2. , 0.35]]) #正負樣本標志 classLabels = [1.0, 1.0, 1.0, -1.0, -1.0, -1.0] return datMat,classLabels
如上,總共有6個訓練樣本(前三個為正樣本,后三個為負樣本),每個樣本總共有3個特征,以上6個樣本的特征值如下:
正樣本1:[ 1. , 2.1, 0.3]
正樣本2:[ 2. , 1.1, 0.4]
正樣本3:[ 1.3, 1. , 1.2]
負樣本1:[ 1. , 1. , 1.1]
負樣本2:[ 2. , 1. , 1.3]
負樣本3:[ 7. , 2. , 0.35]
二、訓練一個弱分類器(選出一個特征和其對應的閾值)
訓練弱分類器的過程就是從已有的特征中選出一個特征以及其對應的閾值,使樣本分錯的錯誤率最低,即尋找一個最小分錯率的過程。
- 最小錯誤率初始化為無窮大;
- 遍歷樣本的所有特征(本例子每個樣本有三個特征,即遍歷這三個特征值);
- 求出該特征值步長(不同特征不一樣),(最大特征值-最小特征值)/步長移動次數,如本例,假設步長移動次數為10,則第一個特征步長為(7-1)/10 = 0.6;
- 根據特征值步長開始從最小特征值遍歷到最大特征值;
- 遍歷判斷符號,大于還是小于;
- 計算出閾值(根據最小特征值及步長),根據閾值、符號、及特征索引、開始對樣本分類;
- 根據每個樣本權重以及分類結果計算分錯率,若該分錯率小于最小分錯率,則更新最小分錯率;
- 返回最小分錯率下的特征索引、符號、閾值,即得到弱分類器。
代碼實現如下:
def buildStump(datMat,classLabels,D): dataMatrix = mat(datMat); labelMat = mat(classLabels).T m,n = shape(dataMatrix) numSteps = 10.0; bestStump = {}; bestClasEst = mat(zeros((m,1))) minError = inf #最小錯誤率初始化為無窮大 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): 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 if weightedError < minError: minError = weightedError bestClasEst = predictedVals.copy() bestStump['dim'] = i bestStump['thresh'] = threshVal bestStump['ineq'] = inequal return bestStump,minError,bestClasEst
三、訓練結果
弱分類器結果:
特征索引:0
符號:大于
閾值:1.6000000000000001
最小分錯率:
0.33333333(可見單獨一個弱分類器在以上樣本中無法做到完全分對)
分類結果:
[ 1.]
[-1.](分錯)
[ 1.]
[ 1.] (分錯)
[-1.]
[-1.]
文章列表
全站熱搜