初學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...