統計学習理論——感知機学習アルゴリズムpython実現(原始形式と対偶形式)

23057 ワード

感知機の学習アルゴリズムは原始形式と対偶形式に分けられる.
具体的なモデル理論:統計学習--感知機本文は本の中の2つのアルゴリズム過程をpythonを利用して実現した.機械学習アルゴリズムの実現を行う際には,強力な数学演算numpyライブラリを利用することができる.しかし、この文章ではnumpyライブラリは使われていません.データセットは配列で入力され,関連するベクトル演算を行う際に配列の下付きを利用して配列中のデータを演算する.
1.感知機学習アルゴリズムの原始形式
def vectorInnerProduct(vector1,vector2):   #          
    result = 0
    length = len(vector1)
    for i in range(length):
        result += vector1[i] * vector2[i]
    return result
def elementAddition(vector1,vector2):    #              
    for i in range(len(vector1)):
        vector1[i] += vector2[i]
    return vector1
def  numberMultiply(num,vector):        #        
    tempVector =  []
    for i in range(len(vector)):
        tempVector.append(vector[i] * num)
    return tempVector
    #          vector,                       ,
    #           
"""       ,        (  )       ,      。    """
def perceptron(bias,dataSet,learnRate):  
#        ,        ,  ,        。
    weightVector = [0 for i in range(len(dataSet[0][0]))]   #         0
    while True:  
    #           ,        ,      while  ,            errornum
        errorNum = 0
        for data in dataSet:  #           ,    
            if data[1] * (vectorInnerProduct(weightVector,data[0])+bias) <= 0:
                errorNum += 1
                weightVector = elementAddition(weightVector,numberMultiply(learnRate * data[1],data[0]))
                bias += learnRate * data[1]
        if errorNum == 0:  #         ,    
            break
    return weightVector,bias  #       

さらに,学習したモデルを用いて任意のインスタンス点の分類を判断することも可能である.この関数は簡単なif文だけで実現できます.
bias = 0
dataSet = [[[3,3],1],[[4,3],1],[[1,1],-1]]
learnRate = 1
print(perceptron(bias,dataSet,learnRate))
#                ,     ([1, 1], -3)

2.感知機学習アルゴリズムの対偶形式
対偶アルゴリズムの学習過程において,訓練セットの例は内積の形でしか現れず,訓練セットデータ間の内積を事前に計算し,行列で格納することができる,すなわちGram行列である.
def vectorInnerProduct(vector1,vector2): #     
    result = 0
    length = len(vector1)
    for i in range(length):
        result += vector1[i] * vector2[i]
    return result
def gramMatrix(dataSet):  #   gram  
    length = len(dataSet)
    gramMatrix = [[0 for i in range(length)] for i in range(length)]
    for i in range(length):
        for j in range(length):
            gramMatrix[i][j] = vectorInnerProduct(dataSet[i][0],dataSet[j][0])
    return gramMatrix

def elementAddition(vector1,vector2): #       
    for i in range(len(vector1)):
        vector1[i] += vector2[i]
    return vector1

def  numberMultiply(num,vector):      #   
    tempVector =  []
    for i in range(len(vector)):
        tempVector.append(vector[i] * num)
    return tempVector

def perceptron(dataSet,learnRate):  #                ,alpha           0
    n = len(dataSet)
    alphaList= [0 for i in range(n)]
    bias = 0
    gram = gramMatrix(dataSet)
    while True:  #             ,      (          )     
        errorNum = 0
        for i in range(n):
            tempSum = 0
            for j in range(n):
                tempSum += alphaList[j] * dataSet[j][1] * gram[j][i]
            if dataSet[i][1] * (tempSum + bias) <= 0:
                errorNum += 1
                alphaList[i] += learnRate
                bias += learnRate * dataSet[i][1]
        if errorNum == 0:
            break
    #           alpha,     alpha         
    weightVector = numberMultiply(alphaList[0]*dataSet[0][1],dataSet[0][0])
    for i in range(1,n):
        weightVector = elementAddition(weightVector,numberMultiply(alphaList[i]*dataSet[i][1],dataSet[i][0]))
    return weightVector,bias   
dataSet = [[[3,3],1],[[4,3],1],[[1,1],-1]]
print(perceptron(dataSet,1))
#        ,      ([1, 1], -3)