# [✓]Create a network of 300 nodes that can be clustered into 100-node chunks

Posted 10 months ago
973 Views
|
3 Replies
|
5 Total Likes
|
 I have a rather basic problem where I am asked to create a network of 300 nodes that can be clustered into 100-node chunks. Essentially, the nodes have many connections within a chunk and comparatively few between different100-node chunks. For example, if I made the connections with a chunk occur with 100% probability and between chunks occur 0% I get the following: edges = {}; For[l = 1, l <= 3 , l++, h = 100*l; For[n = 100 (l - 1) + 1, n < 100*l + 1, n++, For[m = n + 1, m <= 300, m++, If[m <= h, If[RandomReal[{0, 1}] > 0.0, AppendTo[edges, n <-> m]], If[RandomReal[{0, 1}] > 0.99, AppendTo[edges, n <-> m]]]]]] which is expected and gives a corresponding MatrixPlot of the Adjacency Matrix as:Which is also all well and good. Now, something very strange seems to be going on when I try to make the connections between the 100-node chunks be non zero. For example, if I made the probability be 1%, the folowing is obtained:This looks ok, but it becomes very evident that there is a problem when one looks at the corresponding Matrix Plot of the Adjacency Matrix Evidently, there is a very big problem somewhere. I did try to check this in a bit more detail and it seems that everything is working properly with the Matrix Plot. It seems that there is somewhere a problem with my code - but where? The code, in my opinion, seems rather simple and straightforward. I am really confused with what the issue is and could use assistance, it doesn't seem possible that Mathematica would have a problem with something so basic.
3 Replies
Sort By:
Posted 10 months ago
 I'd say the indexing of vertices in the AdjacencyMatrix is simply not the same as when you created your Edges list. Looking at your outside-the-square-in-the-same-column/row parts of your MatrixPlot, I would suspect that the vertices to which the vertices of your first group connected were put in the next positions of AdjacencyMatrix indices in the sequence they first showed up on your Edges list.I suspect you will simply have to rearrange your AdjacencyMatrix rows and columns 'by hand' to get a 'clean' MatrixPlot.Hope this helps.
 The model you are trying to implement is called the stochastic block model. IGraph/M has it built in. g = IGStochasticBlockModelGame[{{1, 0.01, 0.01}, {0.01, 1, 0.01}, {0.01, 0.01, 1}}, {100, 100, 100}]  IGAdjacencyMatrixPlot[g]  As for why you don't see this adjacency matrix: look at VertexList[g] for your graph and my graph. Both have vertices named as 1, 2, ..., 300, but yours has them in some random order, which the adjacency matrix follows. Remember that the vertex name is not the same thing as the vertex index. The name can be anything. The index goes from one to the vertex count, and corresponds to the position of the vertex in the VertexList. The rows/columns of the AdjacencyMatrix follow the same order. You could use Graph[Range[300], edges] to control the vertex ordering. Or you could reorder vertices in an existing graph with IGReoderVertices from IGraph/M Finally, if you're new to Mathematica, I strongly suggest you forget that For even exists in the language. If you use it, you'll certainly end up doing things in a convoluted, un-Mathematica-like way, which will slow down your learning process. See https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica/12