📄 mdusom.bas
字号:
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -