1. 程式人生 > >機器學習之感知機(Perceptron)模型

機器學習之感知機(Perceptron)模型

機器學習之Perceptron模型

本文主要介紹機器學習領域最為基礎的模型,感知機模型:

  • 1、感知機模型介紹
  • 2、感知機數學原理
  • 3、演算法及Python程式碼實現
  • 4、小結

1、感知機模型介紹

定義(感知機) 假設輸入空間(特徵空間)是這裡寫圖片描述,輸出空間是Y={+1,-1},輸入這裡寫圖片描述表示例項的特徵向量,對應於輸入空間(特徵空間)的點;輸出這裡寫圖片描述表示例項的類別。由輸入空間到輸出空間的如下函式 f(x)=sign(w·x+b)稱為感知機,其中w和b稱為感知機的引數,sign為符號函式定義為這裡寫圖片描述

2、感知機數學原理

2.1 感知機學習策略

對於給定一個數據集T={(x1,y1),(x2,y2),…,(xN,yN)},其中,xi∈X=這裡寫圖片描述

yi∈Y={+1,-1},i=1,2,…,N,如果存在某個超平面S w·x+b=0,能將正負樣例分到S兩側,則說明資料集T可分,那麼接下來就是要求這個超平面S的表示式。

2.2感知機學習策略

首先寫出輸入空間這裡寫圖片描述中任意一點x0到超平面S的距離:
這裡寫圖片描述
這裡||w||是w的L2範數
對於誤分類來說,-yi(w·xi+b)>0 成立,因為在誤分類情形下yi的值與w·xi+b的值符號相反,又因為yi取值為+1,-1,用yi的值可以去掉上面的距離公式中的絕對值符號,因此誤分類點xi到超平面的距離為
這裡寫圖片描述
這樣,假設超平面S的誤分類點集合為M,那麼所有誤分類點到超平面S的總距離為
這裡寫圖片描述這裡把||w||定為1,便於定義損失函式(原理目前我還不太懂)那麼就可以定義感知機的損失函數了
這裡寫圖片描述

3、演算法及Python程式碼實現

感知機學習演算法的原始形式
輸入:訓練資料TT={(x1,y1),(x2,y2),…,(xN,yN)},其中,xi∈X=這裡寫圖片描述yi∈Y={+1,-1},i=1,2,…,N;學習率η(0<η≤1);
輸出:w,b;感知機模型f(x)=sign(w·x+b).
(1)選取初值w0,b0
(2)在訓練集中選取資料(xi,yi)
(3)如果yi(w·xi+b)≤0,w ← w+ηyi·xi;b ← b+ηyi
(4)轉至(2),直至訓練集中沒有誤分類點
下面始Python實現程式碼

import numpy as np
import random as
random import matplotlib as mpl import matplotlib.pyplot as plt datas = [[(1,2),-1],[(2,1),-1],[(2,2),-1],[(1,4),1],[(3,3),1],[(5,4),1],[(3, 3), 1], [(4, 3), 1], [(1, 1), -1],[(2, 3), -1], [(4, 2), 1]] random.shuffle(datas) fig = plt.figure('Input Figure') mpl.rcParams['xtick.labelsize'] = 16 mpl.rcParams['ytick.labelsize'] = 16 plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤 #plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號 xArr = np.array([x[0] for x in datas]) yArr = np.array([x[1] for x in datas]) xPlotx,xPlotx_,xPloty,xPloty_ = [],[],[],[] for i in range(len(datas)): y = yArr[i] if y>0: xPlotx.append(xArr[i][0]) xPloty.append(xArr[i][1]) else: xPlotx_.append(xArr[i][0]) xPloty_.append(xArr[i][1]) plt.title('Perception 輸入資料') plt.grid(True) pPlot1,pPlot2 = plt.plot(xPlotx,xPloty,'b+',xPlotx_,xPloty_,'rx') plt.legend(handles = [pPlot1,pPlot2],labels=['Positive Sample','Negtive Sample'],loc='upper center') plt.show()

輸入10個散點圖,顯示所有離散資料點
這裡寫圖片描述

w = np.array([1,1])
b = 3
n = 1
while True:
    num = 0
    for i in range(len(datas)):
        num += 1
        x = xArr[i]
        y = yArr[i]
        z = y*(np.dot(w,x)+b)
        if z<=0 :
            w = w+n*y*x
            b = b+n*y
            break
    if num>=len(datas):
        break
fig = plt.figure('Output Figure')
x0 =np.linspace(0,5,100)
w0 = w[0]
w1 = w[1]
x1 = -(w0/w1)*x0-b/w1
plt.title("Perception 輸出平面")
plt.xlabel('x0')
plt.ylabel('x1')
plt.annotate('Output Hyperplane',xy=(0.5,4.5),xytext=(1.7,3.5))
plt.plot(x0,x1,'k', lw=1)
pPlot3, pPlot4= plt.plot(xPlotx,xPloty,'b+',xPlotx_,xPloty_,'rx')
plt.legend(handles = [pPlot3,pPlot4],labels=['Positive Sample','Negative Sample'],loc='upper right')
plt.show()

輸出得到的超平面S的方程w·x+b=0函式式
這裡寫圖片描述

4、小結

本次部落格主要介紹了感知機模型的原始形式,另外感知機模型還有對偶形式的表示式,這裡不再介紹,感知機模型雖然簡單,卻有很重要的作用,後面我們會講到SVM支援向量機,理解了感知機模型原理後對後面理解SVM會有很大的幫助。