
Hierarchical clustering 1: Dissimilarity Matrix

The first step in heirarchical clustering involves creating a dis-similarity matrix (wave: DisSimilarityMatrix)
The input to the algorithm is wave: Cluster_Waves which is a 2D wave. The rows represent samples (for example a time-trace) and columns represent repeats/different experiments.
The function MakeDisSimilarityMatrix takes Cluster_Waves as input and computes the dissimilarity matrix.
The function ComputeDissimilarity2waves computes the difference between 2 columns in Cluster_Waves. The computation is threadsafe and is sped-up by the usage of multiple cores.
The helper function ImageTransformRowCol is based on Igor's imagetransform getcol function that works also on 1D waves.
Example:
//--- create a variable wave with 10 samples with 2 clusters; the first 5 samples belong to the first cluster
make/o/n=(100,10) testWave=gnoise(1)+(q>5)
MakeDisSimilarityMatrix(testWave)//---compute the dissimilarity table
//---a helper function, similar to imagetransform for 1/2 dim waves threadsafe Function/wave ImageTransformRowCol(variable row,variable col,wave inputwave) make/o/n=1 ExtractedWave if(numpnts(inputwave)>1) if(numtype(row)==0) if((dimsize(inputwave,0)<=1)) duplicate/o inputwave,ExtractedWave elseif((dimsize(inputwave,0)>1)&&(dimsize(inputwave,1)>0)) imagetransform/g=(row) getrow inputwave wave W_ExtractedRow duplicate/o W_ExtractedRow,ExtractedWave endif else if((dimsize(inputwave,1)<=1)) duplicate/o inputwave,ExtractedWave elseif((dimsize(inputwave,1)>1)&&(dimsize(inputwave,1)>col)) imagetransform/g=(col) getcol inputwave wave W_ExtractedCol duplicate/o W_ExtractedCol,ExtractedWave endif endif endif return ExtractedWave end //---actual clustering //---find the difference between two waves Threadsafe function ComputeDissimilarity2waves(wave Cluster_Waves,variable pos1,variable pos2) duplicate/o ImageTransformRowCol(nan,pos1,Cluster_Waves),waveI duplicate/o ImageTransformRowCol(nan,pos2,Cluster_Waves),waveJ waveI=(waveI-waveJ)^2 //--- squared difference between the two waves return sqrt(sum(waveI))/numpnts(waveI) end //---creates the dissimilarity matrix based on the selected experiments //---we assume that the wave Cluster_Waves is a 2D wave in which the columns represent different samples (for example, a recorded time-trace). Function MakeDisSimilarityMatrix(wave Cluster_Waves) variable i,j,reg make/o/n=(dimsize(Cluster_Waves,1),dimsize(Cluster_Waves,1)) DisSimilarityMatrix=nan Variable n_,nthreads= ThreadProcessorCount Variable threadGroupID= ThreadGroupCreate(nthreads) for(i=0;i<dimsize(DisSimilarityMatrix,0)-1;i++) j=i+1 do for(n_=0;n_<nthreads;n_++) if(n_+j<dimsize(DisSimilarityMatrix,0)) ThreadStart threadGroupID,n_,ComputeDissimilarity2waves(Cluster_Waves,i,n_+j)//---populate the similarity matrix endif endfor do Variable threadGroupStatus = ThreadGroupWait(threadGroupID,1000) while( threadGroupStatus != 0 )//---release threads for(n_=0;n_<nthreads;n_++) if(n_+j<dimsize(DisSimilarityMatrix,0)) DisSimilarityMatrix[i][n_+j]=ThreadReturnValue(threadGroupID,n_) DisSimilarityMatrix[n_+j][i]=DisSimilarityMatrix[i][n_+j] endif endfor j+=n_ while(j<dimsize(DisSimilarityMatrix,0)) endfor Variable dummy= ThreadGroupRelease(-2) //---release threads end

Forum

Support

Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More