1.mooc資料任務簡介
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次已經是比較合适的,過多容易過拟合。