'Filename: "cVQ.vb" Public Class cVQ Private Cluster As ArrayList = New ArrayList(1) Private NumPatterns As Integer 'Number of patterns Private SizeVector As Integer 'Number of dimensions in vector Private NumClusters As Integer 'Current number of clusters Private Threshold As Double Public Sub New(ByVal nClusters As Integer, ByVal nPatterns As Integer, _ ByVal vSize As Integer, ByVal vThreshold As Double) Dim aCluster As cCluster Dim i As Integer 'Create an array of cCluster objects. aCluster = New cCluster(vSize, nPatterns) Cluster.Add(aCluster) For i = 1 To nClusters - 1 aCluster = New cCluster(vSize, nPatterns) Cluster.Add(aCluster) Next i 'Initialize other variables. NumPatterns = nPatterns SizeVector = vSize Threshold = vThreshold NumClusters = 0 End Sub Public Function RunVQ(ByVal Pattern As Double(,)) As String Dim pat As Integer Dim winner As Integer Dim dist As Double Dim tempText As String = "" For pat = 0 To NumPatterns - 1 'Attach the curr input to closest cluster. winner = FindClosestCluster(pat, Pattern) If winner = -1 Then winner = AllocateCluster() Else dist = EucNorm(pat, winner, Pattern) dist = Math.Sqrt(dist) 'get root of the distance measure. If dist > Threshold Then winner = AllocateCluster() 'Allocate new cluster. tempText += vbCrLf + "Creating NEW cluster number: " + _ CStr(winner) + vbCrLf + vbCrLf End If End If tempText += "Pattern " + CStr(pat) + " assigned to cluster " + _ CStr(winner) + vbCrLf Attach(winner, pat) 'Attach pattern to winner. tempText += CalcNewClustCenter(winner, Pattern) 'Adapt cluster center. Next pat Return tempText End Function Private Function AllocateCluster() As Integer Dim n As Integer n = NumClusters NumClusters += 1 Return n End Function Private Function EucNorm(ByVal p As Integer, ByVal c As Integer, _ ByVal Pattern As Double(,)) As Double 'Calculate Euclidean norm of vector, p. Dim i As Integer Dim aCluster As cCluster Dim dist As Double = 0 'dist is the difference between pattern vector, p, 'and cluster center, c. aCluster = Cluster(c) For i = 0 To SizeVector - 1 'Square the difference between p and c dist += (aCluster.getCenter(i) - Pattern(p, i)) * _ (aCluster.getCenter(i) - Pattern(p, i)) Next i Return dist End Function Private Function FindClosestCluster(ByVal pat As Integer, _ ByVal Pattern As Double(,)) As Integer Dim i As Integer Dim ClustID As Integer Dim MinDist, d As Double MinDist = Math.Pow(10, 10) 'Just some large number. ClustID = -1 For i = 0 To NumClusters - 1 d = EucNorm(pat, i, Pattern) If d < MinDist Then MinDist = d ClustID = i End If Next i Return ClustID End Function Private Sub Attach(ByVal c As Integer, ByVal p As Integer) Dim MemberIndex As Integer Dim aCluster As cCluster aCluster = Cluster(c) MemberIndex = aCluster.getNumMembers() aCluster.setMember(MemberIndex) = p aCluster.setNumMembers() = aCluster.getNumMembers() + 1 End Sub Private Function CalcNewClustCenter(ByVal c As Integer, _ ByVal Pattern As Double(,)) As String Dim vecID As Integer Dim j, k, nMembers As Integer Dim aCluster As cCluster Dim tempString As String = "" Dim tmp(SizeVector - 1) As Double For j = 0 To SizeVector - 1 tmp(j) = 0 Next j aCluster = Cluster(c) nMembers = aCluster.getNumMembers() For j = 0 To nMembers - 1 'cycle through member vectors vecID = aCluster.getMember(j) For k = 0 To SizeVector - 1 'cycle through elements of vector tempString += "Cluster " + CStr(c) + " Pattern[" + CStr(vecID) + _ "][" + CStr(k) + " = " + CStr(Pattern(vecID, k)) + _ ", Member_ID = " + CStr(vecID) + vbCrLf tmp(k) += Pattern(vecID, k) 'add (member) pattern element into temp Next k Next j For k = 0 To SizeVector - 1 'cycle through elements of vector tmp(k) = tmp(k) / aCluster.getNumMembers() aCluster.setCenter(k) = tmp(k) Next k Return tempString End Function Public ReadOnly Property getCluster(ByVal index As Integer) Get Return Cluster(index) End Get End Property Public ReadOnly Property getNumClusters() Get Return NumClusters End Get End Property End Class