MATLAB實現感知器演算法(MNIST資料集)

2021-10-06 03:30:49 字數 3643 閱讀 1774

線性分類器之感知器模型,不能解決兩兩不可分問題。

感知器是乙個通過輸入加權和與閾值的比較來覺得是否啟用輸出的神經元模型,是乙個線性分類器,輸入的權構成了線性分類決策邊界的權向量,啟用輸出的閾值θ就是分類決策邊界的偏置量 w0。所以,經過資料規範化以後,得到了統一的求解目標,即

感知器的求解目標:

感知器演算法設定準則函式的依據很簡單,就是最終分類器要能正確分類所有的樣本,所以,感知器演算法的準則函式 j 設定為所有錯分樣本的判別函式值之和,再乘以-1.因此,只要存在錯分樣本,準則函式值就是大於 0 的,只有當所有樣本都正確地被分類了,準則函式才能取得極小值 0.如何求解呢?感知器演算法採用了數值優化中經典的梯度下降法,即從乙個任意的初始權向量 w0 出發,沿準則函式值下降最快的方向,也就是負梯度方向對權向量進行一步步修正,直到獲得全域性最優解為止。即第 k+1 步是在第 k 步獲得的權向量基礎上進行遞推,得到第 k+1 步的權向量。其中ρ是每一次遞推的調整步長。

我們把感知器演算法的準則函式定義代入,就可以求得準則函式第 k 步時對w(k)的梯度,正好是所有錯分樣本的和乘以-1。因此感知器演算法的權向量遞推公式為

即每一步把當前被錯分的樣本加起來,在調整步長的控制下,去修正權向量。

要特別注意的是,修正的方向是「+」,這是因為負梯度和準則函式梯度中的負號相抵消的原因。

單樣本修正的感知器演算法,步驟為:

a、 設定初始權向量w0,k=0 ;

b、 從訓練樣本集中順序抽取乙個樣本,將其規範化增廣特徵向量

代入到判別函式中計算;

c、 若分類正確返回到步驟 b,抽取下乙個樣本;

d、 若分類錯誤,修正權向量:

e、 返回到步驟 b,抽取下乙個樣本;直至訓練樣本集中所有樣本均被正確分類。

資料集使用的是 matlab 版本,由四個檔案組成,包含訓練集 60000 個樣本,測試集 10000 個樣本;每個樣本為 28*28 大小的矩陣,矩陣中元素為 double型別。標籤為行向量,每個元素為相應資料的數字標籤。

perceptionlearn.m檔案,實現利用給定的訓練資料和設定的學習引數,計算得到感知器的權向量 w。

%利用給定的訓練資料和設定的學習引數,計算得到的感知機權向量w 

% 函式輸入:資料(行向量),標籤,學習率,終止輪次

% 輸出:訓練得到的權值向量

% 訓練方法:單樣本修正,學習率(步長)採用了固定值

function [w]=perceptionlearn(x,y,learningrate,maxepoch)

[rows,cols]=size(x);

x=[x,ones(rows,1)];%行增廣,返回乙個row(行)*1的全1矩陣

w=zeros(1,cols+1);%增廣,返回乙個1*cols(列)+1 的全0矩陣

for epoch=1:maxepoch%不可分情況下整體迭代輪次

flag=true;%標誌位真則訓練完畢

for sample=1:rows

if sign(x(sample,:)*w')~=y(sample)%分類是否正確?錯誤則更新權值

flag=false;

%更新權值時使用標籤來充當梯度方向的變數

w=w+learningrate*y(sample)*x(sample,:);

endend

if flag==true

break;

endend

end

properception.m 檔案主要實現了資料集讀入,感知器訓練引數設定,獲取訓練及測試資料,標籤轉換,資料處理,感知器訓練,測試及結果輸出幾個部分。

clear variables

clc% 讀取資料

load ('./test_images.mat');

load ('./test_labels.mat');

% 設定資料量

train_num = 1000;

test_num = 200;

% 臨時變數以及各個感知器引數

j = 1;

lr = 0.01;%學習率

epoch =10;%設定訓練多少輪

number = [4,8];%要取的數字組合,只能做二分類

% 提取資料中標籤為任意組合的樣本,共計200個

% 由於資料本身打亂過,因此可以直接取200個而不考慮樣本不均衡問題

for i = 1:10000

if test_labels1(i)==number(1)|| test_labels1(i)==number(2)

data(:,:,j) = test_images(:,:,i);

label(j) = test_labels1(i);%取相應標籤

j=j+1;

if j>train_num+test_num

break;

endend

end% a||b,或邏輯,如果a為真則a||b就為真,不會判斷b的真假,但只能對標量操作,

% 由於感知器輸出結果僅為0、1,因此要將標籤進行轉換

% 本程式中,由於matlab計算不等式相對容易,因此沒有對樣本進行規範化

% 由於沒有進行規範化,後面更新權值w需要借助標籤,因此標籤需要置-1和1

for k = 1:train_num+test_num

if label(k)==number(1)

label(k)=-1;

endif label(k)==number(2)

label(k)=1;

endenddata_ = mat2vector(data,train_num+test_num);%矩陣轉向量

test_data = [data_(train_num+1:train_num+test_num,:),ones(test_num,1)];%這裡對測試資料也進行增廣變換

% test_data = data_(train_num+1:train_num+test_num,:);

% 訓練權值

w=perceptionlearn(data_(1:train_num,:),label(1:train_num),lr,epoch);

% 測試(**)

for k = 1:test_num

if test_data(k,:)*w'>0

result(k) = 1;

else

result(k) = -1;

endend% 輸出**的準確率

acc = 0.;

for sample = 1:test_num

if result(sample)==label(train_num+sample)

acc = acc+1;

endendfprintf('精確度為:%5.2f%%\n',(acc/test_num)*100);

設定訓練樣本1000,劃分數字4和8,精確度能達到99.5%

感知器演算法 MATLAB

axis 0 10 0 10 橫 縱座標範圍 hold on hold on 使當前軸及圖形保持而不被重新整理,準備接受此後將繪製的圖形,多圖共存 hold off 使當前軸及圖形不在具備被重新整理的性質,新圖出現時,取消原圖 x 存放滑鼠取點座標 n 0 計數 w1類取點向量 disp 單擊滑鼠左...

基於簡單感知器分類演算法(matlab實現)

定義感知器演算法 d w1 x1 w2 x2 w3 x 0,0 0,1 1,0 1,1 class 1,1,1,1 定義修改權重p p 1 初始化權重引數 w 0,0,0 判別準則是錯誤次數err count err count 1 n,m size x 增廣and規範化 x x,ones n,1 ...

感知器演算法

coding utf 8 created on thu oct 15 13 58 06 2015 author think 感知器演算法 import mkdata as mk import numpy as np import matplotlib.pyplot as plt n 100 生成測試...