Cluster a correlation matrix

Average rating
(1 vote)

This code demonstrates how you can cluster data using the correlation matrix.

// Create a correlation matrix from fake data, in this case with 2 embedded patterns and 
// relative noise of 0.25.  
FakeCorrelationMatrix(2,0.25)
 
// Cluster the correlation matrix with 2 expected patterns.  
// Picks starting cluster guesses randomly and for high values of noise it might give a poor 
// result.   The /SEED=(ticks) flag makes it give random initial guesses on each run.  
CorrelationClustering(2,Fake_Corr_Matrix)
 
// Display the data with cluster assignment, the original correlation matrix, and the clustered correlation matrix.  
Graph0(); Graph1(); Graph2()
 
// Create fake data and a correlation matrix from it.  
Function FakeCorrelationMatrix(num_patterns,relative_noise)
	Variable num_patterns // The number of patterns in the fake data.  
	Variable relative_noise // The standard deviation of the noise relative to the signal.  
	Variable length=50 // Each pattern should have this length.  
	Variable num_signals=30 // The number of cells/channels/signals in the fake data.  
	Make /o/n=(length,num_patterns) Base_Patterns=gnoise(1) // Make  a bunch of canonical patterns.  
	Make /o/n=(length,num_signals) Data // The matrix of fake data.  
	Make /o/n=(length,num_signals) Waterfall_Colors=q // Colors for the waterfall plot.  
	Make /o/n=(num_signals) Pattern_Values=floor(abs(enoise(num_patterns))) // The true pattern identities, chosen as an integer 0 to num_patterns-1.  
	Variable i
	for(i=0;i<num_signals;i+=1)
		Data[][i]=Base_Patterns[p][Pattern_Values[i]] // Each row will be a different pattern.   
		Data+=gnoise(relative_noise) // Add noise to everything.  
	endfor
	MatrixOp /O Fake_Corr_Matrix=syncCorrelation(Data) // Compute the covariance matrix.  
	MatrixOp /O Variances=varcols(Data)
	Fake_Corr_Matrix/=sqrt(Variances[p]*Variances[q]) // Convert to degree of correlation.  
	KillWaves /Z Base_Patterns,Variances // Cleanup.  
End
 
// Cluster a correlation matrix by swapping rows (and columns).  
Function CorrelationClustering(num_patterns,Corr_Matrix)
	Variable num_patterns // Number of patterns that you expect to find.  
	Wave Corr_Matrix // The correlation (or covariance) matrix.  
	KMeans /INIT=1 /NCLS=(num_patterns) /OUT=2 /SEED=(ticks) Corr_Matrix // K-Means clustering.  
	Duplicate /o Corr_Matrix Clustered_Matrix // Prepared the clustered correlation matrix.  
	Duplicate /o W_KMMembers Sorting_Index; Sorting_Index=p
	Sort W_KMMembers,Sorting_Index // Create a sorting index to use to swap out rows (and columns).  
	Clustered_Matrix=Corr_Matrix[Sorting_Index[p]][Sorting_Index[q]] // Shuffle rows (and columns).  
	Wave /Z Waterfall_Colors
	if(WaveExists(Waterfall_Colors))
		Wave W_KMMembers // The pattern number that each signal most represents (the K-Means clustering result).  
		Waterfall_Colors=W_KMMembers[q] // Color the waterfall plot according to the clustering result.  
	endif
	KillWaves /Z M_KMClasses,W_KMMembers // Cleanup.  
End
 
Window Graph0() : Graph
	PauseUpdate; Silent 1		// building window...
	Display /W=(509.25,50,924,358.25) as "Raw Correlation Matrix"
	AppendImage/T Fake_Corr_Matrix
	ModifyImage Fake_Corr_Matrix ctab= {-1,*,RedWhiteBlue,0}
	ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
	ModifyGraph mirror=2
	ModifyGraph nticks=4
	ModifyGraph minor=1
	ModifyGraph fSize=9
	ModifyGraph standoff=0
	ModifyGraph tkLblRot(left)=90
	ModifyGraph btLen=3
	ModifyGraph tlOffset=-2
	SetAxis/A/R left
EndMacro
 
Window Graph1() : Graph
	PauseUpdate; Silent 1		// building window...
	Display /W=(2.25,386.75,438.75,743.75) as "Clustered Correlation Matrix"
	AppendImage/T Clustered_Matrix
	ModifyImage Clustered_Matrix ctab= {-1,1,RedWhiteBlue,0}
	ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
	ModifyGraph mirror=2
	ModifyGraph nticks=3
	ModifyGraph minor=1
	ModifyGraph fSize=9
	ModifyGraph standoff=0
	ModifyGraph tkLblRot(left)=90
	ModifyGraph btLen=3
	ModifyGraph tlOffset=-2
	SetAxis/A/R left
EndMacro
 
Window Graph2() : Graph
	PauseUpdate; Silent 1		// building window...
	NewWaterfall /W=(-0.75,47,510.75,362.75)Data as "Data"
	ModifyWaterfall angle=45, axlen= 0.6, hidden= 0
	ModifyGraph negRGB=(0,0,65535)
	ModifyGraph zColor(Data)={Waterfall_Colors,*,*,Rainbow}
EndMacro

Very nice... Is there an

Very nice... Is there an analogues of this code for the MATLAB? That would be truly valuable :)

Back to top