99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀簡單易學(xué)的機(jī)器學(xué)習(xí)算法—AdaBoost
簡單易學(xué)的機(jī)器學(xué)習(xí)算法—AdaBoost
2017-03-28
收藏

簡單易學(xué)的機(jī)器學(xué)習(xí)算法—AdaBoost

一、集成方法(Ensemble Method)

集成方法主要包括Bagging和Boosting兩種方法,隨機(jī)森林算法是基于Bagging思想的機(jī)器學(xué)習(xí)算法,在Bagging方法中,主要通過對訓(xùn)練數(shù)據(jù)集進(jìn)行隨機(jī)采樣,以重新組合成不同的數(shù)據(jù)集,利用弱學(xué)習(xí)算法對不同的新數(shù)據(jù)集進(jìn)行學(xué)習(xí),得到一系列的預(yù)測結(jié)果,對這些預(yù)測結(jié)果做平均或者投票做出最終的預(yù)測。AdaBoost算法和GBDT(Gradient Boost Decision Tree,梯度提升決策樹)算法是基于Boosting思想的機(jī)器學(xué)習(xí)算法。在Boosting思想中是通過對樣本進(jìn)行不同的賦值,對錯誤學(xué)習(xí)的樣本的權(quán)重設(shè)置的較大,這樣,在后續(xù)的學(xué)習(xí)中集中處理難學(xué)的樣本,最終得到一系列的預(yù)測結(jié)果,每個預(yù)測結(jié)果有一個權(quán)重,較大的權(quán)重表示該預(yù)測效果較好,詳細(xì)的思想可見博文“簡單易學(xué)的機(jī)器學(xué)習(xí)算法——集成方法(Ensemble Method)”。

二、AdaBoost算法思想

AdaBoost算法是基于Boosting思想的機(jī)器學(xué)習(xí)算法,其中AdaBoost是Adaptive Boosting的縮寫,AdaBoost是一種迭代型的算法,其核心思想是針對同一個訓(xùn)練集訓(xùn)練不同的學(xué)習(xí)算法,即弱學(xué)習(xí)算法,然后將這些弱學(xué)習(xí)算法集合起來,構(gòu)造一個更強(qiáng)的最終學(xué)習(xí)算法。
為了構(gòu)造出一個強(qiáng)的學(xué)習(xí)算法,首先需要選定一個弱學(xué)習(xí)算法,并利用同一個訓(xùn)練集不斷訓(xùn)練弱學(xué)習(xí)算法,以提升弱學(xué)習(xí)算法的性能。在AdaBoost算法中,有兩個權(quán)重,第一個數(shù)訓(xùn)練集中每個樣本有一個權(quán)重,稱為樣本權(quán)重,用向量D表示;另一個是每一個弱學(xué)習(xí)算法具有一個權(quán)重,用向量A表示。假設(shè)有N個樣本的訓(xùn)練集,初始時,設(shè)定每個樣本的權(quán)重是相等的,即,利用第一個弱學(xué)習(xí)算法對其進(jìn)行學(xué)習(xí),學(xué)習(xí)完成后進(jìn)行錯誤率的統(tǒng)計:

其中,表示被錯誤分類的樣本數(shù)目,表示所有樣本的數(shù)目。這樣便可以利用錯誤率計算弱學(xué)習(xí)算法的權(quán)重

在第一次學(xué)習(xí)完成后,需要重新調(diào)整樣本的權(quán)重,以使得在第一分類中被錯分的樣本的權(quán)重,使得在接下來的學(xué)習(xí)中可以重點對其進(jìn)行學(xué)習(xí):

其中,表示對第個樣本訓(xùn)練正確,表示對第個樣本訓(xùn)練錯誤。是一個歸一化因子:

這樣進(jìn)行第二次的學(xué)習(xí),當(dāng)學(xué)習(xí)t輪后,得到了t個弱學(xué)習(xí)算法及其權(quán)重。對新的分類數(shù)據(jù),分別計算t個弱分類器的輸出,最終的AdaBoost算法的輸出結(jié)果為:

其中,是符號函數(shù)。具體過程可見下圖所示:

(圖片來自參考文件1)
三、AdaBoost算法流程

上述為AdaBoost的基本原理,下面給出AdaBoost算法的流程:

(來自參考文獻(xiàn)2)

四、實際的例子

AdaBoost算法是一種具有很高精度的分類器,其實AdaBoost算法提供的是一種框架,在這種框架下,我們可以使用不同的弱分類器,通過AdaBoost框架構(gòu)建出強(qiáng)分類器。下面我們使用單層決策樹構(gòu)建一個分類器處理如下的分類問題:

決策樹算法主要有ID3,C4.5和CART,其中ID3和C4.5主要用于分類,CART可以解決回歸問題。ID3算法可見博文“簡單易學(xué)的機(jī)器學(xué)習(xí)算法——決策樹之ID3算法”,CART算法可見博文“簡單易學(xué)的機(jī)器學(xué)習(xí)算法——CART之回歸樹”。對于單層決策樹是無法求解上面這樣的問題的。
Python代碼

python] view plain copy
#coding:UTF-8  
'''''
Created on 2015年6月15日
 
@author: zhaozhiyong
 
'''  
 
from numpy import *  
 
def loadSimpleData():  
    datMat = mat([[1., 2.1],  
                  [2., 1.1],  
                  [1.3, 1.],  
                  [1., 1.],  
                  [2., 1.]])  
    classLabels = mat([1.0, 1.0, -1.0, -1.0, 1.0])  
    return datMat, classLabels  
 
def singleStumpClassipy(dataMat, dim, threshold, thresholdIneq):  
    classMat = ones((shape(dataMat)[0], 1))  
    #根據(jù)thresholdIneq劃分出不同的類,在'-1'和'1'之間切換  
    if thresholdIneq == 'left':#在threshold左側(cè)的為'-1'  
        classMat[dataMat[:, dim] <= threshold] = -1.0  
    else:  
        classMat[dataMat[:, dim] > threshold] = -1.0  
      
    return classMat  
 
def singleStump(dataArr, classLabels, D):  
    dataMat = mat(dataArr)  
    labelMat = mat(classLabels).T  
    m, n = shape(dataMat)  
    numSteps = 10.0  
    bestStump = {}  
    bestClasEst = zeros((m, 1))  
    minError = inf  
    for i in xrange(n):#對每一個特征  
        #取第i列特征的最小值和最大值,以確定步長  
        rangeMin = dataMat[:, i].min()  
        rangeMax = dataMat[:, i].max()  
        stepSize = (rangeMax - rangeMin) / numSteps  
        for j in xrange(-1, int(numSteps) + 1):  
            #不確定是哪個屬于類'-1',哪個屬于類'1',分兩種情況  
            for inequal in ['left', 'right']:  
                threshold = rangeMin + j * stepSize#得到每個劃分的閾值  
                predictionClass = singleStumpClassipy(dataMat, i, threshold, inequal)  
                errorMat = ones((m, 1))  
                errorMat[predictionClass == labelMat] = 0  
                weightedError = D.T * errorMat#D是每個樣本的權(quán)重  
                if weightedError < minError:  
                    minError = weightedError  
                    bestClasEst = predictionClass.copy()  
                    bestStump['dim'] = i  
                    bestStump['threshold'] = threshold  
                    bestStump['inequal'] = inequal  
      
    return bestStump, minError, bestClasEst  
 
def adaBoostTrain(dataArr, classLabels, G):  
    weakClassArr = []  
    m = shape(dataArr)[0]#樣本個數(shù)  
    #初始化D,即每個樣本的權(quán)重  
    D = mat(ones((m, 1)) / m)  
    aggClasEst = mat(zeros((m, 1)))  
      
    for i in xrange(G):#G表示的是迭代次數(shù)  
        bestStump, minError, bestClasEst = singleStump(dataArr, classLabels, D)  
        print 'D:', D.T  
        #計算分類器的權(quán)重  
        alpha = float(0.5 * log((1.0 - minError) / max(minError, 1e-16)))  
        bestStump['alpha'] = alpha  
        weakClassArr.append(bestStump)  
        print 'bestClasEst:', bestClasEst.T  
          
        #重新計算每個樣本的權(quán)重D  
        expon = multiply(-1 * alpha * mat(classLabels).T, bestClasEst)  
        D = multiply(D, exp(expon))  
        D = D / D.sum()  
          
        aggClasEst += alpha * bestClasEst  
        print 'aggClasEst:', aggClasEst  
        aggErrors = multiply(sign(aggClasEst) != mat(classLabels).T, ones((m, 1)))  
        errorRate = aggErrors.sum() / m  
        print 'total error:', errorRate  
        if errorRate == 0.0:  
            break  
    return weakClassArr  
 
def adaBoostClassify(testData, weakClassify):  
    dataMat = mat(testData)  
    m = shape(dataMat)[0]  
    aggClassEst = mat(zeros((m, 1)))  
    for i in xrange(len(weakClassify)):#weakClassify是一個列表  
        classEst = singleStumpClassipy(dataMat, weakClassify[i]['dim'], weakClassify[i]['threshold'], weakClassify[i]['inequal'])  
        aggClassEst += weakClassify[i]['alpha'] * classEst  
        print aggClassEst  
    return sign(aggClassEst)  
              
if __name__ == '__main__':  
    datMat, classLabels = loadSimpleData()  
    weakClassArr = adaBoostTrain(datMat, classLabels, 30)  
    print "weakClassArr:", weakClassArr  
    #test  
    result = adaBoostClassify([1, 1], weakClassArr)  
    print result  


最終的決策樹序列:
weakClassArr: [{'threshold': 1.3, 'dim': 0, 'inequal': 'left', 'alpha': 0.6931471805599453}, {'threshold': 1.0, 'dim': 1, 'inequal': 'left', 'alpha': 0.9729550745276565}, {'threshold': 0.90000000000000002, 'dim': 0, 'inequal': 'left', 'alpha': 0.8958797346140273}]


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }