Visualisasi grafik besar untuk yang terkecil



Apa yang harus Anda lakukan jika Anda perlu menggambar grafik, tetapi alat-alat yang berada di bawah lengan Anda menggambar semacam gumpalan rambut atau bahkan melahap semua RAM dan menggantung sistem? Selama beberapa tahun terakhir bekerja dengan grafik besar (ratusan juta simpul dan tepi), saya telah mencoba banyak alat dan pendekatan, dan hampir tidak menemukan ulasan yang layak. Oleh karena itu, sekarang saya menulis ulasan sendiri.

Mengapa memvisualisasikan grafik sama sekali?


Temukan apa yang harus dicari


Pada input, kami biasanya hanya memiliki satu set simpul dan tepi, yang pada dasarnya adalah grafik. Kami dapat menghitung beberapa karakteristik statistik, grafik metrik dari itu, tetapi ini tidak akan memberi Anda gambaran yang jelas tentang apa itu. Visualisasi yang baik dapat menunjukkan apakah cluster memiliki jembatan atau jembatan, atau homogen, atau mungkin bergabung menjadi satu benjolan ke beberapa pusat daya tarik utama.

Membanggakan tentang


Visualisasi data, menurut definisi, memecahkan masalah representasi. Jika beberapa pekerjaan telah dilakukan, maka Anda dapat menunjukkan kesimpulan dalam gambar yang spektakuler. Misalnya, jika Anda melakukan pengelompokan grafik, Anda dapat mewarnai grafik dalam kelompok dan menunjukkan bagaimana label berbeda terkait satu sama lain.

Dapatkan tanda


Terlepas dari kenyataan bahwa algoritma visualisasi grafik terutama dikembangkan hanya sebagai alat untuk mendapatkan gambar, mereka dapat digunakan sebagai metode untuk mengurangi dimensi. Grafik itu sendiri, jika diwakili oleh matriks adjacency, adalah data dalam ruang dimensi tinggi, dan ketika rendering, kita mendapatkan dua koordinat untuk setiap simpul (kadang-kadang tiga atau lebih, tetapi ini merupakan pengecualian). Kedekatan simpul dalam visualisasi sering mengungkapkan kesamaan dalam sifat.

Apa masalah dengan grafik besar?


Dengan grafik besar yang saya maksud adalah dimensi, katakanlah, mulai dari 10 ribu simpul atau tepian. Untuk ukuran yang lebih kecil, biasanya tidak ada masalah, karena hampir semua alat yang dapat ditemukan dengan pencarian cepat di Internet pada dasarnya menyelesaikan masalah mereka dengan baik untuk volume seperti itu. Apa yang salah dengan grafik besar? Dua masalah: ini keterbacaan dan kecepatan. Diharapkan bahwa semakin banyak objek, semakin sulit untuk menavigasi mereka. Untuk grafik besar, gambar sering diperoleh yang tidak mungkin dimengerti. Selain itu, algoritma grafik umumnya sangat lambat, banyak memiliki kompleksitas algoritme yang sebanding dengan kuadrat (terkadang kubus) dari jumlah simpul dan / atau tepi. Bahkan jika Anda menunggu rendering, Anda masih tidak mampu untuk melewati banyak opsi untuk mendapatkan hasil yang memuaskan.

Apa yang ditulis oleh orang pintar yang berbeda tentang ini?


Ada beberapa karya yang ingin saya perhatikan:
[1] Helen Gibson, Joe Faith dan Paul Vickers: "Sebuah survei teknik tata letak grafik dua dimensi untuk visualisasi informasi"
Para pria pertama-tama memilah pendekatan apa yang ada untuk menggambar grafik, menjelaskan prinsip-prinsip pekerjaan, dan kemudian mencoba untuk mencoba semuanya. Ada tabel yang sangat terperinci dengan informasi tentang berbagai algoritma, termasuk kompleksitas algoritmanya.

[2] Oh-Hyun Kwon, Tarik Crnovrsanin dan Kwan-Liu Ma โ€œSeperti apa Grafik di Layout Ini? Pendekatan Pembelajaran Mesin untuk Visualisasi Grafik Besar โ€

Di sini, kawan-kawan kami menjadi sangat bingung dan mendapatkan semua implementasi algoritma visualisasi grafik yang mereka bisa. Kemudian mereka memvisualisasikan banyak grafik dan memberi tanda untuk markup. Menurut hasil, kami mengajarkan model untuk mengevaluasi seperti apa grafiknya pada opsi gaya yang berbeda. Saya mengambil beberapa gambar dari artikel ini.

Teori


Penumpukan adalah cara untuk memetakan koordinat ke setiap titik grafik. Biasanya kita berbicara tentang koordinat di pesawat, meskipun secara umum tidak harus pesawat. Cukup menggunakan lebih dari 2 dimensi hampir tidak pernah diperlukan.

Apa itu style yang bagus?



Sangat mudah untuk mengatakan bahwa sesuatu terlihat baik atau buruk, tetapi sulit untuk menjelaskan kepada mesin bagaimana memberikan penilaian seperti itu. Untuk membuat gaya "baik", apa yang disebut metrik "estetika" biasanya dioptimalkan, yang dirumuskan lebih objektif. Inilah beberapa di antaranya:

Minimum Rib Crossing
Sederhana: ketika ada banyak persimpangan, ternyata "bubur", ketika kecil, maka gambar terlihat "lebih bersih"

Puncak yang berdekatan berdekatan satu sama lain, tidak berdekatan jauh.
Grafik menurut definisi adalah satu set koneksi antara simpul dan satu set simpul. Membuat simpul terhubung lebih dekat satu sama lain adalah cara langsung dan logis untuk mengekspresikan sifat dasar data grafik.

Komunitas dikelompokkan
Ini mengikuti dari paragraf sebelumnya. Jika ada banyak node yang lebih terhubung satu sama lain daripada dengan seluruh grafik, mereka membentuk "komunitas" dan dalam gambar akan terlihat seperti cluster yang padat

Hamparan minimum dari simpul dan tepi
Cukup jelas. Jika kita tidak dapat melihat satu atau beberapa objek di sini, maka visualisasinya buruk dibaca.

Mendistribusikan simpul dan / atau tepi secara merata
Kondisi ini berguna jika properti grafik tidak memungkinkan untuk melihat setidaknya beberapa struktur. Sebagai contoh, jika kita memiliki seluruh grafik - itu adalah satu cluster padat, maka lebih baik untuk mengoleskannya pada gambar untuk melihat setidaknya ketidakrataan koneksi daripada membiarkannya bergabung menjadi satu tempat padat.



Apa saja penataannya


Saya menganggap penting untuk mempertimbangkan ketiga jenis penataan ini, walaupun ada banyak klasifikasi dan jenis. Namun, pengetahuan jenis ini cukup untuk menavigasi subjek.

  • Diarahkan secara paksa dan Berbasis Energi
  • Pengurangan Dimensi
  • Fitur Simpul

Diarahkan dengan Kekuatan dan Berbasis Energi




Metode ini menggunakan simulasi kekuatan fisik. Puncak diwakili sebagai partikel bermuatan yang saling tolak, dan ujung - sebagai tali elastis yang menyatukan puncak yang berdekatan. Kemudian, pergerakan simpul dalam sistem seperti itu disimulasikan sampai kondisi mapan tercapai. Pendekatan lain mencoba menggambarkan energi potensial dari sistem tersebut dan menemukan posisi simpul yang sesuai dengan minimum.

Kelebihan dari keluarga algoritma ini sebagai gambar. Biasanya diperoleh style yang sangat bagus yang mencerminkan topologi grafik. Kontra di antara parameter yang perlu dikonfigurasi. Baik dan, tentu saja, kompleksitas komputasi. Untuk setiap simpul, Anda perlu menghitung gaya yang bekerja dari semua simpul lainnya.

Algoritma keluarga penting adalah Force Atlas, Fruchterman-Reingold, Kamada Kawaii, dan OpenOrd. Algoritma terakhir menggunakan optimasi rumit, misalnya, memotong tepi panjang untuk mempercepat perhitungan, dan sebagai efek samping, lebih banyak kumpulan padat dari puncak dekat diperoleh.

Pengurangan Dimensi




Grafik dapat didefinisikan oleh matriks adjacency, yaitu oleh matriks kuadrat NxN, di mana N adalah jumlah simpul. Ini dapat diartikan sebagai objek N dalam ruang dimensi N. Representasi ini memungkinkan penggunaan metode universal mengurangi dimensi, seperti tSNE, UMAP, PCA, dan sebagainya. Pendekatan lain didasarkan pada penghitungan jarak teoretis antar simpul, berdasarkan bobot tepi dan pengetahuan topologi lokal, dan kemudian mencoba mempertahankan hubungan antara jarak-jarak ini ketika bergerak ke ruang-ruang dimensi yang lebih kecil.

Layout Berbasis Fitur




Biasanya data berasal dari dunia nyata, di mana kita tidak hanya memiliki informasi tentang kedekatan verteks. Puncak adalah beberapa benda nyata dengan propertinya sendiri. Mengingat ini, kita dapat menggunakan properti dari simpul untuk menampilkannya di pesawat. Untuk melakukan ini, Anda bisa menggunakan pendekatan apa pun yang biasa digunakan untuk data tabular. Ini adalah metode mengurangi dimensi PCA, UMAP, tSNE, Autoencoders yang telah disebutkan di atas. Atau Anda dapat menggambar plot sebar sederhana (plot sebar) untuk pasangan fitur dan menggambar tepi sudah di atas tampilan yang dihasilkan. Secara terpisah, kita dapat menyebutkan Hive Plot - metode yang menarik ketika nilai-nilai atribut sesuai dengan sumbu yang berbeda diarahkan dari pusat, di mana simpul berada, dan ujung-ujungnya digambar dengan lengkok di antara mereka.

Alat Visualisasi Grafik Besar



Terlepas dari kenyataan bahwa tugas visualisasi sudah tua dan relatif populer, ada masalah besar dengan alat untuk grafik besar. Sebagian besar dari mereka tidak didukung. Hampir setiap orang memiliki beberapa kekurangan serius, yang harus diatasi. Saya hanya akan berbicara tentang hal-hal yang layak disebutkan dan dapat digunakan untuk grafik besar. Untuk grafik kecil, tidak ada masalah - alatnya mudah ditemukan dan pada dasarnya berfungsi dengan baik.

GraphViz



Transaksi dan alamat Bitcoin blockchain hingga 2011


Mengonfigurasi pengaturan bisa jadi sulit

Alat CLI sekolah tua dengan bahasa deskripsi grafiknya sendiri - titik. Bahkan, ini adalah paket dengan gaya berbeda untuk setiap kesempatan. Untuk grafik besar, ada alat sfdp - ia termasuk dalam kelas penumpukan Force Directed. Kelebihan dan kekurangan alat ini dalam meluncurkan dari baris perintah. Ini sangat nyaman untuk reproduktifitas dan otomatisasi, namun, tanpa slider dan menampilkan hasil antara, pengaturan parameter menjadi sangat menyakitkan. Kami mengatur parameter, mulai, tunggu tanpa progress bar, lihat hasilnya, ubah parameter, restart. Mampu menulis dalam format svg, png dan gambar lainnya.

Gephi




Rekomendasi 173 ribu film dengan iMDB


Beberapa juta puncak sudah merupakan tugas yang terlalu sulit

Mungkin alat yang paling kuat secara keseluruhan. Ini adalah aplikasi GUI yang berisi serangkaian gaya dasar, serta banyak alat analisis grafik lainnya. Komunitas gephi telah menulis banyak plugin, seperti Multigravity Force-Atlas 2 favorit saya atau sebuah plugin untuk mengekspor gaya ke halaman web interaktif. Juga, implementasi OpenOrd asli terkandung dalam Gephi. Gephi memiliki alat untuk melukis simpul dan tepi sesuai dengan propertinya, mengatur keterangan, ukuran, dan opsi render lainnya. Ada ekspor ke format gambar utama, termasuk vektor.

Fakta yang sangat menjengkelkan adalah bahwa Gephi telah ditinggalkan selama beberapa tahun. Kedua pengembang utama, tidak memiliki sumber daya untuk mentransfer pengetahuan mereka yang diperlukan untuk pengembangan lebih lanjut kepada orang lain, mengatakan bahwa mereka tidak lagi dapat secara aktif mendukung Gephi. Kerugian lainnya termasuk "oakiness" tertentu dari antarmuka, dan kurangnya fitur yang jelas, tetapi tidak ada "hanya lebih baik," tidak ada yang menulis. Dari berita terbaru, sebuah pernyataan muncul di blog proyek bahwa kekuatan WebGL modern sudah menyalip Gephi lama dan ada peluang untuk melihatnya dilahirkan kembali sebagai aplikasi web.

igraph



Grafik rekomendasi musik dalam lastfm. Sumbernya ada di sini .

Seseorang tidak bisa tidak membayar upeti kepada paket keperluan umum ini untuk analisis grafik. Salah satu visualisasi grafik paling spektakuler pada masanya dibuat oleh salah satu penulis igraph. Dia mengembangkan gaya DrL untuk ini. Itu adalah grafik rekomendasi dari band lastfm. Hasilnya lebih tinggi.

Kerugiannya termasuk dokumentasi yang menjijikkan. Setidaknya ke api python. Lebih mudah untuk membaca sumbernya segera.

LargeViz



Beberapa puluh juta puncak (transaksi dan alamat) di salah satu kelompok terbesar dari blockchain Bitcoin

Keselamatan nyata saat Anda perlu menggambar grafik raksasa. LargeViz mengacu pada algoritma reduksi dimensi dan dapat digunakan tidak hanya untuk grafik, tetapi juga untuk data tabel acak. Ia bekerja dari baris perintah dan memiliki kinerja yang sangat baik. Sangat hemat dalam memori dan cepat.

Grafik



Alamat yang dapat diretas dalam seminggu, dan transaksinya


Antarmuka yang jelas, tetapi sangat terbatas, pengaturan standar yang masuk akal

Satu-satunya alat komersial dalam daftar ini. Graphistry adalah layanan yang mengambil data Anda dan melakukan perhitungan berat di sisinya. Klien hanya melihat gambar yang indah di browser. Sebenarnya, gephi tidak lebih baik dari opsi default yang wajar dan interaktivitas. Ini hanya menerapkan satu gaya: sesuatu yang mirip dengan ForceAtlas. Ada batas 800 ribu untuk jumlah simpul atau tepi maksimum.

Grafik Embeddings


Untuk ukuran gila, ada juga pendekatan. Sudah dimulai dengan sejuta simpul, ketika menggambar, masuk akal untuk melihat hanya kepadatan dari berbagai titik di ruang, hanya karena tidak ada yang bisa dilihat. Sebagian besar algoritma yang ditemukan secara khusus untuk rendering grafik akan bekerja selama puluhan juta simpul atau tepi selama berjam-jam, jika tidak berhari-hari. Anda dapat keluar dari situasi ini dengan menyelesaikan masalah yang sedikit berbeda. Ada banyak metode untuk mendapatkan representasi vektor dari dimensi yang diberikan, yang mencerminkan sifat-sifat simpul grafik. Setelah menerima representasi seperti itu, itu hanya mengurangi dimensi menjadi 2 untuk mendapatkan gambar sudah.

Node2Vec



Node2Vec + UMAP

Mengadaptasi word2vec biasa untuk grafik. Alih-alih urutan kata-kata, urutan simpul diambil untuk traversal acak grafik dan dikirim ke word2vec bukan kata-kata. Metode hanya memperhitungkan informasi tentang lingkungan simpul. Ini biasanya sudah cukup.

Ayat



VERSE + UMAP

Algoritma canggih untuk mendapatkan embedding grafik, yang berupaya mendapatkan representasi serbaguna untuk simpul, yaitu, memperhitungkan semua peran yang dibutuhkan sebuah simpul dalam grafik. Lingkungan simpul dan topologi lokal grafik diperhitungkan.

Konvolusi grafik



Konvolusi Grafik + Autoencoder

Ada banyak cara untuk menentukan operasi konvolusi pada grafik, tetapi pada dasarnya ini adalah "pengolesan" informasi pada grafik, sehingga simpul menerima informasi tentang tanda-tanda tetangga mereka. Anda dapat menambahkan informasi topologi lokal ke atribut ini.

Bonus: lebih banyak tentang konvolusi grafik


Semua pendekatan yang dijelaskan didasarkan pada beberapa alat yang sudah jadi. Kasus terakhir adalah pengecualian. Untuk mengimplementasikan konvolusi grafik, Anda perlu berpikir sedikit dan menulis sedikit kode.

Analisis terperinci tentang konvolusi pada grafik dan data non-Euclidean lainnya adalah topik yang layak untuk artikel terpisah. Di sini saya akan menjelaskan pendekatan dasar paling sederhana, yang tidak memerlukan kerangka grafik khusus dan mudah diskalakan. Jadi, kami ingin tanda-tanda setiap simpul grafik berisi informasi tentang tanda-tanda tetangga.

Bagaimana kita melakukan ini?


Cara yang paling jelas adalah dengan mengambil rata-rata tetangga. Jika Anda berpikir lebih banyak tentang apa yang terjadi dan informasi apa yang rata-rata hilang, Anda dapat menambahkan statistik lain di sana, seperti standar deviasi, minimum, maksimum, dan sebagainya.

Bagaimana cara mengaturnya sekarang? Untuk memulainya, grafik pada dasarnya adalah banyak simpul dan banyak sisi. Kami hanya tertarik pada bagian-bagian yang terhubung dari lebih dari satu titik, sehingga daftar tepi dalam kasus kami sepenuhnya menentukan grafik. Ini ditulis dengan mudah dalam bentuk tabel: di kolom pertama, simpul-simpul dari mana ujung keluar, di kolom kedua, tempat tepi-tepi ini masuk. Selanjutnya kita perlu membaca statistik. Ini adalah tugas yang sangat umum dan karena itu Anda dapat menggunakan kerangka kerja di mana semuanya dioptimalkan hingga kami.

Kekuatan kerangka tabel dalam analisis grafik


Kami sampai pada kesimpulan bahwa kami memiliki piringan yang menentukan grafik dan kami perlu membaca statistik untuk beberapa jumlah. Tabel dan statistik - semua ini ada dalam panda, jadi berikut ini akan menjadi contoh implementasi di dalamnya.

Untuk memulai, mari kita atur grafik:

ara = np.arange(101).reshape(-1, 1) sample = np.vstack((np.hstack((ara[:-1], ara[1:])), # forward links np.hstack((ara[1:], ara[:-1])))) # backward links 

Ini hanya rantai 101 simpul yang terhubung satu sama lain, seperti pada gambar.



Kemudian kita mengatur tanda-tanda simpul secara acak:

 feats = np.random.normal(size=(101, 10)) 

Dan kami akan membuat kerangka data panda dari ini semua:

 edges = pd.DataFrame(sample, columns=['source', 'target']) cols = ['col{}'.format(i) for i in range(10)] feats = pd.DataFrame(feats, columns=cols) feats['target'] = ara 

Sekarang kita mengatur fungsi konvolusi itu sendiri:

 def make_conv(edges, feats, cols, by, on, size=1000000, agg_f='mean', prefix='mean_'): """ edges -- edgelist: pandas dataframe with two columns (arguments by and on) feats -- features dataframe with key column (argument on) and features columns (argument cols) by -- column in edges to be used as source nodes on -- column in edges to be used as neighbor nodes size -- number of unique source nodes to be used in one chunk agg_f -- can be interpreted as pooling function. Pandas has several optimised functions for basic statistics, that can be passed as string arg (see pandas docs), but you also can provide any function you like prefix -- prefix for new column names """ res_feats = [] # used to stack result chunks # get chunk of unique source nodes for chunk in tqdm(chunker(edges[by].unique(), size=size), total=(len(edges[by].unique()) // size) + 1): # for each chunk we get feature matrix for neighbours temp = edges[edges[by].isin(chunk)]\ .merge(feats, on=on, how='left') # convolve and pool tempgb = temp[cols + [by, on]]\ .groupby(by).agg({col: agg_f for col in cols}).reset_index() res_feats.append(tempgb.rename(columns={c: prefix + c for c in cols})) # concat results return pd.concat(res_feats, axis=0).reset_index(drop=True) 

Apa yang terjadi di sini


Pertama, kami memilih sepotong simpul yang akan kami buat konvolusi, mengambil semua tepinya, menyatukannya dengan tanda-tanda tetangga dan menulisnya ke kerangka data temp. Kemudian kita kelompokkan dengan simpul dari sumber, dan agregat menggunakan fungsi agg_f, yang secara sederhana rata-rata. Tambahkan hasil untuk bagian saat ini ke daftar, dan pada akhirnya hanya menyatukan hasilnya.


Untuk grafik ini, akan terlihat seperti ini


Kami menerapkan fungsi dan menggambar hasilnya:

 conv1 = make_conv(edges, feats, cols, 'source', 'target') plt.figure(figsize=(3, 8)) plt.imshow(np.hstack((feats[cols].values, conv1.values[:, 1:])), cmap='jet'); 


Tanda-tanda awal, kemudian yang asli dan hasil dari konvolusi pertama, kemudian yang asli dan hasil dari dua konvolusi.


Misalnya, kasus sederhana semacam itu dipilih secara khusus sehingga mudah untuk melihat secara visual bagaimana tanda-tanda itu "dioleskan" pada tetangga jika Anda secara langsung menggambar matriks tanda-tanda. Dalam kasus yang lebih umum, prosesnya terlihat seperti ini:



Jika Anda ingin sedikit lebih banyak matematika


Jika Anda pernah mendengar tentang konvolusi grafik sebelumnya, maka kemungkinan besar itu berada dalam konteks jaringan konvolusi grafik (Graph Convolutional Networks - GCN). Bagi sebagian orang, trik dengan tablet yang dijelaskan di sini mungkin tampak "tidak sulit." Bahkan, satu artikel yang sangat menarik dikhususkan untuk penggunaan konvolusi grafik tanpa pembelajaran mendalam: "Penyederhanaan Grafik Jaringan Konvolusional". Ini memberikan definisi konvolusi H(k) leftarrowSH(kโˆ’1)dimana HMerupakan matriks fitur, dan SAdalah Laplacian yang dinormalisasi dari grafik, yang didefinisikan seperti ini: S= tildeDโˆ’ frac12 tildeA tildeD frac12disini  tildeAApakah matriks adjacency dari grafik disimpulkan dengan matriks identitas, dan  tildeD- matriks di diagonal di mana derajat simpul grafik direkam. Dan semua ini ditulis dalam beberapa baris dalam python menggunakan scipy dan numpy:

 S = sparse.csgraph.laplacian(adj, normed=True) feats_conv = S @ feats 

Di sini sparse adalah modul di dalam scipy untuk bekerja dengan matriks sparse, adj adalah matriks adjacency, dan feats dan feats_conv adalah tanda-tanda sebelum dan sesudah konvolusi. Pendekatan ini lebih teliti, tetapi skalanya sangat buruk. Selain itu, jika Anda berpikir sedikit tentang arti dari apa yang terjadi, maka ini setara dengan perbedaan antara nilai fitur pada titik dan rata-rata di tetangga titik, yaitu, itu dapat sepenuhnya diselesaikan dengan skema sebelumnya dengan tabel, jika Anda menambahkan satu operasi.

Referensi


Ulasan Visualisasi Grafik
leonidzhukov.net/hse/2018/sna/papers/gibson2013
arxiv.org/pdf/1710.04328.pdf

Penyederhanaan Grafik Jaringan Konvolusional
arxiv.org/pdf/1902.07153.pdf

GraphViz
graphviz.org

Gephi
gephi.org

igraph
igraph.org

LargeViz
arxiv.org/abs/1602.00370
github.com/lferry007/LargeVis

Grafik
www.graphistry.com

Node2Vec
snap.stanford.edu/node2vec
github.com/xgfs/node2vec-c

Ayat
tsitsul.in/publications/verse
github.com/xgfs/verse

Notebook dengan kode paket panda penuh
github.com/iggisv9t/graph-stuff/blob/master/Universal%20Convolver%20Example.ipynb

Konvolusi grafik
Berikut adalah karya-karya yang dikumpulkan pada jaringan konvolusi grafik: github.com/thunlp/GNNPapers

Inti dari keseluruhan artikel dalam satu tabel


<100 K<1 M> 1 M.
Gephi: ForceAtlas (dll.)Gephi: OpenOrd
(+ ForceAtlas setelah)
LargeViz
GraphViz: sfdpEmbeddings + Pengurangan Dimensi

Source: https://habr.com/ru/post/id464715/


All Articles