{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Working with networks and Graphs\n", "\n", "In this lab we will use **networkx** to work with graphs and use it to analyse social networks, like given in the lecture.\n", "\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8\n", "6\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", "import scipy as sp\n", "\n", "\n", "G=nx.Graph()\n", "\n", "G.add_nodes_from([1,2,3,4,5,6,7,8])\n", "G.add_edges_from([(1, 2), (1, 3),(3,4),(5,8),(5,7),(6,8) ])\n", "\n", "print(G.number_of_nodes())\n", "print(G.number_of_edges())\n", "\n", "plt.subplot(121)\n", "nx.draw(G, with_labels=True, font_weight='bold')\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Task \n", " \n", "Write a function which creates for given Graph G the **Graph-Laplacian-Matrix**, computes her eigenvalues and counts the number of zero eigenvalues. Return this number of zero eigenvalues. Think about this number and components of the graph." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "def components(G):\n", " #TODO\n", " c=0\n", " return c\n", "\n" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "G has 0 components\n" ] } ], "source": [ "# now check this function for our graph\n", "print ( 'G has %d components' % ( components(G) ) )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now add 1 edge between the componnts of the graph and check again:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "G has 0 components\n" ] } ], "source": [ "G.add_edge(3,5)\n", "print ( 'G has %d components' % ( components(G) ) )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Complete Graph\n", "\n", "Write a function which creates the so called **Complete Graph**, consisting of n nodes and edges between all nodes." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "# Own implementation instead of\n", "# G = nx.complete_graph(n) \n", "def compl_graph(n):\n", " # TODO\n", " 0\n", " #return T\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now create the complete graphs for n=1,2 ... let's say 6 , count the edges, plot the graphs and think about:\n", "* a formula for the number of edges\n", "* which of the graphs can be plotted without having edge intersections ? " ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#TODO\n", "#TODO\n", "#TODO\n", "#TODO\n", "#TODO\n", "#TODO\n" ] } ], "source": [ "nmax=6\n", "# TODO\n", "for i in range(1,nmax+1):\n", " print('#TODO')\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Social networks\n", "\n", "Here we want to create a random social network and analyse it.\n", "At first write a function which creates randomly the graph of a social network for a list of given names and a probability for a connection between two names." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "import random\n", "def make_network(p,names):\n", " print('TODO')\n", " \n", " \n", " " ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TODO\n" ] } ], "source": [ "names=['Anton','Berta','Cäsar','Dieter','Elli','Franz','Greta']\n", "p=0.6\n", "G=make_network(p,names)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now write a function which analyses the network, like in the lecture. Play around with different connection probabilities p." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "# TODO" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we change the input, such that we no longer use a global probability p for all people,\n", "we give everybody hist own probability how he likes to interact with other.\n", "Use a list of dictionaries, like given in the example:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[{'name': 'Anton', 'prob': 0.2}, {'name': 'Berta', 'prob': 0.8}]\n" ] } ], "source": [ "mynetwork2=[\n", " {\"name\":\"Anton\",\"prob\":0.2},\n", " {\"name\":\"Berta\",\"prob\":0.8}\n", "]\n", "\n", "print(mynetwork2)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "# create the Graph for given network dictionary list\n", "def make_network2(npdict_list):\n", " print(\"TODO\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Expand the dictionary list from above to approx. 20 names with different connectivity-probabilities. ( Hint: create influencer and outsider too).\n", "Analyse the network again.\n", "\n" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "#TODO" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 4 }