学习向量量化(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()
输出:
Sample T belongs to class : 0
Trained weights : [[0.3660931, 0.38165410000000005, 1, 1], [0.33661, 0.34390000000000004, 0, 1]]