軟體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 ...