Hello Small World
Nov
源起
在 Wikipedia 上看到一篇 Newman 的文章,講到網路的數學,主要談分析 social network 資料與建構數學模型。於是想要看看如何在 java 中玩一下。
分析這類網路往往想知道重點 (centrality measures) 所在,簡單的 (degree centrality)看連線多的。越多連線,越重要,越值得推薦。
問題在於連線的對象也應該納入考慮,連到大尾(或是比較喜歡)的,應該比較值得推薦,於是出現特徵向量評估方式 eigenvector centrality。文中還提到另外以路徑 Path 評估網路(重)點的方法。
觀察網路慢慢會發現一種特殊的現象,就是某種網路節點之間的聯繫遠比預期的還要緊密,路邊轉角賣吃的或是太空中的太空人可能是你朋友的朋友或是親戚。
提到這個現象,都會說到 Stanley Milgram 的寄信給陌生人實驗,找個朋友請他轉寄,看看經過幾手可以轉寄到該陌生人手上,觀察結果大都不超過六次,可以看出人際關係的網路遠比一般人認為的還要緊密。
http://en.wikipedia.org/wiki/Eigenvector_centrality
http://en.wikipedia.org/wiki/Social_network
http://en.wikipedia.org/wiki/Small-world_network
http://www.cs.cornell.edu/home/kleinber/
JUNG
Java Universal Network/Graph Framework 是個功能很多的工具,提供兩種世界真小的兩種模擬網路 KleinbergSmallWorldGenerator 跟 WattsBetaSmallWorldGenerator。
很方便的可以掛到 Swing 輸出。
WattsBetaSmallWorldGenerator gen = new WattsBetaSmallWorldGenerator(20, 0.1 , 6); Graph g = (Graph) gen.generateGraph(); JFrame jf = new JFrame(); VisualizationViewer vv = new VisualizationViewer(new SpringLayout(g), new PluggableRenderer()); jf.getContentPane().add(vv); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true);
或是輸出 PNG 來看看。
VisualizationViewer vv = new VisualizationViewer(new SpringLayout(g),
new PluggableRenderer(), new Dimension(600,600));
vv.setSize(600,600);
Container c = new Container();
BufferedImage bi = new BufferedImage(600,600,BufferedImage.TYPE_INT_RGB);
Graphics2D gr = bi.createGraphics();
c.addNotify();
c.add(vv);
c.setVisible(true);
c.paintComponents(gr);
ImageIO.write(bi, "png", new File("testdata/smallworld.png"));
結果出現在下面,應該可以再調。

觀察
- 畫出的網路很緊,要如何用等下次有機會再多看書。
- 數學的知識在畢業時沒帶走,都留給學校了。