Skip to content

Instantly share code, notes, and snippets.

@mikk-c
Created August 5, 2024 12:09
Show Gist options
  • Select an option

  • Save mikk-c/04381e470c9e3498e4420a683b1c8e45 to your computer and use it in GitHub Desktop.

Select an option

Save mikk-c/04381e470c9e3498e4420a683b1c8e45 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "063bca5f-37a1-41f0-8ee7-7c08bb0b6f89",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import networkx as nx\n",
"import matplotlib.pyplot as plt\n",
"from gensim.models import Word2Vec\n",
"from sklearn.manifold import TSNE\n",
"from sklearn.cluster import KMeans\n",
"from sklearn.metrics import normalized_mutual_info_score\n",
"from sklearn.metrics import roc_curve"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "7e7e21a7-aea5-41bb-8529-b9cc466cfb69",
"metadata": {},
"outputs": [],
"source": [
"H = nx.read_edgelist(\"1/data.txt\", create_using = nx.Graph(), delimiter = \"\\t\", nodetype = int)\n",
"G = nx.Graph()\n",
"G.add_nodes_from(sorted(H.nodes))\n",
"G.add_edges_from(H.edges)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "832dd9ed-e829-470a-b34e-12d0f8bf53d6",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 14.759112 , -22.18216 ],\n",
" [ 11.133976 , -17.434958 ],\n",
" [ 3.5819514, -20.613283 ],\n",
" ...,\n",
" [-13.967737 , 40.632137 ],\n",
" [ 12.587541 , -36.26705 ],\n",
" [ 22.70264 , 16.082893 ]], dtype=float32)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rndwalks = list(nx.generate_random_paths(G, 10000, path_length = 6))\n",
"model = Word2Vec(sentences = rndwalks, vector_size = 32, min_count = 1, workers = 8)\n",
"\n",
"nodemap = [None] * len(G.nodes)\n",
"for k in model.wv.key_to_index:\n",
" nodemap[k] = model.wv.key_to_index[k]\n",
"\n",
"reducer = TSNE(n_components = 2, init = \"pca\")\n",
"embeddings = reducer.fit_transform(model.wv.vectors[nodemap])\n",
"\n",
"embeddings"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "3470a119-ed3c-4931-940b-f9a29235ee52",
"metadata": {},
"outputs": [],
"source": [
"new_edges = set()\n",
"with open(\"4/newedges.txt\", 'r') as f:\n",
" for line in f:\n",
" fields = line.strip().split('\\t')\n",
" new_edges.add((int(fields[0]), int(fields[1])))\n",
"\n",
"nodes = list(G.nodes)\n",
"old_edges = set(G.edges)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "de04e44c-8306-4bf8-ad79-b6192e09cb8e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>n1</th>\n",
" <th>n2</th>\n",
" <th>score</th>\n",
" <th>is_old</th>\n",
" <th>is_new</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>551.072632</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>510.113556</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>-750.582764</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>-46.566391</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>452.921570</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>499490</th>\n",
" <td>995</td>\n",
" <td>996</td>\n",
" <td>1824.993408</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>499492</th>\n",
" <td>995</td>\n",
" <td>998</td>\n",
" <td>-1632.569580</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>499493</th>\n",
" <td>995</td>\n",
" <td>999</td>\n",
" <td>337.774719</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>499495</th>\n",
" <td>996</td>\n",
" <td>998</td>\n",
" <td>-1647.424561</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>499497</th>\n",
" <td>997</td>\n",
" <td>998</td>\n",
" <td>-1649.427246</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>495404 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" n1 n2 score is_old is_new\n",
"0 0 1 551.072632 False False\n",
"1 0 2 510.113556 False False\n",
"2 0 3 -750.582764 False False\n",
"3 0 4 -46.566391 False False\n",
"4 0 5 452.921570 False False\n",
"... ... ... ... ... ...\n",
"499490 995 996 1824.993408 False False\n",
"499492 995 998 -1632.569580 False False\n",
"499493 995 999 337.774719 False False\n",
"499495 996 998 -1647.424561 False False\n",
"499497 997 998 -1649.427246 False False\n",
"\n",
"[495404 rows x 5 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linkpred = []\n",
"for i in range(len(nodes) - 1):\n",
" for j in range(i + 1, len(nodes)):\n",
" is_old = (nodes[i], nodes[j]) in old_edges or (nodes[j], nodes[i]) in old_edges\n",
" is_new = (nodes[i], nodes[j]) in new_edges or (nodes[j], nodes[i]) in new_edges\n",
" linkpred.append((nodes[i], nodes[j], embeddings[i].T.dot(embeddings[j]), is_old, is_new))\n",
"\n",
"linkpred = pd.DataFrame(data = linkpred, columns = (\"n1\", \"n2\", \"score\", \"is_old\", \"is_new\"))\n",
"linkpred = linkpred[~linkpred[\"is_old\"]]\n",
"\n",
"linkpred"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "008a23bb-a93c-496d-aafa-f6b46c5fbd1f",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fpr, tpr, thresholds = roc_curve(linkpred[\"is_new\"], linkpred[\"score\"])\n",
"\n",
"plt.plot([0, 1], [0, 1], color = 'gray', lw = 1)\n",
"plt.plot(fpr, tpr)\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment