第二章、感知機

感知機原理剖析及實現

模型:

一條能夠區分所有類別的函數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)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章