mdusom.bas

来自「SOM的学习规则有三个主要阶段: 1)寻找与输入模式xk最接近的连接权向量Wj」· BAS 代码 · 共 98 行

BAS
98
字号
Attribute VB_Name = "MduSOM"
Option Explicit
Public Times As Integer '学习次数
Public KK As Integer '模式数
Public NN As Integer '输入层
Public MM As Integer '竞争层
Public A() As Double   '学习模式
Public AA() As Double  '输入
Public B() As Double  '竞争层神经元的位置
Public BB() As Double   '输出
Public d() As Double '竞争层各神经元的权向量与输入向量的距离
Public W() As Double '权重
Public L As Double '修正系数
Public AAA As Double   '在学习中逐渐变小的系数

Public Sub StudyMain()
Dim i, j As Integer
Dim k, t As Integer
Dim Min, Markj As Integer '选择优胜神经元
For t = 1 To Times
Randomize
k = Int(KK * Rnd + 1)
For j = 1 To MM
  d(j) = 0
 For i = 1 To NN
  d(j) = d(j) + (A(k, i) - W(i, j)) ^ 2
 Next i
 d(j) = Sqr(d(j))
Next j
Min = d(1)
Markj = 1
For j = 1 To MM
 If Min > d(j) Then
  Min = d(j)
  Markj = j
 End If
Next j
For j = 1 To MM
 For i = 1 To NN
  W(i, j) = W(i, j) + L * h(j, Markj) * (A(k, i) - W(i, j))
 Next i
Next j
Next t
AAA = AAA - 0.005
If AAA < 0.005 Then
AAA = 0.005
End If
End Sub

Public Sub Initial()
Dim i, j As Integer
Dim count As Integer
Dim Total As Double
For j = 1 To MM
 For i = 1 To NN
  W(i, j) = 0.5 + 0.1 * Rnd
 Next i
Next j
count = Int(Sqr(KK))
For i = 1 To KK / count
  For j = 1 To count
     A((i - 1) * count + j, 2) = (1 / count) * j
     A((i - 1) * count + j, 1) = (1 / count) * i
  Next j
Next i
count = Int(Sqr(MM))
For i = 1 To MM / count
  For j = 1 To count
     B((i - 1) * count + j, 2) = (1 / count) * j
     B((i - 1) * count + j, 1) = (1 / count) * i
  Next j
Next i
End Sub

Public Function h(y As Integer, yy As Integer) As Double '近傍函数
Dim i, j As Double
i = (B(y, 1) - B(yy, 1)) ^ 2 + (B(y, 2) - B(yy, 2)) ^ 2
j = AAA ^ 2
h = Exp(-i / j)
End Function

Public Sub Calculate()
Dim i, j As Integer
For j = 1 To MM
  BB(j) = 0
 For i = 1 To NN
  BB(j) = BB(j) + (AA(i) - W(i, j)) ^ 2
 Next i
 BB(j) = Sqr(BB(j))
Next j
End Sub






⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?