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
求出該特徵值步長(不同特徵不一樣),(最大特徵值-最小特徵值)/步長移動次數,如本例,假設步長移動次數為10,則第乙個特徵步長為(7-1)/10 = 0.6;
根據特徵值步長開始從最小特徵值遍歷到最大特徵值;
遍歷判斷符號,大於還是小於;
計算出閾值(根據最小特徵值及步長),根據閾值、符號、及特徵索引、開始對樣本分類;
根據每個樣本權重以及分類結果計算分錯率,若該分錯率小於最小分錯率,則更新最小分錯率;
返回最小分錯率下的特徵索引、符號、閾值,即得到弱分類器。
defbuildstump(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 =weightederror
bestclasest =predictedvals.copy()
beststump[
'dim
'] =i
beststump[
'thresh
'] =threshval
beststump[
'ineq
'] =inequal
return beststump,minerror,bestclasest
adaboost演算法分類器的訓練
經過多時的摸索,終於實現分類器的訓練。不敢保證每次都成功,但有一次實現,就可以把該注意的記錄下來 分類器的訓練分三步進行 第一步 收集材料 正負樣本材料的收集,本人是在灰度圖下進行實驗的。正樣本的大小最好一致,負樣本的大小沒有要求,只要內沒有目標就行。1.正樣本描述檔案 正樣本放在單獨的資料夾下,並...
分類器之adaboost
分類中通常使用將多個弱分類器組合成強分類器進行分類的方法,統稱為整合分類方法 ensemble method 比較簡單的如在boosting之前出現bagging的方法,首先從從總體樣本集合中抽樣採取不同的訓練集訓練弱分類器,然後使用多個弱分類器進行voting,終於的結果是分類器投票的優勝結果。這...
AdaBoost演算法 強分類器訓練過程
初始化權重 負樣本權重w0i 1 2m,正樣本權重w1i 1 2l,其中m為負樣本總數,l為正樣本總數 對於t 1,t t為訓練次數 權重歸一化,簡單說就是使本輪所有樣本的權重的和為1 根據每乙個特徵訓練簡單分類器,僅使用乙個特徵 從所有簡單分類器中選出乙個分錯率最低的分類器,為弱分類器 更新權重 ...