📜  学习向量量化

📅  最后修改于: 2021-04-16 03:19:37             🧑  作者: Mango

学习向量量化(LVQ)是一种人工神经网络,它也受到神经系统生物学模型的启发。它基于原型监督学习分类算法,并通过类似于自组织图的竞争性学习算法对网络进行了训练。它还可以处理多类分类问题。 LVQ有两层,一层是输入层,另一层是输出层。下面给出了学习矢量量化的体系结构,其中输入数据中的类数为n,而任何样本的输入特征数为n:

学习矢量量化如何工作?

假设一个大小为(m,n)的输入数据,其中m为训练示例数,n为每个示例中的特征数,以及大小为(m,1)的标签矢量。首先,它从具有不同标签的前c个训练样本中初始化大小(n,c)的权重,并且应将其从所有训练样本中丢弃。在这里,c是类数。然后迭代剩余的输入数据,对于每个训练示例,它都会更新获胜向量(距离训练示例最短距离(例如,欧几里得距离)的权重向量)。权重更新规则由给出:

wij = wij(old) - alpha(t) * (xik - wij(old))

其中alpha是时间t的学习率,j表示获胜矢量,i表示训练示例的第i个特征,k表示输入数据中的第k个训练示例。在训练了LVQ网络之后,将训练后的权重用于对新示例进行分类。一个标有获胜矢量类别的新示例。

算法

涉及的步骤有:

  • 重量初始化
  • 对于1到N个纪元
  • 选择一个训练实例
  • 计算获胜向量
  • 更新获胜矢量
  • 对所有训练示例重复步骤3、4、5。
  • 分类测试样品

下面是实现。

import math
  
  
class LVQ :
      
    # Function here computes the winning vector
    # by Euclidean distance
    def winner( self, weights, sample ) :
          
        D0 = 0
        D1 = 0
          
        for i  in range( len( sample ) ) :
            D0 = D0 + math.pow( ( sample[i] - weights[0][i] ), 2 )
            D1 = D1 + math.pow( ( sample[i] - weights[1][i] ), 2 )
              
            if D0 > D1 :
                return 0
            else : 
                return 1
  
    # Function here updates the winning vector     
    def update( self, weights, sample, J, alpha ) :
        for i in range(len(weights)) :
            weights[J][i] = weights[J][i] + alpha * ( sample[i] - weights[J][i] ) 
  
# Driver code
def main() :
  
    # Training Samples ( m, n ) with their class vector
    X =  [[ 0, 0, 1, 1 ],  [ 1, 0, 0, 0 ], 
          [ 0, 0, 0, 1 ], [ 0, 1, 1, 0 ],
          [ 1, 1, 0, 0 ], [ 1, 1, 1, 0 ],] 
  
    Y = [ 0, 1, 0, 1, 1, 1 ]
    m, n = len( X ), len( X[0] )
      
    # weight initialization ( n, c )
    weights = []
    weights.append( X.pop( 0 ) )
    weights.append( X.pop( 1 ) )
  
    # Samples used in weight initialization will
    # not use in training
    m = m - 2
      
    # training
    ob = LVQ()
    epochs = 3
    alpha = 0.1
      
    for i in range( epochs ) :
        for j in range( m ) :
              
            # Sample selection
            T = X[j]
              
            # Compute winner
            J = ob.winner( weights, T )
          
            # Update weights
            ob.update( weights, T, J, alpha )
              
    # classify new input sample
    T = [ 0, 0, 1, 0 ]
    J = ob.winner( weights, T )
    print( "Sample T belongs to class : ", J )
    print( "Trained weights : ", weights )
      
if __name__ == "__main__":
    main()
输出: