Unsupervised clustering (vector quantization)

Helper functions

Convergence test function for iterative algorithms

conv[param1_, param2_] := Module[{df}, df = Flatten[param1] - Flatten[param2] ; Sqrt[(Plus @@ (df . df))/Length[df]] ] ;

Distance metric between two vectors

dist = Compile[{{a, _Real, 1}, {b, _Real, 1}}, Sqrt[(a - b) . (a - b)]] ;

Class assignment

Assign class-centroid labels to single datum

AssignClassOne[x_, μs_] := Module[{tmp}, tmp = dist[x, #] & /@ μs ; Position[tmp, Min[tmp]] // Flatten // First] ;

Assign class-centroid labels to data set

AssignClass[data_, μs_] := AssignClassOne[#, μs] & /@ data ;

Centroid recomputing

VQUpdate[data_, μs_] := Module[{k, cl}, k = Length[μs] ; cl  ... a, μs] ; Mean /@ (Part[data, Flatten[Position[cl, #]]] & /@ Range[k]) ] ;

LBG VQ algorithm

One level of Linde-Buzo-Grey (LBG) VQ algorithm

VQUpdateToConvergence[data_, μs_, tst_:.001] := NestWhile[VQUpdate[data, #] &, μs, (conv[#1, #2] >tst) &, 2] ;

Splitting of centroids

RowBox[{RowBox[{DoubleCentroids, [, RowBox[{μs_, ,,  , RowBox[{ϵ_:, 0.0001}]}], ]}], :=, , Flatten[{μs - ϵ, μs + ϵ}, 1]}]

Full LBG VQ algorithm

VQ[data_, m_:1, tst_:.001] := Module[{μs}, μs = {Mean[data]} ; ɯ ... 71;μs = VQUpdateToConvergence[data, μs, tst], {m} ] ; μs] ;

Full LBG VQ algorithm (w/all intermediate results)

VQAll[data_, m_:1, tst_:.001] := Module[{μs}, μs = Table[, {m + 1}]  ... UpdateToConvergence[data, μs[[i + 1]], tst], {i, 1, m} ] ; μs] ;

Compute distortion

VQDistortion[data_, μs_] := Module[{k, cl}, k = Length[μs] ;  ... 6;s] ; Plus @@ (dist[μs[[#[[1]]]], #[[2]]] &/@ Transpose[{cl, data}]) ] ;


Created by Mathematica  (February 16, 2004)