摘要:由于近期學(xué)業(yè)繁重,所以我就不說廢話了,直接上代碼運(yùn)行結(jié)果代碼使用二元切分法每次將數(shù)據(jù)集切成兩份如果數(shù)據(jù)的某特征值等于切分所要求的值,那么這些數(shù)據(jù)就進(jìn)入樹的左子樹,反之則進(jìn)入右子樹將每行映射成浮點(diǎn)數(shù)將文件中的所有數(shù)據(jù)都保存在同一個矩陣中參數(shù)數(shù)
由于近期學(xué)業(yè)繁重QAQ,所以我就不說廢話了,直接上代碼~
運(yùn)行結(jié)果 代碼from numpy import * #使用二元切分法——每次將數(shù)據(jù)集切成兩份 #如果數(shù)據(jù)的某特征值等于切分所要求的值, #那么這些數(shù)據(jù)就進(jìn)入樹的左子樹,反之則 # 進(jìn)入右子樹 def loadDataSet(fileName): dataMat=[] fr=open(fileName) for line in fr.readlines(): curLine=line.strip().split(" ") #將每行映射成浮點(diǎn)數(shù) fltLine=list(map(float,curLine)) dataMat.append(fltLine) #將文件中的所有數(shù)據(jù)都保存在同一個矩陣中 return dataMat #參數(shù):數(shù)據(jù)集,待切分的特征,該特征的某個值 def binSplitDataSet(dataSet,feature,value): #將數(shù)據(jù)集合切分得到兩個子集并返回 mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:] mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:] return mat0,mat1 #建立葉結(jié)點(diǎn)的函數(shù) #當(dāng)chooseBestSplit函數(shù)決定不再對數(shù)據(jù)集進(jìn)行切分時,將調(diào)用該regLeaf函數(shù) #來得到葉節(jié)點(diǎn)的模型。在回歸樹種,該模型其實(shí)就是目標(biāo)變量的均值 def regLeaf(dataSet): return mean(dataSet[:,-1]) #計算誤差的函數(shù)——這里計算的是總方差 def regErr(dataSet): #均方差函數(shù)var*數(shù)據(jù)集中樣本的個數(shù)=總方差 return var(dataSet[:,-1]) * shape(dataSet)[0] #給定某個誤差計算方法,該函數(shù)會找到數(shù)據(jù)集上最佳的二元切割方式 #(他遍歷所有的特征及可能的取值來找到使誤差最小化的切分閾值) #另外,該函數(shù)還要確定什么時候停止切分,一旦停止切分就會生成一個葉節(jié)點(diǎn) #errType為平方誤差的總值(總方差) def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)): #用戶指定的參數(shù),用于控制函數(shù)停止時機(jī) #tolS為誤差下降值,tolN為切分的最少樣本數(shù) tolS = ops[0]; tolN = ops[1] #如果所有值相等則退出 if len(set(dataSet[:,-1].T.tolist()[0])) == 1: #找不到一個“好”的二元切分,返回None并同時調(diào)用leafType來生成葉節(jié)點(diǎn) return None, leafType(dataSet) m,n = shape(dataSet) S = errType(dataSet) bestS = inf; bestIndex = 0; bestValue = 0 for featIndex in range(n-1): for splitVal in set((dataSet[:,featIndex].T.A.tolist())[0]): mat0, mat1 = binSplitDataSet(dataSet, featIndex, splitVal) if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): continue newS = errType(mat0) + errType(mat1) if newS < bestS: bestIndex = featIndex bestValue = splitVal bestS = newS #如果誤差減少不大則退出 if (S - bestS) < tolS: return None, leafType(dataSet) mat0, mat1 = binSplitDataSet(dataSet, bestIndex, bestValue) #如果切分出的數(shù)據(jù)集很小則退出 if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): return None, leafType(dataSet) #找到了一個“好”的切分方式,返回特征編號和切分特征值 #找到了最佳的切分方式:切分后能達(dá)到最低誤差的切分 return bestIndex,bestValue #構(gòu)建樹的函數(shù) #dataSet為數(shù)據(jù)集 #leafType為建立葉結(jié)點(diǎn)的函數(shù),errType為誤差計算函數(shù) #ops是一個包含書構(gòu)建所需其他參數(shù)的元組 def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)): #chooseBestSplit為切分函數(shù) #若滿足停止條件chooseBestSplit將返回None和某類模型的值 #如果構(gòu)建的是回歸樹,該模型是一個常數(shù),如果是模型樹,其 #模型是一個線性方程(回歸樹假設(shè)葉節(jié)點(diǎn)是常數(shù)值) #若不滿足停止條件,chooseBestSplit將創(chuàng)建一個新的python #字典,并將數(shù)據(jù)集分成兩份,在這兩份數(shù)據(jù)集上分別繼續(xù)遞歸調(diào) #用createTree函數(shù) feat,val=chooseBestSplit(dataSet,leafType,errType,ops) #滿足停止條件時返回葉節(jié)點(diǎn) if feat==None: return val retTree={} retTree["spInd"]=feat retTree["spVal"]=val #將數(shù)據(jù)集按照待分特征和該特征的某個值進(jìn)行二分操作 lSet,rSet=binSplitDataSet(dataSet,feat,val) #創(chuàng)建左右子樹 retTree["left"]=createTree(lSet,leafType,errType,ops) retTree["right"]=createTree(rSet,leafType,errType,ops) return retTree def drawFigure1(): # import matplotlib.pyplot as plt # myDat=loadDataSet("ex00.txt") # myMat=mat(myDat) # createTree(myMat) # plt.plot(myMat[:,0],myMat[:,1],"ro") # plt.show() import matplotlib.pyplot as plt myDat=loadDataSet("ex0.txt") myMat=mat(myDat) createTree(myMat) plt.plot(myMat[:,1],myMat[:,2],"ro") plt.show() def main(): drawFigure1() # myDat=loadDataSet("ex00.txt") # myMat=mat(myDat) # myTree=createTree(myMat) # print(myTree) #建立一個主對角線元素全為1的矩陣 #testMat=mat(eye(4)) #print(testMat) #要分割的特征位于第一列 #按照0.5去劃分 #mat0,mat1=binSplitDataSet(testMat,0,0.5) # print(mat0) # print(mat1) if __name__=="__main__": main()``` [1]: /img/bVbqGCZ
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43496.html
摘要:貢獻(xiàn)者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節(jié)拆開,再按照知識點(diǎn)合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻(xiàn)者:飛龍版...
摘要:機(jī)器學(xué)習(xí)算法類型從廣義上講,有種類型的機(jī)器學(xué)習(xí)算法。強(qiáng)化學(xué)習(xí)的例子馬爾可夫決策過程常用機(jī)器學(xué)習(xí)算法列表以下是常用機(jī)器學(xué)習(xí)算法的列表。我提供了對各種機(jī)器學(xué)習(xí)算法的高級理解以及運(yùn)行它們的代碼。決策樹是一種監(jiān)督學(xué)習(xí)算法,主要用于分類問題。 showImg(https://segmentfault.com/img/remote/1460000019086462); 介紹 谷歌的自動駕駛汽車和機(jī)...
摘要:主頁暫時下線社區(qū)暫時下線知識庫自媒體平臺微博知乎簡書博客園我們不是的官方組織機(jī)構(gòu)團(tuán)體,只是技術(shù)棧以及的愛好者合作侵權(quán),請聯(lián)系請抄送一份到預(yù)處理離散化等值分箱等量分箱獨(dú)熱標(biāo)準(zhǔn)化最小最大標(biāo)準(zhǔn)化歸一化特征選擇信息增益信息增益率模型驗(yàn)證評價指 【主頁】 apachecn.org 【Github】@ApacheCN 暫時下線: 社區(qū) 暫時下線: cwiki 知識庫 自媒體平臺 微博...
閱讀 899·2019-08-30 15:54
閱讀 1467·2019-08-30 15:54
閱讀 2402·2019-08-29 16:25
閱讀 1293·2019-08-29 15:24
閱讀 750·2019-08-29 12:11
閱讀 2507·2019-08-26 10:43
閱讀 1229·2019-08-26 10:40
閱讀 468·2019-08-23 16:24