{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install -r node2vec/requirements.txt" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install --upgrade gensim" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Walk iteration:\n", "1 / 40\n", "2 / 40\n", "3 / 40\n", "4 / 40\n", "5 / 40\n", "6 / 40\n", "7 / 40\n", "8 / 40\n", "9 / 40\n", "10 / 40\n", "11 / 40\n", "12 / 40\n", "13 / 40\n", "14 / 40\n", "15 / 40\n", "16 / 40\n", "17 / 40\n", "18 / 40\n", "19 / 40\n", "20 / 40\n", "21 / 40\n", "22 / 40\n", "23 / 40\n", "24 / 40\n", "25 / 40\n", "26 / 40\n", "27 / 40\n", "28 / 40\n", "29 / 40\n", "30 / 40\n", "31 / 40\n", "32 / 40\n", "33 / 40\n", "34 / 40\n", "35 / 40\n", "36 / 40\n", "37 / 40\n", "38 / 40\n", "39 / 40\n", "40 / 40\n" ] } ], "source": [ "!python node2vec/src/main.py --input jrtechs.edgelist --output output/jrtechs2.emd --num-walks=40 --dimensions=50" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "39\n" ] } ], "source": [ "labels=[]\n", "vectors=[]\n", "\n", "with open(\"output/jrtechs2.emd\") as fp:\n", " for line in fp:\n", " l_list = list(map(float, line.split()))\n", " vectors.append(l_list[1::])\n", " labels.append(line.split()[0])\n", " \n", "print(len(labels))" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [], "source": [ "name_map = {}\n", "with open(\"friendsMap.map\") as fp:\n", " for line in fp:\n", " name_map[line.split()[0]] = line.split()[1]" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'76561198188400721': 'jrtechs',\n", " '76561198049526995': 'Noosh',\n", " '76561198067517157': 'nweis76',\n", " '76561198131175960': 'Delta_∆',\n", " '76561198084464357': 'Ceta',\n", " '76561198085584420': 'PureMaths',\n", " '76561198068647768': 'Void',\n", " '76561198094968588': 'Dumcumpster',\n", " '76561198107069713': 'yankeeman1081',\n", " '76561198086854442': 'jspike397',\n", " '76561198273751201': 'Kyon',\n", " '76561198083124245': 'drichardson005',\n", " '76561198035606013': 'BK🐻',\n", " '76561198255835078': 'Zelazny',\n", " '76561198170096391': 'Greata',\n", " '76561198306786411': 'fazeboojujee',\n", " '76561198062501319': 'Cantankerous',\n", " '76561198036270560': 'Toaster',\n", " '76561198306443796': 'numstudequals1',\n", " '76561198133044936': 'Panda',\n", " '76561198095814450': 'Tbonedog',\n", " '76561198069739846': 'Alminikar',\n", " '76561198233398192': 'Saxophones',\n", " '76561198162654610': 'Raydan',\n", " '76561198047367972': 'Oberyn',\n", " '76561198057450983': 'TraceTheKitteh',\n", " '76561198176504246': 'shistthis',\n", " '76561198111538799': 'sergiozygmunt',\n", " '76561198853827591': 'theramendragon',\n", " '76561198055948417': 'Xaldin31',\n", " '76561198137304077': 'lilsar419',\n", " '76561198406334664': 'wywyit',\n", " '76561198098761042': 'wee',\n", " '76561198192510666': 'Rebel',\n", " '76561198066260593': 'NUT',\n", " '76561198099625445': 'DAW',\n", " '76561198017734545': 'Which',\n", " '76561198036176189': 'Ben',\n", " '76561198069739485': 'Rkames517',\n", " '76561198062300654': 'Rawls',\n", " '76561198068098265': 'Brendy',\n", " '76561198065642391': 'Therefore',\n", " '76561198121369685': 'DataFrogman'}" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "name_map" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [], "source": [ "from sklearn.decomposition import IncrementalPCA # inital reduction\n", "from sklearn.manifold import TSNE # final reduction\n", "import numpy as np \n", "\n", "def reduce_dimensions(labels, vectors, num_dimensions=2):\n", " \n", " # convert both lists into numpy vectors for reduction\n", " vectors = np.asarray(vectors)\n", " labels = np.asarray(labels)\n", "\n", " # reduce using t-SNE\n", " vectors = np.asarray(vectors)\n", " tsne = TSNE(n_components=num_dimensions, random_state=0)\n", " vectors = tsne.fit_transform(vectors)\n", "\n", " x_vals = [v[0] for v in vectors]\n", " y_vals = [v[1] for v in vectors]\n", " return x_vals, y_vals, labels\n", "\n", "vectors\n", "x_vals, y_vals, labels = reduce_dimensions(labels, vectors)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import random\n", "\n", "def plot_with_matplotlib(x_vals, y_vals, labels, num_to_label):\n", " plt.figure(figsize=(5, 5))\n", " plt.scatter(x_vals, y_vals)\n", " plt.title(\"Embedding Space\")\n", " indices = list(range(len(labels)))\n", " selected_indices = random.sample(indices, num_to_label)\n", " for i in selected_indices:\n", " plt.annotate(name_map[labels[i]], (x_vals[i], y_vals[i]))\n", " plt.savefig('ex.png')\n", " \n", "plot_with_matplotlib(x_vals, y_vals, labels, 12)" ] } ], "metadata": { "kernelspec": { "display_name": "ml", "language": "python", "name": "ml" }, "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.8.3" } }, "nbformat": 4, "nbformat_minor": 4 }