天天看點

mooc機器學習第九天-手寫數字分類執行個體(MLP,K近鄰)

1.mooc資料任務簡介

mooc機器學習第九天-手寫數字分類執行個體(MLP,K近鄰)
mooc機器學習第九天-手寫數字分類執行個體(MLP,K近鄰)
mooc機器學習第九天-手寫數字分類執行個體(MLP,K近鄰)
mooc機器學習第九天-手寫數字分類執行個體(MLP,K近鄰)
mooc機器學習第九天-手寫數字分類執行個體(MLP,K近鄰)
mooc機器學習第九天-手寫數字分類執行個體(MLP,K近鄰)
mooc機器學習第九天-手寫數字分類執行個體(MLP,K近鄰)

2.代碼

(1)MLP

import numpy as np     #導入numpy工具包
from os import listdir #使用listdir子產品,用于通路本地檔案
from sklearn.neural_network import MLPClassifier
  
def img2vector(fileName):   
    retMat = np.zeros([1024],int) #定義傳回的矩陣,大小為1*1024
    fr = open(fileName)           #打開包含32*32大小的數字檔案
    lines = fr.readlines()        #讀取檔案的所有行
    for i in range(32):           #周遊檔案所有行
        for j in range(32):       #并将01數字存放在retMat中    
            retMat[i*32+j] = lines[i][j]   
    return retMat
  
def readDataSet(path):   
    fileList = listdir(path)    #擷取檔案夾下的所有檔案
    numFiles = len(fileList)    #統計需要讀取的檔案的數目
    dataSet = np.zeros([numFiles,1024],int) #用于存放所有的數字檔案
    hwLabels = np.zeros([numFiles,10])      #用于存放對應的one-hot标簽
    for i in range(numFiles):   #周遊所有的檔案
        filePath = fileList[i]  #擷取檔案名稱/路徑     
        digit = int(filePath.split('_')[0])  #通過檔案名擷取标簽     
        hwLabels[i][digit] = 1.0        #将對應的one-hot标簽置1
        dataSet[i] = img2vector(path +'/'+filePath) #讀取檔案内容  
    return dataSet,hwLabels
  
#read dataSet
train_dataSet, train_hwLabels = readDataSet('trainingDigits')
  
clf = MLPClassifier(hidden_layer_sizes=(100,),
                    activation='logistic', solver='adam',
                    learning_rate_init = 0.0001, max_iter=2000)
print(clf)
clf.fit(train_dataSet,train_hwLabels)
  
#read  testing dataSet
dataSet,hwLabels = readDataSet('testDigits')
res = clf.predict(dataSet)   #對測試集進行預測
error_num = 0                #統計預測錯誤的數目
num = len(dataSet)           #測試集的數目
for i in range(num):         #周遊預測結果
    #比較長度為10的數組,傳回包含01的數組,0為不同,1為相同
    #若預測結果與真實結果相同,則10個數字全為1,否則不全為1
    if np.sum(res[i] == hwLabels[i]) < 10:
        error_num += 1                    
print("Total num:",num," Wrong num:", \
      error_num,"  WrongRate:",error_num / float(num))           

(2)K近鄰

import numpy as np     #導入numpy工具包
from os import listdir #使用listdir子產品,用于通路本地檔案
from sklearn import neighbors
  
def img2vector(fileName):   
    retMat = np.zeros([1024],int) #定義傳回的矩陣,大小為1*1024
    fr = open(fileName)           #打開包含32*32大小的數字檔案
    lines = fr.readlines()        #讀取檔案的所有行
    for i in range(32):           #周遊檔案所有行
        for j in range(32):       #并将01數字存放在retMat中    
            retMat[i*32+j] = lines[i][j]   
    return retMat
  
def readDataSet(path):   
    fileList = listdir(path)    #擷取檔案夾下的所有檔案
    numFiles = len(fileList)    #統計需要讀取的檔案的數目
    dataSet = np.zeros([numFiles,1024],int)    #用于存放所有的數字檔案
    hwLabels = np.zeros([numFiles])#用于存放對應的标簽(與神經網絡的不同)
    for i in range(numFiles):      #周遊所有的檔案
        filePath = fileList[i]     #擷取檔案名稱/路徑  
        digit = int(filePath.split('_')[0])   #通過檔案名擷取标簽    
        hwLabels[i] = digit        #直接存放數字,并非one-hot向量
        dataSet[i] = img2vector(path +'/'+filePath)    #讀取檔案内容
    return dataSet,hwLabels
  
#read dataSet
train_dataSet, train_hwLabels = readDataSet('trainingDigits')
knn = neighbors.KNeighborsClassifier(algorithm='kd_tree', n_neighbors=3)
knn.fit(train_dataSet, train_hwLabels)
  
#read  testing dataSet
dataSet,hwLabels = readDataSet('testDigits')
  
res = knn.predict(dataSet)  #對測試集進行預測
error_num = np.sum(res != hwLabels) #統計分類錯誤的數目
num = len(dataSet)          #測試集的數目
print("Total num:",num," Wrong num:", \
      error_num,"  WrongRate:",error_num / float(num))           

3.小結

通過調整參數,可以看出,在較小(稀疏矩陣)的資料集時,K近鄰的準确率更高,而全聯接的學習率,

拟合次數,神經元個數三者都會影響拟合效果,在這個資料集上,2000次已經是比較合适的,過多容易過拟合。

繼續閱讀