From fc5eb04fc44d88e87fa94484056ba2d772bf7d9f Mon Sep 17 00:00:00 2001 From: Luca Lombardo Date: Thu, 8 Dec 2022 01:10:33 +0100 Subject: [PATCH] Added tex relation 'cause I'm masochist --- .gitignore | 13 +- main.py | 49 +++-- ref.bib | 11 ++ testing.ipynb | 509 ++++++++++++++++++++++++++++++++++++++++++++------ tex/main.pdf | Bin 0 -> 67967 bytes tex/main.tex | 91 +++++++++ tex/ref.bib | 56 ++++++ 7 files changed, 651 insertions(+), 78 deletions(-) create mode 100644 ref.bib create mode 100644 tex/main.pdf create mode 100644 tex/main.tex create mode 100644 tex/ref.bib diff --git a/.gitignore b/.gitignore index 1f72e06..ae6c52c 100644 --- a/.gitignore +++ b/.gitignore @@ -129,5 +129,16 @@ dmypy.json .pyre/ # Data folder - data/ + +# Latex stuff + +*.aux +*.bbl +*.blg +*.fdb_latexmk +*.fls +*.log +*.out +*.synctex.gz +*.toc diff --git a/main.py b/main.py index 75cd39f..e9c8940 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,17 @@ import wget import zipfile import networkx as nx import pandas as pd +from typing import Literal + + +""" +NOTEs: + +- This file is note meant to be run, it's just a collection of functions that are used in the other files. It's just a way to keep the code clean and organized. + +- Why do I use os.path.join and not the "/"? Because it's more portable, it works on every OS, while "/" works only on Linux and Mac. If you want to use it on Windows, you have to change all the "/" with "\". With os.path.join you don't have to worry about it and, as always, f*** Microsoft. +""" + def download_datasets(): @@ -55,7 +66,7 @@ def download_datasets(): Then, if there is no dataset_tsmc2014 folder, it unzips the file. Then move all the .txt files inside the dataset_tsmc2014 folder in the foursquare folder. Then delete the dataset_tsmc2014 folder and the .zip file. """ - for file in os.listdir("data/foursquare"): + for file in os.listdir(os.path.join("data", "foursquare")): if file.endswith(".zip"): if os.path.exists(os.path.join("data", "foursquare", "dataset_tsmc2014")): if len(os.listdir(os.path.join("data", "foursquare"))) == 3: @@ -84,7 +95,7 @@ def download_datasets(): if file.endswith(".gz"): os.system("gunzip {}".format(os.path.join("data", "gowalla", file))) -def create_graph(dataset): +def create_graph(dataset: Literal['brightkite', 'gowalla']) -> nx.Graph: """ This function takes in input a tsv file with two columns, Each line in the file is an edge. The function returns an undirected networkx graph object. It uses pandas to read the file since it's faster than the standard python open() function. If we don't want to use the standard python open() function, the following code works as well: @@ -97,36 +108,38 @@ def create_graph(dataset): """ - if dataset == "brightkite": - file = os.path.join("data", "brightkite", "loc-brightkite_edges.txt") - elif dataset == "gowalla": - file = os.path.join("data", "gowalla", "loc-gowalla_edges.txt") - else: + if dataset not in ["brightkite", "gowalla"]: raise ValueError("The dataset must be brightkite or gowalla. If you want to use the foursquare dataset, use the create_foursquare_graph() function") + file = os.path.join("data", dataset, "loc-{}_edges.txt".format(dataset)) df = pd.read_csv(file, sep="\t", header=None, names=["node1", "node2"]) G = nx.from_pandas_edgelist(df, "node1", "node2", create_using=nx.Graph()) return G -def create_foursquare_graph(dataset): - # we are given a .txt in tsv format, with 8 colums. Read the file with pandas, the first two colums are colles "UserID" and "VenueID", the other 6 are useless. Then create a graph with networkx for this function. The unique users ID are the nodes, two nodes are linked, if they have been in the same venue at least once. The weight of the edge is the number of times they have been in the same venue. +def create_foursquare_graph(dataset: Literal['NYC', 'TKY'])-> nx.Graph: + + """ + This function takes in input a tsv file with 8 columns, each line in the file is a check-in. The function returns an undirected networkx graph object. + + Differently from the function create_graph used for the brightkite and gowalla dataset, we are not given a list of edges, so we can't use the function nx.from_pandas_edgelist. We have to create the graph manually. + + Firstly, we retrive the unique user ID using the set() data structure: this are the nodes of our graph. Since we don't want to work with adjacency matrices due to their O(mn) space complexity (even tho, we could memorize them in a compressed way thanks to their sparsity propriety), we use an adjacency list representation of the graph. We create a dictionary with the users ID as keys and the venues ID as values. Two users are connected if they have visited the same venue at least once. The weight of the edge is the number of common venues. + """ + + if dataset not in ["NYC", "TKY"]: + raise ValueError("The dataset must be NYC or TKY") - if dataset == "NYC": - file = os.path.join("data", "foursquare", "dataset_TSMC2014_NYC.txt") - elif dataset == "TKY": - file = os.path.join("data", "foursquare", "dataset_TSMC2014_TKY.txt") + file = os.path.join("data", "foursquare", "dataset_TSMC2014_{}.txt".format(dataset)) - df = pd.read_csv(file, sep="\t", header=None, names=["UserID", "VenueID", "CategoryID", "CategoryName", "Latitude", "Longitude", "Timezone offset in minutes", "UTC time"]) + df = pd.read_csv(file, sep="\t", header=None, names=["UserID", "VenueID", "CategoryID", "CategoryName", "Latitude", "Longitude", "Timezone offset in minutes", "UTC time"], encoding="utf-8", encoding_errors="ignore") - # use the set() data structure to get the unique users ID - users = set(df["UserID"]) + users = set(df["UserID"]) # get the unique users ID G = nx.Graph() G.add_nodes_from(users) - # create a dictionary with the users ID as keys and the venues ID as values - users_venues = {} + users_venues = {} # key: user ID, value: set of venues ID for user in users: users_venues[user] = set(df[df["UserID"] == user]["VenueID"]) diff --git a/ref.bib b/ref.bib new file mode 100644 index 0000000..3df3100 --- /dev/null +++ b/ref.bib @@ -0,0 +1,11 @@ +@article{yang2014modeling, + author={Yang, Dingqi and Zhang, Daqing and Zheng, Vincent. W. and Yu, Zhiyong}, + journal={IEEE Transactions on Systems, Man, and Cybernetics: Systems}, + title={Modeling User Activity Preference by Leveraging User Spatial Temporal Characteristics in LBSNs}, + year={2015}, + volume={45}, + number={1}, + pages={129--142}, + ISSN={2168-2216}, + publisher={IEEE} +} diff --git a/testing.ipynb b/testing.ipynb index 365a935..a93bef8 100644 --- a/testing.ipynb +++ b/testing.ipynb @@ -63,8 +63,7 @@ "text": [ "The brightkite dataset is already downloaded and extracted as .txt file, if you want to download again the .gz file with this function, delete the .txt files in the folder\n", "The gowalla dataset is already downloaded and extracted as .txt file, if you want to download again the .gz file with this function, delete the .txt files in the folder\n", - "Downloading foursquare dataset...\n", - "Download completed of foursquare dataset\n" + "The foursquare dataset is already downloaded and extracted as .txt file, if you want to download again the .gz file with this function, delete the .txt files in the folder\n" ] } ], @@ -87,11 +86,106 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
usercheck-in timelatitudelongitudelocation_id
002010-10-17T01:48:53Z39.747652-104.99251088c46bf20db295831bd2d1718ad7e6f5
102010-10-16T06:02:04Z39.891383-105.0708147a0f88982aa015062b95e3b4843f9ca2
202010-10-16T03:48:54Z39.891077-105.068532dd7cd3d264c2d063832db506fba8bf79
302010-10-14T18:25:51Z39.750469-104.9990739848afcc62e500a01cf6fbf24b797732f8963683
402010-10-14T00:21:47Z39.752713-104.9963372ef143e12038c870038df53e0478cefc
\n", + "
" + ], + "text/plain": [ + " user check-in time latitude longitude \\\n", + "0 0 2010-10-17T01:48:53Z 39.747652 -104.992510 \n", + "1 0 2010-10-16T06:02:04Z 39.891383 -105.070814 \n", + "2 0 2010-10-16T03:48:54Z 39.891077 -105.068532 \n", + "3 0 2010-10-14T18:25:51Z 39.750469 -104.999073 \n", + "4 0 2010-10-14T00:21:47Z 39.752713 -104.996337 \n", + "\n", + " location_id \n", + "0 88c46bf20db295831bd2d1718ad7e6f5 \n", + "1 7a0f88982aa015062b95e3b4843f9ca2 \n", + "2 dd7cd3d264c2d063832db506fba8bf79 \n", + "3 9848afcc62e500a01cf6fbf24b797732f8963683 \n", + "4 2ef143e12038c870038df53e0478cefc " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "Brightkite_df = pd.read_csv(\"data/brightkite/loc-brightkite_totalCheckins.txt.gz\", sep=\"\\t\", header=None, compression=\"gzip\", names=[\"user\", \"check-in time\", \"latitude\", \"longitude\", \"location_id\"])\n", + "brightkite_path = os.path.join(\"data\", \"brightkite\", \"loc-brightkite_totalCheckins.txt\")\n", + "Brightkite_df = pd.read_csv(brightkite_path, sep=\"\\t\", header=None, names=[\"user\", \"check-in time\", \"latitude\", \"longitude\", \"location_id\"])\n", "\n", "Brightkite_df.head()" ] @@ -109,11 +203,100 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
usercheck-in timelatitudelongitudelocation_id
002010-10-19T23:55:27Z30.235909-97.79514022847
102010-10-18T22:17:43Z30.269103-97.749395420315
202010-10-17T23:42:03Z30.255731-97.763386316637
302010-10-17T19:26:05Z30.263418-97.75759716516
402010-10-16T18:50:42Z30.274292-97.7405235535878
\n", + "
" + ], + "text/plain": [ + " user check-in time latitude longitude location_id\n", + "0 0 2010-10-19T23:55:27Z 30.235909 -97.795140 22847\n", + "1 0 2010-10-18T22:17:43Z 30.269103 -97.749395 420315\n", + "2 0 2010-10-17T23:42:03Z 30.255731 -97.763386 316637\n", + "3 0 2010-10-17T19:26:05Z 30.263418 -97.757597 16516\n", + "4 0 2010-10-16T18:50:42Z 30.274292 -97.740523 5535878" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "Gowalla_df = pd.read_csv(\"data/gowalla/loc-gowalla_totalCheckins.txt.gz\", sep=\"\\t\", header=None, compression=\"gzip\", names=[\"user\", \"check-in time\", \"latitude\", \"longitude\", \"location_id\"])\n", + "gowalla_path = os.path.join(\"data\", \"gowalla\", \"loc-gowalla_totalCheckins.txt\")\n", + "\n", + "Gowalla_df = pd.read_csv(gowalla_path, sep=\"\\t\", header=None, names=[\"user\", \"check-in time\", \"latitude\", \"longitude\", \"location_id\"])\n", "\n", "Gowalla_df.head() " ] @@ -124,24 +307,156 @@ "source": [ "## Foursquare\n", "\n", - "DA RISCRIVERE" + "[Foursquare](https://foursquare.com/) is a location-based social networking website where users share their locations by checking-in. This dataset includes long-term (about 10 months) check-in data in New York city and Tokyo collected from Foursquare from 12 April 2012 to 16 February 2013. It contains two files in tsv format. Each file contains 8 columns, which are:\n", + "\n", + "1. User ID (anonymized)\n", + "2. Venue ID (Foursquare)\n", + "3. Venue category ID (Foursquare)\n", + "4. Venue category name (Foursquare)\n", + "5. Latitude\n", + "6. Longitude\n", + "7. Timezone offset in minutes (The offset in minutes between when this check-in occurred and the same time in UTC)\n", + "8. UTC time\n", + "\n", + "Here is an example of check-in information from the New York dataset:" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", + "execution_count": 5, "metadata": {}, - "source": [] + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
UserIDVenueIDCategoryIDCategoryNameLatitudeLongitudeTimezone offset in minutesUTC time
047049bbd6c0f964a520f4531fe34bf58dd8d48988d127951735Arts & Crafts Store40.719810-74.002581-240Tue Apr 03 18:00:09 +0000 2012
19794a43c0aef964a520c6a61fe34bf58dd8d48988d1df941735Bridge40.606800-74.044170-240Tue Apr 03 18:00:25 +0000 2012
2694c5cc7b485a1e21e00d357114bf58dd8d48988d103941735Home (private)40.716162-73.883070-240Tue Apr 03 18:02:24 +0000 2012
33954bc7086715a7ef3bef9878da4bf58dd8d48988d104941735Medical Center40.745164-73.982519-240Tue Apr 03 18:02:41 +0000 2012
4874cf2c5321d18a143951b5cec4bf58dd8d48988d1cb941735Food Truck40.740104-73.989658-240Tue Apr 03 18:03:00 +0000 2012
\n", + "
" + ], + "text/plain": [ + " UserID VenueID CategoryID \\\n", + "0 470 49bbd6c0f964a520f4531fe3 4bf58dd8d48988d127951735 \n", + "1 979 4a43c0aef964a520c6a61fe3 4bf58dd8d48988d1df941735 \n", + "2 69 4c5cc7b485a1e21e00d35711 4bf58dd8d48988d103941735 \n", + "3 395 4bc7086715a7ef3bef9878da 4bf58dd8d48988d104941735 \n", + "4 87 4cf2c5321d18a143951b5cec 4bf58dd8d48988d1cb941735 \n", + "\n", + " CategoryName Latitude Longitude Timezone offset in minutes \\\n", + "0 Arts & Crafts Store 40.719810 -74.002581 -240 \n", + "1 Bridge 40.606800 -74.044170 -240 \n", + "2 Home (private) 40.716162 -73.883070 -240 \n", + "3 Medical Center 40.745164 -73.982519 -240 \n", + "4 Food Truck 40.740104 -73.989658 -240 \n", + "\n", + " UTC time \n", + "0 Tue Apr 03 18:00:09 +0000 2012 \n", + "1 Tue Apr 03 18:00:25 +0000 2012 \n", + "2 Tue Apr 03 18:02:24 +0000 2012 \n", + "3 Tue Apr 03 18:02:41 +0000 2012 \n", + "4 Tue Apr 03 18:03:00 +0000 2012 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "foursquare_NYC_path = ny = os.path.join(\"data\", \"foursquare\", \"dataset_TSMC2014_NYC.txt\")\n", + "foursquare_TKY_path = ny = os.path.join(\"data\", \"foursquare\", \"dataset_TSMC2014_TKY.txt\")\n", + "\n", + "foursquare_NYC_df = pd.read_csv(foursquare_NYC_path, sep=\"\\t\", header=None, names=[\"UserID\", \"VenueID\", \"CategoryID\", \"CategoryName\", \"Latitude\", \"Longitude\", \"Timezone offset in minutes\", \"UTC time\"], encoding=\"utf-8\", encoding_errors=\"ignore\")\n", + "\n", + "foursquare_NYC_df.head()" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -149,7 +464,7 @@ "\n", "del Brightkite_df\n", "del Gowalla_df\n", - "del Foursquare_checks_df" + "del foursquare_NYC_df" ] }, { @@ -165,47 +480,14 @@ "source": [ "We are asked to construct the networks for the three datasets as un undirected grah $M = (V, E)$, where $V$ is the set of nodes and $E$ is the set of edges. The nodes represent the users and the edges indicates that two individuals visited the same location at least once.\n", "\n", - "We can use the fucntion create_graph from the utils module to create the networks. It takes as input the path to an edge list file and returns a networkx graph object. For further details about the function below, please refer to the `utils` module." + "We can use the fucntion create_graph from the `utils` module to create the networks. It takes as input the path to an edge list file and returns a networkx graph object. For further details about the function below, please refer to the `utils` module." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 7, "metadata": {}, - "outputs": [ - { - "ename": "UnicodeDecodeError", - "evalue": "'utf-8' codec can't decode byte 0xe9 in position 3: unexpected end of data", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._convert_tokens\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._convert_with_dtype\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._string_convert\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers._string_box_utf8\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-8' codec can't decode byte 0xe9 in position 3: unexpected end of data", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/ipykernel_154187/2796184490.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mBrightkite_G\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcreate_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"brightkite\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mGowalla_G\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcreate_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"gowalla\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mFoursquare_G\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcreate_foursquare_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"NYC\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/github/small-worlds/main.py\u001b[0m in \u001b[0;36mcreate_foursquare_graph\u001b[0;34m(dataset)\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[0mfile\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"data\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"foursquare\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"dataset_TSMC2014_TKY.txt\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 121\u001b[0;31m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"\\t\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheader\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnames\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"UserID\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"VenueID\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"CategoryID\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"CategoryName\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Latitude\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Longitude\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Timezone offset in minutes\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"UTC time\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 122\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[0;31m# use the set() data structure to get the unique users ID\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/util/_decorators.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_arg_name\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_arg_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 211\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 212\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 213\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/util/_decorators.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 315\u001b[0m \u001b[0mstacklevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfind_stack_level\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minspect\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrentframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 316\u001b[0m )\n\u001b[0;32m--> 317\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 318\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 319\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)\u001b[0m\n\u001b[1;32m 948\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwds_defaults\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 949\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 950\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 951\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 952\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 609\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 610\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mparser\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 611\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mparser\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnrows\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 612\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 613\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36mread\u001b[0;34m(self, nrows)\u001b[0m\n\u001b[1;32m 1770\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1771\u001b[0m \u001b[0mcol_dict\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1772\u001b[0;31m \u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0;31m# type: ignore[attr-defined]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1773\u001b[0m \u001b[0mnrows\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1774\u001b[0m )\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/c_parser_wrapper.py\u001b[0m in \u001b[0;36mread\u001b[0;34m(self, nrows)\u001b[0m\n\u001b[1;32m 241\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 242\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlow_memory\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 243\u001b[0;31m \u001b[0mchunks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_low_memory\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnrows\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 244\u001b[0m \u001b[0;31m# destructive to chunks\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 245\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_concatenate_chunks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchunks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader.read_low_memory\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._read_rows\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._convert_column_data\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._convert_tokens\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._convert_with_dtype\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._string_convert\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers._string_box_utf8\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-8' codec can't decode byte 0xe9 in position 3: unexpected end of data" - ] - } - ], + "outputs": [], "source": [ "Brightkite_G = create_graph(\"brightkite\")\n", "Gowalla_G = create_graph(\"gowalla\")\n", @@ -221,14 +503,123 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
datasetnodesedges
0brightkite58228214078
1gowalla196591950327
2foursquare1083282405
\n", + "
" + ], + "text/plain": [ + " dataset nodes edges\n", + "0 brightkite 58228 214078\n", + "1 gowalla 196591 950327\n", + "2 foursquare 1083 282405" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "print(\"Brightkite graph has {} nodes and {} edges\".format(Brightkite_G.number_of_nodes(), Brightkite_G.number_of_edges()))\n", + "dataset = [\"brightkite\", \"gowalla\", \"foursquare\"]\n", + "nodes = [len(Brightkite_G.nodes()), len(Gowalla_G.nodes()), len(Foursquare_G.nodes())]\n", + "edges = [len(Brightkite_G.edges()), len(Gowalla_G.edges()), len(Foursquare_G.edges())]\n", "\n", - "print(\"Gowalla graph has {} nodes and {} edges\".format(Gowalla_G.number_of_nodes(), Gowalla_G.number_of_edges()))" + "df = pd.DataFrame({\"dataset\": dataset, \"nodes\": nodes, \"edges\": edges})\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see, the foursquare dataset has a very small number of nodes. Even tho it has 227428 check-ins, the unique users (the nodes) are only 1083. The Tokyo dataset is about 2 times bigger, with 537703 check-ins and 2294 nodes. Since we are in the same order of magnitude, we will focus on the New York dataset, in the style of a classic Hollywood movie about aliens invasions." ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Analysis of the structure of the networks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Given a social network, which of its nodes are more central? This question has been asked many times in sociology, psychology and computer science, and a whole plethora of centrality measures (a.k.a. centrality indices, or rankings) were proposed to account for the importance of the nodes of a network. \n", + "\n", + "These networks, typically generated directly or indirectly by human activity and interaction (and therefore hereafter dubbed social”), appear in a large variety of contexts and often exhibit a surprisingly similar structure. One of the most important notions that researchers have been trying to capture in such networks is “node centrality”: ideally, every node (often representing an individual) has some degree of influence or importance within the social domain under consideration, and one expects such importance to surface in the structure of the social network; centrality is a quantitative measure that aims at\n", + "revealing the importance of a node.\n", + "\n", + "Among the types of centrality that have been considered in the literature, many have to do with distances between nodes. Take, for instance, a node in an undirected connected network: if the sum of distances to all other nodes is large, the node under consideration is peripheral; this is the starting point to define Bavelas’s closeness centrality [cite], which is the reciprocal of peripherality (i.e., the reciprocal of the sum of distances to all other nodes).\n", + "\n", + "The role played by shortest paths is justified by one of the most well-known features of complex networks, the so-called small-world phenomenon. A small-world network [cite] is a graph where the average distance between nodes is logarithmic in the size of the network, whereas the clustering coefficient is larger (that is, neighborhoods tend to be denser) than in a random Erdős-Rényi graph with the same size and average distance. The fact that social networks (whether electronically mediated or not) exhibit the small-world property is known at least since Milgram’s famous experiment [cite] and is arguably the most popular of all features of complex networks. For instance, the average distance of the Facebook graph was recently established to be just 4.74\n", + "\n", + "## Definitions and conventions\n", + "\n", + "From now on, we consider directed graphs defined by a set $N$ of $n$ nodes and $A \\subseteq N \\times N$ of arcs. We write\n", + "\n", + "For this project, we will focus on the following centrality measures:\n", + "\n", + "- **Degree centrality**\n", + "- **Clustering Coefficient**\n", + "- **Average Path Length**\n", + "- **Betweenness Centrality**\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { diff --git a/tex/main.pdf b/tex/main.pdf new file mode 100644 index 0000000000000000000000000000000000000000..13616363505d2d0edb5298ed167faa462f313000 GIT binary patch literal 67967 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 whji~8w6&R0H$PSE+gJW~A~I7k^a}06ZdCd;kCd literal 0 HcmV?d00001 diff --git a/tex/main.tex b/tex/main.tex new file mode 100644 index 0000000..962b164 --- /dev/null +++ b/tex/main.tex @@ -0,0 +1,91 @@ +\documentclass[12pt]{article} +\usepackage[margin=1in]{geometry} +\usepackage[utf8]{inputenc} +\usepackage[english]{babel} +\usepackage[T1]{fontenc} +\usepackage{fourier} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{latexsym} +\usepackage{graphicx} +\usepackage{float} +\usepackage{etoolbox} +\usepackage{hyperref} +\usepackage{tikz} +\usepackage{lipsum} +\usepackage{algorithm} +\usepackage{algpseudocode} + +\newcommand{\R}{\mathbb{R}} +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} +\newcommand{\s}{\vspace*{0.4cm}} +\newcommand{\nd}{\noindent} + +% add counters + +\title{Spatial networks and small worlds} +\author{Luca Lombardo} +\date{Dicember 2022} + +\begin{document} +\maketitle + +\begin{abstract} + \noindent \lipsum[1] +\end{abstract} + +\tableofcontents +\clearpage + +\section{Introduction} +Given a social network, which of its nodes are more central? This question has been asked many times in sociology, psychology and computer science, and a whole plethora of centrality measures (a.k.a. centrality indices, or rankings) were proposed to account for the importance of the nodes of a network. \s + +\nd These networks, typically generated directly or indirectly by human activity and interaction (and therefore hereafter dubbed social”), appear in a large variety of contexts and often exhibit a surprisingly similar structure. One of the most important notions that researchers have been trying to capture in such networks is “node centrality”: ideally, every node (often representing an individual) has some degree of influence or importance within the social domain under consideration, and one expects such importance to surface in the structure of the social network; centrality is a quantitative measure that aims at revealing the importance of a node. \s + +\nd Among the types of centrality that have been considered in the literature, many have to do with distances between nodes. Take, for instance, a node in an undirected connected network: if the sum of distances to all other nodes is large, the node under consideration is peripheral; this is the starting point to define Bavelas's closeness centrality \cite{closeness}, which is the reciprocal of peripherality (i.e., the reciprocal of the sum of distances to all other nodes). \s + +\nd The role played by shortest paths is justified by one of the most well-known features of complex networks, the so-called small-world phenomenon. A small-world network \cite{cohen_havlin_2010} is a graph where the average distance between nodes is logarithmic in the size of the network, whereas the clustering coefficient is larger (that is, neighborhoods tend to be denser) than in a random Erdős-Rényi graph with the same size and average distance. The fact that social networks (whether electronically mediated or not) exhibit the small-world property is known at least since Milgram's famous experiment \cite{} and is arguably the most popular of all features of complex networks. For instance, the average distance of the Facebook graph was recently established to be just $4.74$ \cite{milgram1967small}. \s + +\subsection*{Definitions and conventions} + +From now on, we consider directed graphs defined by a set $N$ of $n$ nodes and $A \subseteq N \times N$ of arcs. We write $x \to y$ when $(x,y) \in A$ and call $x$ and $y$ the source and the target of the arc, respectively. \s +\clearpage + +\subsection*{Aim of the project} + +The Aim of the project is to study the small-world phenomenon in location-based (social) networks. As test cases, we consider three real-world datasets: Brightkite, Gowalla and Foursquare. In the next sections, we will describe the datasets and the methodology we used to extract the networks from them. \s + +\nd We are interest in analyzing 4 different centrality measures: + +\begin{itemize} + \item Distribution of Degree + \item Clustering coefficient + \item Average Path Length + \item Betweenness Centrality +\end{itemize} +\clearpage + + +\section{Theoretical background on centrality measures} + +Centrality is a fundamental tool in the study of social networks: the first efforts to define formally centrality indices were put forth in the late 1940s by the Group Networks Laboratory at MIT directed by Alex Bavelas \cite{closeness}; those pioneering experiments concluded that centrality was related to group efficiency in problem-solving, and agreed with the subjects' perception of leadership. In the following decades, various measures of centrality were employed in a multitude of contexts. \s + +\subsection*{Geometric measures} + +We call geometric those measures assuming that importance is a function of distances; more precisely, a geometric centrality depends only on how many nodes exist at every distance. These are some of the oldest measures defined in the literature. + +\paragraph*{In-degree centrality} Indegree, the number of incoming arcs $d^-(x)$, can be considered a geometric measure: it is simply the number of nodes at distance one\footnote{Most centrality measures proposed in the literature were actually described only for undirected, connected graphs. Since the study of web graphs and online social networks has posed the problem of extending centrality concepts to networks that are directed, and possibly not strongly connected, in the rest of this paper we consider measures depending on the incoming arcs of a node (e.g., incoming paths, left dominant eigenvectors, distances from all nodes to a fixed node). If necessary, these measures can be called “negative”, as opposed to the “positive” versions obtained by considering outgoing paths, or (equivalently) by transposing the graph.} . It is probably the oldest measure of importance ever used, as it is equivalent to majority voting in elections (where $x \to y$ if $x$ voted for $y$). Indegree has a number of obvious shortcomings (e.g., it is easy to spam), but it is a good baseline. \s + +\nd Other notable geometric measures that we will not explore in this project, are \emph{closeness centrality}, (which is the reciprocal of the sum of distances to all other nodes, and betweenness centrality, which is the number of shortest paths that pass through a node), \emph{Lin's index} (which is the sum of the distances to all other nodes), and \emph{Harmonic Centrality} (which is a generalization of the closeness centrality). \s + + +\clearpage +\bibliographystyle{unsrt} +\bibliography{ref} +\nocite{*} +\end{document} diff --git a/tex/ref.bib b/tex/ref.bib new file mode 100644 index 0000000..42cb0b0 --- /dev/null +++ b/tex/ref.bib @@ -0,0 +1,56 @@ +@article{yang2014modeling, + author={Yang, Dingqi and Zhang, Daqing and Zheng, Vincent. W. and Yu, Zhiyong}, + journal={IEEE Transactions on Systems, Man, and Cybernetics: Systems}, + title={Modeling User Activity Preference by Leveraging User Spatial Temporal Characteristics in LBSNs}, + year={2015}, + volume={45}, + number={1}, + pages={129--142}, + ISSN={2168-2216}, + publisher={IEEE} +} + +@article{closeness, + ISSN = {00932914}, + URL = {http://www.jstor.org/stable/44135428}, + author = {Alex Bavelas}, + journal = {Applied Anthropology}, + number = {3}, + pages = {16--30}, + publisher = {Society for Applied Anthropology}, + title = {A MATHEMATICAL MODEL FOR GROUP STRUCTURES}, + urldate = {2022-12-07}, + volume = {7}, + year = {1948} +} + +@book{cohen_havlin_2010, place={Cambridge}, title={Complex Networks: Structure, Robustness and Function}, DOI={10.1017/CBO9780511780356}, publisher={Cambridge University Press}, author={Cohen, Reuven and Havlin, Shlomo}, year={2010}} + +@misc{https://doi.org/10.48550/arxiv.1111.4570, + doi = {10.48550/ARXIV.1111.4570}, + + url = {https://arxiv.org/abs/1111.4570}, + + author = {Backstrom, Lars and Boldi, Paolo and Rosa, Marco and Ugander, Johan and Vigna, Sebastiano}, + + keywords = {Social and Information Networks (cs.SI), Physics and Society (physics.soc-ph), FOS: Computer and information sciences, FOS: Computer and information sciences, FOS: Physical sciences, FOS: Physical sciences}, + + title = {Four Degrees of Separation}, + + publisher = {arXiv}, + + year = {2011}, + + copyright = {arXiv.org perpetual, non-exclusive license} +} + +@article{milgram1967small, + title={The small world problem}, + author={Milgram, Stanley}, + journal={Psychology today}, + volume={2}, + number={1}, + pages={60--67}, + year={1967}, + publisher={New York} +}