感知機原理剖析及實現
模型:
一條能夠區分所有類別的函數f(x),這就是本次求解模型
其中,
策略:
如果我們把所有分錯的點到分割平面的距離求和,讓這段求和的值最小,呢麼這個平面就是我們的f(x)
點到平面的距離:
算法:
梯度下降法
'''
數據集:Mnist
訓練集數量:60000
測試集數量:10000
iter:30
------------------------------
運行結果:
正確率:0.8172(二分類)
運行時長:53.49
'''
import numpy as np
import time
from tqdm import tqdm
# 讀取data和label, label[0---4]:0 [5--9]:1
# 對data做歸一化
def loadData(fileName):
'''
加載Mnist數據集
:param fileName:要加載的數據集路徑
:return: list形式的數據集及標記
'''
print('start to read data')
data = []; label = []
fr = open(fileName, 'r')
for line in fr.readlines():
curLine = line.strip().split(',')
if int(curLine[0]) >= 5:
label.append(1)
else:
label.append(-1)
data.append([int(num)/255 for num in curLine[1:]])
return data, label
def perceptron(dataArr, labelArr, iter=50):
'''
:param dataArr:訓練集的數據 (list)
:param labelArr: 訓練集的標籤(list)
:param iter: 迭代次數,默認50
:return: 訓練好的w和b
'''
print('start to trans')
dataMat = np.mat(dataArr)
labelMat = np.mat(labelArr).T
#獲取數據矩陣的大小,爲m*n
m, n = np.shape(dataMat)
w = np.zeros((1, np.shape(dataMat)[1]))
b= 0
h = 0.0001
for k in tqdm(range(iter)):
for i in range(m): # 逐一遍歷,梯度下降
xi = dataMat[i]
yi = labelMat[i]
if -1 * yi * (w * xi.T + b) >= 0:
w = w + h * yi * xi
b = b + h * yi
return w, b
def test(dataArr, labelArr, w, b):
'''
測試準確率
:param dataArr:測試集
:param labelArr: 測試集標籤
:param w: 訓練獲得的權重w
:param b: 訓練獲得的偏置b
:return: 正確率
'''
print('start to test')
dataMat = np.mat(dataArr)
labelMat = np.mat(labelArr).T
m, n = np.shape(dataMat)
errorCnt = 0
for i in range(m):
xi = dataMat[i]
yi = labelMat[i]
result = -1 * yi * (w * xi.T + b)
if result >= 0: errorCnt += 1
accruRate = 1 - (errorCnt / m)
return accruRate
if __name__ == '__main__':
start = time.time()
#獲取訓練集及標籤
trainData, trainLabel = loadData('../Mnist/mnist_train.csv')
#獲取測試集及標籤
testData, testLabel = loadData('../Mnist/mnist_test.csv')
#訓練獲得權重
w, b = perceptron(trainData, trainLabel, iter = 30)
#進行測試,獲得正確率
accruRate = test(testData, testLabel, w, b)
#獲取當前時間,作爲結束時間
end = time.time()
#顯示正確率
print('accuracy rate is:', accruRate)
#顯示用時時長
print('time span:', end - start)