《機(jī)器學(xué)習(xí)技術(shù)》課件 第一章任務(wù)1.1 引入相關(guān)模塊_第1頁(yè)
《機(jī)器學(xué)習(xí)技術(shù)》課件 第一章任務(wù)1.1 引入相關(guān)模塊_第2頁(yè)
《機(jī)器學(xué)習(xí)技術(shù)》課件 第一章任務(wù)1.1 引入相關(guān)模塊_第3頁(yè)
《機(jī)器學(xué)習(xí)技術(shù)》課件 第一章任務(wù)1.1 引入相關(guān)模塊_第4頁(yè)
《機(jī)器學(xué)習(xí)技術(shù)》課件 第一章任務(wù)1.1 引入相關(guān)模塊_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

單元1任務(wù)1.1

機(jī)器學(xué)習(xí)任務(wù)1.11.引入相關(guān)模塊os庫(kù)是Python標(biāo)準(zhǔn)庫(kù),包含幾百個(gè)函數(shù),常用的是路徑操作、進(jìn)程管理、環(huán)境參數(shù)類型。os就是“operatingsystem”的縮寫,os模塊提供的就是各種Python程序與操作系統(tǒng)進(jìn)行交互的接口。使用os模塊,一方面,可以方便地與操作系統(tǒng)qq進(jìn)行交互;另一方面,可以極大地增強(qiáng)代碼的可移植性。NumPy(NumericalPython)是Python語(yǔ)言的一個(gè)擴(kuò)展程序庫(kù),支持大量的維度數(shù)組與矩陣運(yùn)算,也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫(kù)。代碼如下:importosimportnumpyasnp類用來(lái)描述具有相同屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法。對(duì)象是類的實(shí)例。1)重寫構(gòu)造函數(shù)2.定義Banknotes類任務(wù)1.1classBanknotes:

def__init__(self,feature_dir):

self.feature_dir=feature_dir#特征文件的路徑

self.features=None#特征值2)定義加載模型的方法任務(wù)1.1defload_model(self):

ifos.path.exists(self.feature_dir):

withopen(self.feature_dir,'r')asf:

line=f.readline().strip()

self.features=np.array(list(map(float,line.split(','))))

returnTrue

else:

path='/'.join(self.feature_dir.split('/')[:-1])

ifnotos.path.exists(path):

os.mkdir('model')

returnFalse04模型訓(xùn)練3)定義加載數(shù)據(jù)集的方法defload_dataset(self,dataset_path):

ifos.path.exists(dataset_path):#判斷數(shù)據(jù)集文件是否存在

withopen(dataset_path,'r')asf:#打開數(shù)據(jù)集文件

lines=f.readlines()#按行讀取所有數(shù)據(jù)

np.random.shuffle(lines)#按行打亂順序

train_inputs=[]#訓(xùn)練數(shù)據(jù)輸入

train_lables=[]#訓(xùn)練數(shù)據(jù)標(biāo)簽

test_inputs=[]#測(cè)試數(shù)據(jù)輸入

test_labels=[]#測(cè)試數(shù)據(jù)標(biāo)簽

forlineinlines[:int(len(lines)*0.8)]:#遍歷前80%的數(shù)據(jù),將其解析并放入訓(xùn)練集,每行前4個(gè)數(shù)據(jù)作為輸入數(shù)據(jù),最后1個(gè)數(shù)據(jù)作為標(biāo)簽

line_array=line.strip().split(',')

train_inputs.append([1.0,float(line_array[0]),float(line_array[1]),float(line_array[2]),float(line_array[3])])#數(shù)據(jù)

train_lables.append(int(line_array[4]))

forlineinlines[int(len(lines)*0.2):]:#遍歷后20%的數(shù)據(jù),將其解析并放入測(cè)試集,每行前4個(gè)數(shù)據(jù)作為輸入,最后1個(gè)數(shù)據(jù)作為標(biāo)簽

line_array=line.strip().split(',')

test_inputs.append([1.0,float(line_array[0]),float(line_array[1]),float(line_array[2]),float(line_array[3])])#數(shù)據(jù)

test_labels.append(int(line_array[4]))

#臨時(shí)保存訓(xùn)練集和驗(yàn)證集

self.train_dataset,self.test_dataset=[train_inputs,train_lables],[test_inputs,test_labels]04模型訓(xùn)練3)定義加載數(shù)據(jù)集的方法defload_dataset(self,dataset_path):

ifos.path.exists(dataset_path):#判斷數(shù)據(jù)集文件是否存在

withopen(dataset_path,'r')asf:#打開數(shù)據(jù)集文件

lines=f.readlines()#按行讀取所有數(shù)據(jù)

np.random.shuffle(lines)#按行打亂順序

train_inputs=[]#訓(xùn)練數(shù)據(jù)輸入

train_lables=[]#訓(xùn)練數(shù)據(jù)標(biāo)簽

test_inputs=[]#測(cè)試數(shù)據(jù)輸入

test_labels=[]#測(cè)試數(shù)據(jù)標(biāo)簽04模型訓(xùn)練3)定義加載數(shù)據(jù)集的方法forlineinlines[:int(len(lines)*0.8)]:#遍歷前80%的數(shù)據(jù),將其解析并放入訓(xùn)練集,每行前4個(gè)數(shù)據(jù)作為輸入數(shù)據(jù),最后1個(gè)數(shù)據(jù)作為標(biāo)簽

line_array=line.strip().split(',')

train_inputs.append([1.0,float(line_array[0]),float(line_array[1]),float(line_array[2]),float(line_array[3])])#數(shù)據(jù)

train_lables.append(int(line_array[4]))04模型訓(xùn)練forlineinlines[int(len(lines)*0.2):]:#遍歷后20%的數(shù)據(jù),將其解析并放入測(cè)試集,每行前4個(gè)數(shù)據(jù)作為輸入,最后1個(gè)數(shù)據(jù)作為標(biāo)簽

line_array=line.strip().split(',')

test_inputs.append([1.0,float(line_array[0]),float(line_array[1]),float(line_array[2]),float(line_array[3])])#數(shù)據(jù)

test_labels.append(int(line_array[4]))

#臨時(shí)保存訓(xùn)練集和驗(yàn)證集

self.train_dataset,self.test_dataset=[train_inputs,train_lables],[test_inputs,test_labels]3)定義加載數(shù)據(jù)集的方法04模型訓(xùn)練4)定義sigmoid函數(shù)/方法sigmoid函數(shù)是常見的S型函數(shù),也被稱為S型生長(zhǎng)曲線,由于其具有單調(diào)遞增、反函數(shù)單調(diào)遞增等性質(zhì),因此其常被用作神經(jīng)網(wǎng)絡(luò)的閾值函數(shù),將變量映射到0與1之間。函數(shù)的原型為sigmoid函數(shù)的圖像04模型訓(xùn)練#sigmoid函數(shù)即得分函數(shù),用于計(jì)算數(shù)據(jù)x的概率是0還是1。#若得到的y大于0.5,則概率是1;若得到的y小于或等于0.5,則概率是0

defsigmoid(self,x):

return1/(1+np.exp(-x))4)定義sigmoid函數(shù)/方法04模型訓(xùn)練5)定義代價(jià)函數(shù)/方法代價(jià)函數(shù),也叫損失函數(shù),它在機(jī)器學(xué)習(xí)的每種算法中都很重要,因?yàn)橛?xùn)練模型的過(guò)程就是優(yōu)化代價(jià)函數(shù)的過(guò)程,代價(jià)函數(shù)對(duì)每個(gè)參數(shù)的偏導(dǎo)數(shù)就是梯度下降算法中提到的梯度,為防止過(guò)擬合而添加的正則化項(xiàng)也是加在代價(jià)函數(shù)后面的。#代價(jià)函數(shù),hx是概率估計(jì)值,也是由sigmoid(x)得來(lái)的值;y是樣本真值

defcost(self,hx,y):

return-y*np.log(hx)-(1-y)*np.log(1-hx)04模型訓(xùn)練6)定義梯度下降算法微分單變量的微分,函數(shù)只有一個(gè)變量時(shí)多變量的微分,當(dāng)函數(shù)有多個(gè)變量的時(shí)候,即分別對(duì)每個(gè)變量進(jìn)行求微分04模型訓(xùn)練6)定義梯度下降算法梯度實(shí)際上就是多變量微分的一般化梯度就是分別對(duì)每個(gè)變量進(jìn)行微分,然后用逗號(hào)分割開,梯度是用<>包括起來(lái),說(shuō)明梯度其實(shí)一個(gè)向量。在單變量的函數(shù)中,梯度其實(shí)就是函數(shù)的微分,代表著函數(shù)在某個(gè)給定點(diǎn)的切線的斜率在多變量函數(shù)中,梯度是一個(gè)向量,向量有方向,梯度的方向就指出了函數(shù)在給定點(diǎn)的上升最快的方向。梯度的方向是函數(shù)在給定點(diǎn)上升最快的方向,那么梯度的反方向就是函數(shù)在給定點(diǎn)下降最快的方向04模型訓(xùn)練6)定義梯度下降算法此公式的意義是:J是關(guān)于Θ的一個(gè)函數(shù),我們當(dāng)前所處的位置為Θ0點(diǎn),要從這個(gè)點(diǎn)走到J的最小值點(diǎn)。首先我們先確定前進(jìn)的方向,也就是梯度的反向,然后走一段距離的步長(zhǎng),也就是α,走完這個(gè)段步長(zhǎng),就到達(dá)了Θ1這個(gè)點(diǎn)。04模型訓(xùn)練6)定義梯度下降算法#梯度下降,x是輸入數(shù)據(jù),y是標(biāo)簽集,learning_rate是學(xué)習(xí)率

defgradient(self,x,y,learning_rate):

m=len(y)#計(jì)算標(biāo)簽集的長(zhǎng)度

matrix_gradient=np.zeros(len(x[0]))#創(chuàng)建一個(gè)全0的梯度列表

foriinrange(m):#遍歷輸入數(shù)據(jù)與標(biāo)簽集,計(jì)算梯度

current_x=x[i]

current_y=y[i]

current_x=np.asarray(current_x)#輸入特征轉(zhuǎn)換為Numpy數(shù)組,計(jì)算預(yù)測(cè)值(通過(guò)sigmoid函數(shù))

matrix_gradient+=(self.sigmoid(np.dot(self.features,current_x))-current_y)*current_x#計(jì)算梯度公式(預(yù)測(cè)值-真實(shí)值)*輸入特征

self.features=self.features-learning_rate*matrix_gradient#遵循梯度下降原則,更新特征數(shù)據(jù)04模型訓(xùn)練7)定義誤差計(jì)算函數(shù)

模型的輸出結(jié)果和其對(duì)應(yīng)的真實(shí)值之間往往會(huì)存在一些差異,這些差異稱為該模型的輸出誤差,簡(jiǎn)稱誤差。誤差函數(shù)是用來(lái)計(jì)算實(shí)際和預(yù)測(cè)的差別的。訓(xùn)練誤差是指模型在訓(xùn)練集上的平均損失,測(cè)試誤差是指模型在測(cè)試集上的平均損失。訓(xùn)練誤差的大小對(duì)判斷給定的問(wèn)題是不是一個(gè)容易學(xué)習(xí)的問(wèn)題具有一定意義,但其本質(zhì)上不重要。測(cè)試誤差反映了學(xué)習(xí)方法對(duì)未知的測(cè)試集的預(yù)測(cè)能力,是學(xué)習(xí)中的重要概念。機(jī)器學(xué)習(xí)在訓(xùn)練模型時(shí),都會(huì)把樣本集分為訓(xùn)練集和測(cè)試集。其中,訓(xùn)練集用來(lái)完成算法模型的學(xué)習(xí)和訓(xùn)練,而測(cè)試集用來(lái)評(píng)估訓(xùn)練好的模型對(duì)于數(shù)據(jù)的預(yù)測(cè)性能。此時(shí)要考慮評(píng)估的性能是否合理。04模型訓(xùn)練7)定義誤差計(jì)算函數(shù)#誤差計(jì)算,x是輸入數(shù)據(jù),y是標(biāo)簽集,返回平均誤差

deferror(self,x,y):

total=len(y)

error_num=0#初始化錯(cuò)誤計(jì)數(shù)變量

foriinrange(total):

current_x=x[i]#將當(dāng)前樣本的特征值賦值給current_x

current_y=y[i]#將當(dāng)前樣本的標(biāo)簽賦值給current_y

hx=self.sigmoid(np.dot(self.features,current_x))#LR算法

ifself.cost(hx,current_y)>0.5:#進(jìn)一步計(jì)算損失

比較損失與閾值0.5的大小,判斷是否預(yù)測(cè)錯(cuò)誤

error_num+=1

returnerror_num/total04模型訓(xùn)練8)定義訓(xùn)練函數(shù)#訓(xùn)練函數(shù),learning_rate是學(xué)習(xí)率,num_iter是迭代次數(shù)

deftrain(self,learning_rate,num_iter):

[train_inputs,train_lables]=self.train_dataset#獲取訓(xùn)練輸入數(shù)據(jù)和標(biāo)簽

n=len(train_inputs[0])

self.features=np.ones(n)#初始化特征值

dataMat=np.asarray(train_inputs)#將輸入數(shù)據(jù)和標(biāo)簽轉(zhuǎn)為numpy數(shù)組

labelMat=np.asarray(train_lables)

foriinrange(num_iter+1):

self.gradient(dataMat,labelMat,learning_rate)#梯度下降算法

ifi%10==0:#每10輪計(jì)算1次誤差,打印當(dāng)前數(shù)據(jù)

err=self.error(dataMat,labelMat)

print(f‘迭代次數(shù):{i:<6}誤差值:{err:<20}’)

withopen(self.feature_dir,‘w’)asf:#保存特征數(shù)據(jù)

feature=[str(f)forfinself.features]

f.writelines(','.join(feature))04模型訓(xùn)練8)定義測(cè)試函數(shù)deftest(self,test_dataset=None,show=False):

[test_inputs,test_labels]=test_dataset

total=len(test_labels)

error_num=0

right_num=0

forti,tlinzip(test_inputs,test_labels):#遍歷測(cè)試集

#統(tǒng)計(jì)測(cè)試結(jié)果,如果預(yù)測(cè)值與真值相同,則準(zhǔn)確數(shù)據(jù)+1;如果預(yù)測(cè)值與真值不同,則錯(cuò)誤數(shù)據(jù)+1

if(np.dot(np.array(ti),self.features.T)<0.5andtl==0)or(np.dot(np.array(ti),self.fea

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論