最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)AdaBoost算法的示例

 更新時(shí)間:2020年10月03日 09:47:22   作者:chenxiangzhen  
這篇文章主要介紹了python實(shí)現(xiàn)AdaBoost算法的示例,幫助大家更好的理解和了解機(jī)器學(xué)習(xí)算法,感興趣的朋友可以了解下

代碼

'''
數(shù)據(jù)集:Mnist
訓(xùn)練集數(shù)量:60000(實(shí)際使用:10000)
測(cè)試集數(shù)量:10000(實(shí)際使用:1000)
層數(shù):40
------------------------------
運(yùn)行結(jié)果:
  正確率:97%
  運(yùn)行時(shí)長:65m
'''

import time
import numpy as np


def loadData(fileName):
  '''
  加載文件
  :param fileName:要加載的文件路徑
  :return: 數(shù)據(jù)集和標(biāo)簽集
  '''
  # 存放數(shù)據(jù)及標(biāo)記
  dataArr = []
  labelArr = []
  # 讀取文件
  fr = open(fileName)
  # 遍歷文件中的每一行
  for line in fr.readlines():
    # 獲取當(dāng)前行,并按“,”切割成字段放入列表中
    # strip:去掉每行字符串首尾指定的字符(默認(rèn)空格或換行符)
    # split:按照指定的字符將字符串切割成每個(gè)字段,返回列表形式
    curLine = line.strip().split(',')
    # 將每行中除標(biāo)記外的數(shù)據(jù)放入數(shù)據(jù)集中(curLine[0]為標(biāo)記信息)
    # 在放入的同時(shí)將原先字符串形式的數(shù)據(jù)轉(zhuǎn)換為整型
    # 此外將數(shù)據(jù)進(jìn)行了二值化處理,大于128的轉(zhuǎn)換成1,小于的轉(zhuǎn)換成0,方便后續(xù)計(jì)算
    dataArr.append([int(int(num) > 128) for num in curLine[1:]])
    # 將標(biāo)記信息放入標(biāo)記集中
    # 放入的同時(shí)將標(biāo)記轉(zhuǎn)換為整型

    # 轉(zhuǎn)換成二分類任務(wù)
    # 標(biāo)簽0設(shè)置為1,反之為-1
    if int(curLine[0]) == 0:
      labelArr.append(1)
    else:
      labelArr.append(-1)
  # 返回?cái)?shù)據(jù)集和標(biāo)記
  return dataArr, labelArr


def calc_e_Gx(trainDataArr, trainLabelArr, n, div, rule, D):
  '''
  計(jì)算分類錯(cuò)誤率
  :param trainDataArr:訓(xùn)練數(shù)據(jù)集數(shù)字
  :param trainLabelArr: 訓(xùn)練標(biāo)簽集數(shù)組
  :param n: 要操作的特征
  :param div:劃分點(diǎn)
  :param rule:正反例標(biāo)簽
  :param D:權(quán)值分布D
  :return:預(yù)測(cè)結(jié)果, 分類誤差率
  '''
  # 初始化分類誤差率為0
  e = 0
  # 將訓(xùn)練數(shù)據(jù)矩陣中特征為n的那一列單獨(dú)剝出來做成數(shù)組。因?yàn)槠渌匚覀儾⒉恍枰?
  # 直接對(duì)龐大的訓(xùn)練集進(jìn)行操作的話會(huì)很慢
  x = trainDataArr[:, n]
  # 同樣將標(biāo)簽也轉(zhuǎn)換成數(shù)組格式,x和y的轉(zhuǎn)換只是單純?yōu)榱颂岣哌\(yùn)行速度
  # 測(cè)試過相對(duì)直接操作而言性能提升很大
  y = trainLabelArr
  predict = []

  # 依據(jù)小于和大于的標(biāo)簽依據(jù)實(shí)際情況會(huì)不同,在這里直接進(jìn)行設(shè)置
  if rule == 'LisOne':
    L = 1
    H = -1
  else:
    L = -1
    H = 1

  # 遍歷所有樣本的特征m
  for i in range(trainDataArr.shape[0]):
    if x[i] < div:
      # 如果小于劃分點(diǎn),則預(yù)測(cè)為L
      # 如果設(shè)置小于div為1,那么L就是1,
      # 如果設(shè)置小于div為-1,L就是-1
      predict.append(L)
      # 如果預(yù)測(cè)錯(cuò)誤,分類錯(cuò)誤率要加上該分錯(cuò)的樣本的權(quán)值(8.1式)
      if y[i] != L:
        e += D[i]
    elif x[i] >= div:
      # 與上面思想一樣
      predict.append(H)
      if y[i] != H:
        e += D[i]
  # 返回預(yù)測(cè)結(jié)果和分類錯(cuò)誤率e
  # 預(yù)測(cè)結(jié)果其實(shí)是為了后面做準(zhǔn)備的,在算法8.1第四步式8.4中exp內(nèi)部有個(gè)Gx,要用在那個(gè)地方
  # 以此來更新新的D
  return np.array(predict), e


def createSigleBoostingTree(trainDataArr, trainLabelArr, D):
  '''
  創(chuàng)建單層提升樹
  :param trainDataArr:訓(xùn)練數(shù)據(jù)集數(shù)組
  :param trainLabelArr: 訓(xùn)練標(biāo)簽集數(shù)組
  :param D: 算法8.1中的D
  :return: 創(chuàng)建的單層提升樹
  '''

  # 獲得樣本數(shù)目及特征數(shù)量
  m, n = np.shape(trainDataArr)
  # 單層樹的字典,用于存放當(dāng)前層提升樹的參數(shù)
  # 也可以認(rèn)為該字典代表了一層提升樹
  sigleBoostTree = {}
  # 初始化分類誤差率,分類誤差率在算法8.1步驟(2)(b)有提到
  # 誤差率最高也只能100%,因此初始化為1
  sigleBoostTree['e'] = 1

  # 對(duì)每一個(gè)特征進(jìn)行遍歷,尋找用于劃分的最合適的特征
  for i in range(n):
    # 因?yàn)樘卣饕呀?jīng)經(jīng)過二值化,只能為0和1,因此分切分時(shí)分為-0.5, 0.5, 1.5三擋進(jìn)行切割
    for div in [-0.5, 0.5, 1.5]:
      # 在單個(gè)特征內(nèi)對(duì)正反例進(jìn)行劃分時(shí),有兩種情況:
      # 可能是小于某值的為1,大于某值得為-1,也可能小于某值得是-1,反之為1
      # 因此在尋找最佳提升樹的同時(shí)對(duì)于兩種情況也需要遍歷運(yùn)行
      # LisOne:Low is one:小于某值得是1
      # HisOne:High is one:大于某值得是1
      for rule in ['LisOne', 'HisOne']:
        # 按照第i個(gè)特征,以值div進(jìn)行切割,進(jìn)行當(dāng)前設(shè)置得到的預(yù)測(cè)和分類錯(cuò)誤率
        Gx, e = calc_e_Gx(trainDataArr, trainLabelArr, i, div, rule, D)
        # 如果分類錯(cuò)誤率e小于當(dāng)前最小的e,那么將它作為最小的分類錯(cuò)誤率保存
        if e < sigleBoostTree['e']:
          sigleBoostTree['e'] = e
          # 同時(shí)也需要存儲(chǔ)最優(yōu)劃分點(diǎn)、劃分規(guī)則、預(yù)測(cè)結(jié)果、特征索引
          # 以便進(jìn)行D更新和后續(xù)預(yù)測(cè)使用
          sigleBoostTree['div'] = div
          sigleBoostTree['rule'] = rule
          sigleBoostTree['Gx'] = Gx
          sigleBoostTree['feature'] = i
  # 返回單層的提升樹
  return sigleBoostTree


def createBosstingTree(trainDataList, trainLabelList, treeNum=50):
  '''
  創(chuàng)建提升樹
  創(chuàng)建算法依據(jù)“8.1.2 AdaBoost算法” 算法8.1
  :param trainDataList:訓(xùn)練數(shù)據(jù)集
  :param trainLabelList: 訓(xùn)練測(cè)試集
  :param treeNum: 樹的層數(shù)
  :return: 提升樹
  '''
  # 將數(shù)據(jù)和標(biāo)簽轉(zhuǎn)化為數(shù)組形式
  trainDataArr = np.array(trainDataList)
  trainLabelArr = np.array(trainLabelList)
  # 沒增加一層數(shù)后,當(dāng)前最終預(yù)測(cè)結(jié)果列表
  finallpredict = [0] * len(trainLabelArr)
  # 獲得訓(xùn)練集數(shù)量以及特征個(gè)數(shù)
  m, n = np.shape(trainDataArr)

  # 依據(jù)算法8.1步驟(1)初始化D為1/N
  D = [1 / m] * m
  # 初始化提升樹列表,每個(gè)位置為一層
  tree = []
  # 循環(huán)創(chuàng)建提升樹
  for i in range(treeNum):
    # 得到當(dāng)前層的提升樹
    curTree = createSigleBoostingTree(trainDataArr, trainLabelArr, D)
    # 根據(jù)式8.2計(jì)算當(dāng)前層的alpha
    alpha = 1 / 2 * np.log((1 - curTree['e']) / curTree['e'])
    # 獲得當(dāng)前層的預(yù)測(cè)結(jié)果,用于下一步更新D
    Gx = curTree['Gx']
    # 依據(jù)式8.4更新D
    # 考慮到該式每次只更新D中的一個(gè)w,要循環(huán)進(jìn)行更新知道所有w更新結(jié)束會(huì)很復(fù)雜(其實(shí)
    # 不是時(shí)間上的復(fù)雜,只是讓人感覺每次單獨(dú)更新一個(gè)很累),所以該式以向量相乘的形式,
    # 一個(gè)式子將所有w全部更新完。
    # 該式需要線性代數(shù)基礎(chǔ),如果不太熟練建議補(bǔ)充相關(guān)知識(shí),當(dāng)然了,單獨(dú)更新w也一點(diǎn)問題
    # 沒有
    # np.multiply(trainLabelArr, Gx):exp中的y*Gm(x),結(jié)果是一個(gè)行向量,內(nèi)部為yi*Gm(xi)
    # np.exp(-1 * alpha * np.multiply(trainLabelArr, Gx)):上面求出來的行向量內(nèi)部全體
    # 成員再乘以-αm,然后取對(duì)數(shù),和書上式子一樣,只不過書上式子內(nèi)是一個(gè)數(shù),這里是一個(gè)向量
    # D是一個(gè)行向量,取代了式中的wmi,然后D求和為Zm
    # 書中的式子最后得出來一個(gè)數(shù)w,所有數(shù)w組合形成新的D
    # 這里是直接得到一個(gè)向量,向量內(nèi)元素是所有的w
    # 本質(zhì)上結(jié)果是相同的
    D = np.multiply(D, np.exp(-1 * alpha * np.multiply(trainLabelArr, Gx))) / sum(D)
    # 在當(dāng)前層參數(shù)中增加alpha參數(shù),預(yù)測(cè)的時(shí)候需要用到
    curTree['alpha'] = alpha
    # 將當(dāng)前層添加到提升樹索引中。
    tree.append(curTree)

    # -----以下代碼用來輔助,可以去掉---------------
    # 根據(jù)8.6式將結(jié)果加上當(dāng)前層乘以α,得到目前的最終輸出預(yù)測(cè)
    finallpredict += alpha * Gx
    # 計(jì)算當(dāng)前最終預(yù)測(cè)輸出與實(shí)際標(biāo)簽之間的誤差
    error = sum([1 for i in range(len(trainDataList)) if np.sign(finallpredict[i]) != trainLabelArr[i]])
    # 計(jì)算當(dāng)前最終誤差率
    finallError = error / len(trainDataList)
    # 如果誤差為0,提前退出即可,因?yàn)闆]有必要再計(jì)算算了
    if finallError == 0:
      return tree
    # 打印一些信息
    print('iter:%d:%d, sigle error:%.4f, finall error:%.4f' % (i, treeNum, curTree['e'], finallError))
  # 返回整個(gè)提升樹
  return tree


def predict(x, div, rule, feature):
  '''
  輸出單獨(dú)層預(yù)測(cè)結(jié)果
  :param x: 預(yù)測(cè)樣本
  :param div: 劃分點(diǎn)
  :param rule: 劃分規(guī)則
  :param feature: 進(jìn)行操作的特征
  :return:
  '''
  # 依據(jù)劃分規(guī)則定義小于及大于劃分點(diǎn)的標(biāo)簽
  if rule == 'LisOne':
    L = 1
    H = -1
  else:
    L = -1
    H = 1

  # 判斷預(yù)測(cè)結(jié)果
  if x[feature] < div:
    return L
  else:
    return H


def test(testDataList, testLabelList, tree):
  '''
  測(cè)試
  :param testDataList:測(cè)試數(shù)據(jù)集
  :param testLabelList: 測(cè)試標(biāo)簽集
  :param tree: 提升樹
  :return: 準(zhǔn)確率
  '''
  # 錯(cuò)誤率計(jì)數(shù)值
  errorCnt = 0
  # 遍歷每一個(gè)測(cè)試樣本
  for i in range(len(testDataList)):
    # 預(yù)測(cè)結(jié)果值,初始為0
    result = 0
    # 依據(jù)算法8.1式8.6
    # 預(yù)測(cè)式子是一個(gè)求和式,對(duì)于每一層的結(jié)果都要進(jìn)行一次累加
    # 遍歷每層的樹
    for curTree in tree:
      # 獲取該層參數(shù)
      div = curTree['div']
      rule = curTree['rule']
      feature = curTree['feature']
      alpha = curTree['alpha']
      # 將當(dāng)前層結(jié)果加入預(yù)測(cè)中
      result += alpha * predict(testDataList[i], div, rule, feature)
    # 預(yù)測(cè)結(jié)果取sign值,如果大于0 sign為1,反之為0
    if np.sign(result) != testLabelList[i]: 
      errorCnt += 1
  # 返回準(zhǔn)確率
  return 1 - errorCnt / len(testDataList)


if __name__ == '__main__':
  # 開始時(shí)間
  start = time.time()

  # 獲取訓(xùn)練集
  print('start read transSet')
  trainDataList, trainLabelList = loadData('../Mnist/mnist_train.csv')

  # 獲取測(cè)試集
  print('start read testSet')
  testDataList, testLabelList = loadData('../Mnist/mnist_test.csv')

  # 創(chuàng)建提升樹
  print('start init train')
  tree = createBosstingTree(trainDataList[:10000], trainLabelList[:10000], 40)

  # 測(cè)試
  print('start to test')
  accuracy = test(testDataList[:1000], testLabelList[:1000], tree)
  print('the accuracy is:%d' % (accuracy * 100), '%')

  # 結(jié)束時(shí)間
  end = time.time()
  print('time span:', end - start)

程序運(yùn)行結(jié)果

start read transSet
start read testSet
start init train
iter:0:40, sigle error:0.0804, finall error:0.0804
iter:1:40, sigle error:0.1448, finall error:0.0804
iter:2:40, sigle error:0.1362, finall error:0.0585
iter:3:40, sigle error:0.1864, finall error:0.0667
iter:4:40, sigle error:0.2249, finall error:0.0474
iter:5:40, sigle error:0.2634, finall error:0.0437
iter:6:40, sigle error:0.2626, finall error:0.0377
iter:7:40, sigle error:0.2935, finall error:0.0361
iter:8:40, sigle error:0.3230, finall error:0.0333
iter:9:40, sigle error:0.3034, finall error:0.0361
iter:10:40, sigle error:0.3375, finall error:0.0325
iter:11:40, sigle error:0.3364, finall error:0.0340
iter:12:40, sigle error:0.3473, finall error:0.0309
iter:13:40, sigle error:0.3006, finall error:0.0294
iter:14:40, sigle error:0.3267, finall error:0.0275
iter:15:40, sigle error:0.3584, finall error:0.0288
iter:16:40, sigle error:0.3492, finall error:0.0257
iter:17:40, sigle error:0.3506, finall error:0.0256
iter:18:40, sigle error:0.3665, finall error:0.0240
iter:19:40, sigle error:0.3769, finall error:0.0251
iter:20:40, sigle error:0.3828, finall error:0.0213
iter:21:40, sigle error:0.3733, finall error:0.0229
iter:22:40, sigle error:0.3785, finall error:0.0218
iter:23:40, sigle error:0.3867, finall error:0.0219
iter:24:40, sigle error:0.3850, finall error:0.0208
iter:25:40, sigle error:0.3823, finall error:0.0201
iter:26:40, sigle error:0.3825, finall error:0.0204
iter:27:40, sigle error:0.3874, finall error:0.0188
iter:28:40, sigle error:0.3952, finall error:0.0186
iter:29:40, sigle error:0.4018, finall error:0.0193
iter:30:40, sigle error:0.3889, finall error:0.0177
iter:31:40, sigle error:0.3939, finall error:0.0183
iter:32:40, sigle error:0.3838, finall error:0.0182
iter:33:40, sigle error:0.4021, finall error:0.0171
iter:34:40, sigle error:0.4119, finall error:0.0164
iter:35:40, sigle error:0.4093, finall error:0.0164
iter:36:40, sigle error:0.4135, finall error:0.0167
iter:37:40, sigle error:0.4099, finall error:0.0171
iter:38:40, sigle error:0.3871, finall error:0.0163
iter:39:40, sigle error:0.4085, finall error:0.0154
start to test
the accuracy is:97 %
time span: 3777.730945825577

以上就是python實(shí)現(xiàn)AdaBoost算法的示例的詳細(xì)內(nèi)容,更多關(guān)于python實(shí)現(xiàn)AdaBoost算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spark處理數(shù)據(jù)排序問題如何避免OOM

    Spark處理數(shù)據(jù)排序問題如何避免OOM

    這篇文章主要介紹了Spark處理數(shù)據(jù)排序問題如何避免OOM,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • python在pyqt5+logging+threading模塊實(shí)時(shí)顯示日志代碼示例

    python在pyqt5+logging+threading模塊實(shí)時(shí)顯示日志代碼示例

    這篇文章主要介紹了如何使用Python的PyQt5和logging模塊來實(shí)現(xiàn)日志的實(shí)時(shí)打印到界面上,避免主程序運(yùn)行時(shí)界面卡住,文章還提到了在執(zhí)行過程中可能遇到的異常及解決方法,需要的朋友可以參考下
    2024-11-11
  • Django多對(duì)多ManyToManyField字段的使用

    Django多對(duì)多ManyToManyField字段的使用

    Django是一個(gè)支持多對(duì)多關(guān)系的Web框架,可以在模型中定義多對(duì)多關(guān)系,本文主要介紹了Django多對(duì)多ManyToManyField字段的使用,感興趣的可以了解一下
    2023-12-12
  • 使用Python生成新春煙花效果的方法

    使用Python生成新春煙花效果的方法

    新春佳節(jié)到來之際,煙花的璀璨綻放象征著喜慶和熱鬧,如果能通過代碼在屏幕上生成煙花效果,既能增加節(jié)日的趣味,也能加深對(duì)編程的理解,本篇博客將詳細(xì)介紹如何使用Python生成新春煙花效果,包括實(shí)現(xiàn)原理、代碼解析以及常見問題的解決方案,需要的朋友可以參考下
    2025-01-01
  • Python3實(shí)時(shí)操作處理日志文件的實(shí)現(xiàn)

    Python3實(shí)時(shí)操作處理日志文件的實(shí)現(xiàn)

    本文主要介紹了Python3實(shí)時(shí)操作處理日志文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 基于Python實(shí)現(xiàn)圖片文字合成工具

    基于Python實(shí)現(xiàn)圖片文字合成工具

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)圖片文字合成工具,實(shí)現(xiàn)處理圖片文件、在圖片上添加文本等功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • 如何用python抓取B站數(shù)據(jù)

    如何用python抓取B站數(shù)據(jù)

    今天介紹一個(gè)獲取B站數(shù)據(jù)的Python擴(kuò)展庫-bilibili_api,對(duì)此感興趣的同學(xué),可以實(shí)驗(yàn)一下
    2021-05-05
  • pycharm終端安裝pytorch失敗的問題及解決

    pycharm終端安裝pytorch失敗的問題及解決

    這篇文章主要介紹了pycharm終端安裝pytorch失敗的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • django框架cookie和session用法實(shí)例詳解

    django框架cookie和session用法實(shí)例詳解

    這篇文章主要介紹了django框架cookie和session用法,結(jié)合實(shí)例形式詳細(xì)分析了Django框架cookie和session的功能、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • 從零學(xué)Python之hello world

    從零學(xué)Python之hello world

    從今天開始講陸續(xù)發(fā)布一系列python基礎(chǔ)教程,讓新手更快更好的入門。
    2014-05-05

最新評(píng)論

凌海市| 津市市| 互助| 景洪市| 沁源县| 辽宁省| 东海县| 海安县| 镇原县| 德钦县| 巩留县| 库尔勒市| 平安县| 巴东县| 长沙县| 德安县| 布尔津县| 六枝特区| 宁国市| 通江县| 陈巴尔虎旗| 博乐市| 岳西县| 黄梅县| 朝阳市| 扶绥县| 凌海市| 云霄县| 信阳市| 吉木乃县| 上杭县| 红河县| 双辽市| 桐城市| 会泽县| 邢台市| 湾仔区| 桃园市| 绥化市| 巴青县| 邵阳县|