电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python實現AdaBoost算法的示例

瀏覽:12日期:2022-07-09 10:53:04

代碼

’’’數據集:Mnist訓練集數量:60000(實際使用:10000)測試集數量:10000(實際使用:1000)層數:40------------------------------運行結果: 正確率:97% 運行時長:65m’’’import timeimport numpy as npdef loadData(fileName): ’’’ 加載文件 :param fileName:要加載的文件路徑 :return: 數據集和標簽集 ’’’ # 存放數據及標記 dataArr = [] labelArr = [] # 讀取文件 fr = open(fileName) # 遍歷文件中的每一行 for line in fr.readlines(): # 獲取當前行,并按“,”切割成字段放入列表中 # strip:去掉每行字符串首尾指定的字符(默認空格或換行符) # split:按照指定的字符將字符串切割成每個字段,返回列表形式 curLine = line.strip().split(’,’) # 將每行中除標記外的數據放入數據集中(curLine[0]為標記信息) # 在放入的同時將原先字符串形式的數據轉換為整型 # 此外將數據進行了二值化處理,大于128的轉換成1,小于的轉換成0,方便后續計算 dataArr.append([int(int(num) > 128) for num in curLine[1:]]) # 將標記信息放入標記集中 # 放入的同時將標記轉換為整型 # 轉換成二分類任務 # 標簽0設置為1,反之為-1 if int(curLine[0]) == 0: labelArr.append(1) else: labelArr.append(-1) # 返回數據集和標記 return dataArr, labelArrdef calc_e_Gx(trainDataArr, trainLabelArr, n, div, rule, D): ’’’ 計算分類錯誤率 :param trainDataArr:訓練數據集數字 :param trainLabelArr: 訓練標簽集數組 :param n: 要操作的特征 :param div:劃分點 :param rule:正反例標簽 :param D:權值分布D :return:預測結果, 分類誤差率 ’’’ # 初始化分類誤差率為0 e = 0 # 將訓練數據矩陣中特征為n的那一列單獨剝出來做成數組。因為其他元素我們并不需要, # 直接對龐大的訓練集進行操作的話會很慢 x = trainDataArr[:, n] # 同樣將標簽也轉換成數組格式,x和y的轉換只是單純為了提高運行速度 # 測試過相對直接操作而言性能提升很大 y = trainLabelArr predict = [] # 依據小于和大于的標簽依據實際情況會不同,在這里直接進行設置 if rule == ’LisOne’: L = 1 H = -1 else: L = -1 H = 1 # 遍歷所有樣本的特征m for i in range(trainDataArr.shape[0]): if x[i] < div: # 如果小于劃分點,則預測為L # 如果設置小于div為1,那么L就是1, # 如果設置小于div為-1,L就是-1 predict.append(L) # 如果預測錯誤,分類錯誤率要加上該分錯的樣本的權值(8.1式) if y[i] != L:e += D[i] elif x[i] >= div: # 與上面思想一樣 predict.append(H) if y[i] != H:e += D[i] # 返回預測結果和分類錯誤率e # 預測結果其實是為了后面做準備的,在算法8.1第四步式8.4中exp內部有個Gx,要用在那個地方 # 以此來更新新的D return np.array(predict), edef createSigleBoostingTree(trainDataArr, trainLabelArr, D): ’’’ 創建單層提升樹 :param trainDataArr:訓練數據集數組 :param trainLabelArr: 訓練標簽集數組 :param D: 算法8.1中的D :return: 創建的單層提升樹 ’’’ # 獲得樣本數目及特征數量 m, n = np.shape(trainDataArr) # 單層樹的字典,用于存放當前層提升樹的參數 # 也可以認為該字典代表了一層提升樹 sigleBoostTree = {} # 初始化分類誤差率,分類誤差率在算法8.1步驟(2)(b)有提到 # 誤差率最高也只能100%,因此初始化為1 sigleBoostTree[’e’] = 1 # 對每一個特征進行遍歷,尋找用于劃分的最合適的特征 for i in range(n): # 因為特征已經經過二值化,只能為0和1,因此分切分時分為-0.5, 0.5, 1.5三擋進行切割 for div in [-0.5, 0.5, 1.5]: # 在單個特征內對正反例進行劃分時,有兩種情況: # 可能是小于某值的為1,大于某值得為-1,也可能小于某值得是-1,反之為1 # 因此在尋找最佳提升樹的同時對于兩種情況也需要遍歷運行 # LisOne:Low is one:小于某值得是1 # HisOne:High is one:大于某值得是1 for rule in [’LisOne’, ’HisOne’]:# 按照第i個特征,以值div進行切割,進行當前設置得到的預測和分類錯誤率Gx, e = calc_e_Gx(trainDataArr, trainLabelArr, i, div, rule, D)# 如果分類錯誤率e小于當前最小的e,那么將它作為最小的分類錯誤率保存if e < sigleBoostTree[’e’]: sigleBoostTree[’e’] = e # 同時也需要存儲最優劃分點、劃分規則、預測結果、特征索引 # 以便進行D更新和后續預測使用 sigleBoostTree[’div’] = div sigleBoostTree[’rule’] = rule sigleBoostTree[’Gx’] = Gx sigleBoostTree[’feature’] = i # 返回單層的提升樹 return sigleBoostTreedef createBosstingTree(trainDataList, trainLabelList, treeNum=50): ’’’ 創建提升樹 創建算法依據“8.1.2 AdaBoost算法” 算法8.1 :param trainDataList:訓練數據集 :param trainLabelList: 訓練測試集 :param treeNum: 樹的層數 :return: 提升樹 ’’’ # 將數據和標簽轉化為數組形式 trainDataArr = np.array(trainDataList) trainLabelArr = np.array(trainLabelList) # 沒增加一層數后,當前最終預測結果列表 finallpredict = [0] * len(trainLabelArr) # 獲得訓練集數量以及特征個數 m, n = np.shape(trainDataArr) # 依據算法8.1步驟(1)初始化D為1/N D = [1 / m] * m # 初始化提升樹列表,每個位置為一層 tree = [] # 循環創建提升樹 for i in range(treeNum): # 得到當前層的提升樹 curTree = createSigleBoostingTree(trainDataArr, trainLabelArr, D) # 根據式8.2計算當前層的alpha alpha = 1 / 2 * np.log((1 - curTree[’e’]) / curTree[’e’]) # 獲得當前層的預測結果,用于下一步更新D Gx = curTree[’Gx’] # 依據式8.4更新D # 考慮到該式每次只更新D中的一個w,要循環進行更新知道所有w更新結束會很復雜(其實 # 不是時間上的復雜,只是讓人感覺每次單獨更新一個很累),所以該式以向量相乘的形式, # 一個式子將所有w全部更新完。 # 該式需要線性代數基礎,如果不太熟練建議補充相關知識,當然了,單獨更新w也一點問題 # 沒有 # np.multiply(trainLabelArr, Gx):exp中的y*Gm(x),結果是一個行向量,內部為yi*Gm(xi) # np.exp(-1 * alpha * np.multiply(trainLabelArr, Gx)):上面求出來的行向量內部全體 # 成員再乘以-αm,然后取對數,和書上式子一樣,只不過書上式子內是一個數,這里是一個向量 # D是一個行向量,取代了式中的wmi,然后D求和為Zm # 書中的式子最后得出來一個數w,所有數w組合形成新的D # 這里是直接得到一個向量,向量內元素是所有的w # 本質上結果是相同的 D = np.multiply(D, np.exp(-1 * alpha * np.multiply(trainLabelArr, Gx))) / sum(D) # 在當前層參數中增加alpha參數,預測的時候需要用到 curTree[’alpha’] = alpha # 將當前層添加到提升樹索引中。 tree.append(curTree) # -----以下代碼用來輔助,可以去掉--------------- # 根據8.6式將結果加上當前層乘以α,得到目前的最終輸出預測 finallpredict += alpha * Gx # 計算當前最終預測輸出與實際標簽之間的誤差 error = sum([1 for i in range(len(trainDataList)) if np.sign(finallpredict[i]) != trainLabelArr[i]]) # 計算當前最終誤差率 finallError = error / len(trainDataList) # 如果誤差為0,提前退出即可,因為沒有必要再計算算了 if finallError == 0: return tree # 打印一些信息 print(’iter:%d:%d, sigle error:%.4f, finall error:%.4f’ % (i, treeNum, curTree[’e’], finallError)) # 返回整個提升樹 return treedef predict(x, div, rule, feature): ’’’ 輸出單獨層預測結果 :param x: 預測樣本 :param div: 劃分點 :param rule: 劃分規則 :param feature: 進行操作的特征 :return: ’’’ # 依據劃分規則定義小于及大于劃分點的標簽 if rule == ’LisOne’: L = 1 H = -1 else: L = -1 H = 1 # 判斷預測結果 if x[feature] < div: return L else: return Hdef test(testDataList, testLabelList, tree): ’’’ 測試 :param testDataList:測試數據集 :param testLabelList: 測試標簽集 :param tree: 提升樹 :return: 準確率 ’’’ # 錯誤率計數值 errorCnt = 0 # 遍歷每一個測試樣本 for i in range(len(testDataList)): # 預測結果值,初始為0 result = 0 # 依據算法8.1式8.6 # 預測式子是一個求和式,對于每一層的結果都要進行一次累加 # 遍歷每層的樹 for curTree in tree: # 獲取該層參數 div = curTree[’div’] rule = curTree[’rule’] feature = curTree[’feature’] alpha = curTree[’alpha’] # 將當前層結果加入預測中 result += alpha * predict(testDataList[i], div, rule, feature) # 預測結果取sign值,如果大于0 sign為1,反之為0 if np.sign(result) != testLabelList[i]: errorCnt += 1 # 返回準確率 return 1 - errorCnt / len(testDataList)if __name__ == ’__main__’: # 開始時間 start = time.time() # 獲取訓練集 print(’start read transSet’) trainDataList, trainLabelList = loadData(’../Mnist/mnist_train.csv’) # 獲取測試集 print(’start read testSet’) testDataList, testLabelList = loadData(’../Mnist/mnist_test.csv’) # 創建提升樹 print(’start init train’) tree = createBosstingTree(trainDataList[:10000], trainLabelList[:10000], 40) # 測試 print(’start to test’) accuracy = test(testDataList[:1000], testLabelList[:1000], tree) print(’the accuracy is:%d’ % (accuracy * 100), ’%’) # 結束時間 end = time.time() print(’time span:’, end - start)

程序運行結果

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

以上就是python實現AdaBoost算法的示例的詳細內容,更多關于python實現AdaBoost算法的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 沈飞防静电地板__机房地板-深圳市沈飞防静电设备有限公司 | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 蒸压釜-陶粒板隔墙板蒸压釜-山东鑫泰鑫智能装备有限公司 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | 衬氟旋塞阀-卡套旋塞阀-中升阀门首页 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 | 浇注料-高铝砖耐火砖-郑州凯瑞得窑炉耐火材料有限公司 | 智慧水务|智慧供排水利信息化|水厂软硬件系统-上海敢创 | 数控走心机-走心机价格-双主轴走心机-宝宇百科 | 许昌奥仕达自动化设备有限公司| 电动高压冲洗车_价格-江苏速利达机车有限公司 | 东莞工作服_东莞工作服定制_工衣订做_东莞厂服 | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 旋转滴界面张力仪(张力测定仪器)-百科| 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | OpenI 启智 新一代人工智能开源开放平台 | 转子泵_凸轮泵_凸轮转子泵厂家-青岛罗德通用机械设备有限公司 | 铜镍-康铜-锰铜-电阻合金-NC003 - 杭州兴宇合金有限公司 | 博医通医疗器械互联网供应链服务平台_博医通 | 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 高铝砖-高铝耐火球-高铝耐火砖生产厂家-价格【荣盛耐材】 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 订做不锈钢_不锈钢定做加工厂_不锈钢非标定制-重庆侨峰金属加工厂 | 智能案卷柜_卷宗柜_钥匙柜_文件流转柜_装备柜_浙江福源智能科技有限公司 | 铆钉机|旋铆机|东莞旋铆机厂家|鸿佰专业生产气压/油压/自动铆钉机 | 换链神器官网-友情链接交换、购买交易于一体的站长平台 | 淋巴细胞分离液_口腔医疗器材-精欣华医疗器械(无锡)有限公司 | 泵阀展|阀门展|水泵展|流体机械展 -2025上海国际泵管阀展览会flowtech china | 福州甲醛检测-福建室内空气检测_环境检测_水质检测-福建中凯检测技术有限公司 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 石英粉,滑石粉厂家,山东滑石粉-莱州市向阳滑石粉有限公司 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 |