In a project about the self-organizing map, in which I used miniSom library when I used 0 for the neighborhood radius (sigma) only one node was the winner (node 0,0). I would like to know if it is due to the implementation or if it is an expected result based on the way SOM works?
As you know, initialization of the weight vectors of a SOM map is random and setting the neighborhood radius to zero actually affect the mapping performance by resulting a twisted map. So the result of mapping can not reflect the true structure and topology of data. About the problem of same winner for all input data, it can be happen when the variables have different scale than the network weight. scaling the variables (ie. range scaling) can solve this problem but the resulted map still is inconsistent with radius=0. In your case, the relative position of the samples on the top map depends to the initial weight of the network (and order of sample representation) not the similarity between samples which is not a good choice for training.
Simply speaking, a neighborhood radius set to zero means that no neighbors are updated. MiniSom comments state that the sigma at each iteration is updated, based on timestep
t and total number of iterations
T, as follows.
sigma(t) = sigma / (1 + t/T)https://github.com/JustGlowing/minisom/blob/master/minisom.py#L83
sigma = 0 means that there will be no neighborhood property. Indeed, any
sigma < 0.5 will have a negligible neighborhood property. Thus, at each timestep, with
sigma = 0, the best matching unit for each data point will be updated towards it, but there will be no neighbor interaction. Depending on your initialization and normalization, it might be possible that every single data point in the set of observations best matches the node 0,0. In this case, over time, that node will be set to the average of the set of observations, while all other nodes will be unaffected.
To fix this problem, I'd suggest normalizing the data so that it fits the range of the codebook vectors. However, looking at MiniSom https://github.com/JustGlowing/minisom/blob/master/minisom.py#L263, the codebook vectors are initialized scaled to the range of the input data. There are some comments there about normalization for PCA initialization, but my intuition is that even without that, not every single data point would best match the center node 0,0, so I think that something is strange in the statement: "when I used 0 for the neighborhood radius (sigma) only one node was the winner (node 0,0)". Maybe there was some other problem as well?