python adaboost的簡單實現

2021-08-10 15:31:16 字數 3674 閱讀 5450

初學adaboost,自己嘗試著寫了下adaboost的實現,這個實現以幾個簡單的數字作為訓練樣本,當然,這些數字是帶標籤的。然後嘗試著使用adaboost對其分類。對於10個帶標籤的數字,分類他們只需要3個左右的弱分類器級聯,組成乙個強分類器就可以完全正確的分類。如果**本身沒有bug的話,adaboost的表現的確驚豔。

另外,pathon也是初學,很多的程式設計思路和c,c++類似,總之,各方面有待提高。但是因為**能很好的分類樣本,其結果還是令人興奮的。

adaboost的教程非常多了,再次就不多做廢話了。

一下是完整的**。python是3.5.2版本的,如果版本沒什麼問題,貼上複製應該就可以執行。

import cv2

import numpy as np

import math

import matplotlib.pyplot as plt

defbuilddatasandlables

(): data = [23,12,3,54,89,2,43,7,45,26]

label = [1, 1,-1,-1,-1,1,1, -1, -1,1,]

return (data,label)

defcalweakclassfyouput

(input,weakclassy):

# 在期望範圍的數為1,否則為-1

if weakclassy[0] == "left":

# left的時候,如果小於閾值,則輸出1,否則,輸出0

if input < weakclassy[1] :

return

1elif input >= weakclassy[1]:

return -1

elif weakclassy[0] == "right":

# right的時候,如果大於閾值,則輸出1,否則,輸出0

if input > weakclassy[1] :

return

1elif input <= weakclassy[1]:

return -1

#訓練弱分類器

deftrainweakclassfy

(data,label,w):

#訓練若分類器的方式:找到乙個閾值,把data分成兩部分,使得錯誤率最小

weakclassy =

#將每個data中的資料作為閾值,判斷以該值作為閾值的誤差率,這樣需要判斷len(data)次

for m in data:

for direct in ["left","right"]:

i = 0

error = 0

for mm in data:

#在期望範圍的數為1,否則為-1

if direct == "left":

#left的時候,如果小於閾值,則對應的label應該為1,如果為-1,則錯了,需要增加錯誤率

if mm < m and label[i]==-1:

error += w[i]

elif mm >= m and label[i]==1:

error += w[i]

elif direct == "right":

# right的時候,如果大於閾值,則對應的label應該為1,如果為-1,則錯了,需要增加錯誤率

if mm > m and label[i]==-1:

error += w[i]

elif mm <= m and label[i]==1:

error += w[i]

i += 1

#從所有的弱分類器中選擇出錯誤率最低的

bestweakclassfy =

for classfy in weakclassy:

ifnot bestweakclassfy:

bestweakclassfy = classfy

else:

if classfy[2]2]:

bestweakclassfy = classfy

return bestweakclassfy

defadaboosttrain

(desaccuracy,maxweakclassfynum):

#首先獲取訓練資料

data,label = builddatasandlables()

#初始化權重為1/n

w = np.ones((len(data),1))/len(data)

weakclassfys =

accuracy = 0

for num in range(maxweakclassfynum):

#首先訓練弱分類器

weakclassfy = trainweakclassfy(data, label, w)

#其次,計算該分類器的話語權

weight = 0.5*math.log(((1-weakclassfy[2])/weakclassfy[2]))

print("weight",weight)

print("weakclassfy",weakclassfy)

#然後更新訓練樣本的權重

midw = np.zeros(w.shape)

for i in range(len(w)):

midw[i] = w[i]*math.exp(-calweakclassfyouput(data[i],weakclassfy)*label[i]*weight)

zt = np.sum(midw)

for i in range(len(w)):

w[i] = midw[i]/zt

#左右檢驗輸出是否達標

i = 0

accuracy = 0

for d in data:

result = 0

for classfy in weakclassfys:

result += classfy[3]*calweakclassfyouput(d,classfy)

if result > 0 :

result = 1

else:

result = -1

if result == label[i]:

accuracy += 1/len(data)

i += 1

print("accuracy",accuracy)

print("num",num)

if accuracy >= desaccuracy:

break

adaboosttrain(0.98,10)

結果如下:

weight 0.6931471805599453

weakclassfy ['left', 45, 0.20000000000000001]

accuracy 0.7999999999999999

num0

weight 0.5493061443340549

weakclassfy ['left', 3, 0.25]

accuracy 0.7999999999999999

num1

weight 0.8047189562170503

weakclassfy ['right', 7, 0.16666666666666666]

accuracy 0.9999999999999999

num2

container of 的的的原理

另外一篇,同樣精彩,揭開linux核心中container of的神秘面紗 華清遠見嵌入式學院講師。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。我們先來分析一下container of p...

存在的就是合理的,發生的即是必然的。

筆者有時候會想,什麼是對,什麼是錯?對於追求某一件事情之前首先會考慮,為什麼我要做這件事情。所以經過自我分析和生活周邊環境的總結。我認為,對於乙個人來,這是在站在個體的角度上說。什麼是對的?就是你自己覺得是對的,它就是對的。不過這個只是你自己的想法。主觀上的正確,不代表客觀上也受到了別人的認可。就拿...

Apache的rewrite的重寫相關的引數

apache mod rewrite規則重寫的標誌一覽 使用mod rewrite時常用的伺服器變數 rewriterule規則表示式的說明 匹配任何單字元 chars 匹配字串 chars chars 不匹配字串 chars text1 text2 可選擇的字串 text1或text2 匹配0到1...