SDU機器學習作業心得5

2021-09-10 14:13:45 字數 3232 閱讀 8477

軟體16-6 李昊 201600301309

意!!

使用svm之前請先解壓./dataforsvm.zip。

mnist.pkl.gz上次實驗已經上傳過了,這次不再上傳,執行之前請把它放到當前目錄下。繼上次實驗用bp神經網路處理完mnist資料集之後,我們這次的任務是用多個模型進行投票,組成乙個整合學習模型來處理mnist資料集。

本次實驗我準備了如下幾個模型:

帶一層隱藏層的bp神經網路1(785,51,10,eta=0.8)

帶一層隱藏層的bp神經網路2(785,31,10,eta=1)

knnsvm1(線性核)

svm2(sigmoid核)

最終取所有模型**結果的眾數作為投票結果。

雖然老師允許使用現有的庫,但是不同的庫對資料格式的要求不同。所以處理資料的格式成了乙個大難題。bp神經網路的資料在上次實驗中已經整理好了格式,knn稍微一變也能使用。在處理資料使其支援svm的格式上,我把訓練集和測試集重新讀取到兩個檔案中,並且在檔案中整理好了格式。

with

open

('traindata'

,'w'

)as fout:

for i in

range

(len

(images_train)):

line=''+

str(labels_onlynum[i]

)for j in

range

(784):

line+=

' '+

str(j+1)

+':'

+str

(float

(images_train[i]

[j])

) line+=

'\n'

fout.write(line)

這個整理過程也是需要一定的時間的。產生了乙個300多m的traindata和60多m的testdata。

knn:用knn處理mnist我使用了網上現有的**,為了適應我已有的**進行了一些修改。

def

knn_classify

(test_data, train_dataset, train_label, k)

: train_data=np.array(train_dataset)

.reshape(

50000

,784

) train_dataset_amount = train_data.shape[0]

#行數,也即訓練樣本的的個數,shape[1]為列數

#將輸入test_data變成了和train_dataset行列數一樣的矩陣

test_rep_mat = np.tile(

[test_data.reshape(1,

784)],

(train_dataset_amount,1)

)#tile(mat,(x,y)) array類 mat 沿著行重複x次,列重複y次

diff_mat = test_rep_mat[0]

- train_data

#求平方,為後面求距離準備

sq_diff_mat = diff_mat**

2#將平方後的資料相加,sum(axis=1)是將乙個矩陣的每一行向量內的資料相加,得到乙個list,list的元素個數和行數一樣;sum(axis=0)表示按照列向量相加

sq_dist = sq_diff_mat.

sum(axis=1)

#開平方,得到歐式距離

distance = sq_dist**

0.5#argsort 將元素從小到大排列,得到這個陣列元素在distance中的index(索引),dist_index元素內容是distance的索引

dist_index = distance.argsort(

)

class_count=

for i in

range

(k):

label =

int(train_label[dist_index[i]])

#如果屬於某個類,在該類的基礎上加1,相當於增加其權重,如果不是某個類則新建字典的乙個key並且等於1

class_count[label]

= class_count.get(label,0)

+1#降序排列

class_count_list =

sorted

(class_count.items(

), key=operator.itemgetter(1)

, reverse=

true

)return class_count_list[0][0]

svm:svm使用了libsvm庫。相對於安裝時的麻煩,使用起來比較方便。

def

getsvm()

: y,x=svm_read_problem(

'./traindata'

) m2=svm_train(y,x,

'-t 3'

) m1=svm_train(y,x)

y1,x1=svm_read_problem(

'./testdata'

) lab1,acc1,val1=svm_predict(y1,x1,m1)

lab2,acc2,val2=svm_predict(y1,x1,m2)

return lab1,lab2

bp神經網路:上次實驗的**。

處理的過程是緩慢的,等待的過程是痛苦的。。。

在整理完knn試執行的時候,就用了半個多小時,這一套下來,樂觀估計得乙個半小時。。。先去喝杯茶。

準確率處在個體分類器的準確率區間內,不過相對於神經網路的準確率,這個結果還是很令人滿意的。

這次感覺是這學期實驗的乙個總結。通過整合學習,我也順便複習了前幾個實驗的內容,加深了對他們的理解。

實驗過程,需要理解的不多,主要時間還是花費在了整理資料和等待結果上。通過準確率的比較,我們還是能感受到整合學習相對於單個模型的巨大優勢的。

通過本學期的機器學習,我學到了很多看上去高大上的東西,意識到了知識的本質還是數學。。。數學果然是學科之母。希望在以後的工作中,我也能從事機器學習相關的職業。

今天是2023年的最後一天,也祝老師新年快樂,給老師拜個早年了。

SDU機器學習作業心得1

這本天書簡直就讓人摸不到頭腦,翻到二十多頁已然是看不懂了。在懶人床的指點下,好歹有了一些想法。所以寫下這個部落格,為了讓跟我一樣看天書的小夥伴們一點幫助。樣本w1 w2w3 x1x2 x3x1 x2x3 x1x2x31 5.01 8.12 3.68 0.91 0.18 0.05 5.35 2.26 ...

2013 7 15學習作業

題目1 int a 3 a 0 0 a 1 1 a 2 2 int p,q p a q a 2 a q p 的值是多少?為什麼?include using namespace std int main int argc,const char ar 題目2 const 有什麼用途?請用附上 例子佐證 ...

模式識別與機器學習 作業3

壓縮近鄰法的做法是 對初始訓練集r,將其劃分為兩個部分a和b,初始a樣本集合為空。從r中隨機選擇乙個樣本放入a中,其它樣本放入b中,用其對b中的每乙個樣本進行分類。若樣本i能夠被正確分類,則將其放回到b中 否則將其加入到a中 重複上述過程,直到b中所有樣本都能正確分類為止。coding utf 8 ...