Repository where I mostly put random python scripts.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

678 lines
104 KiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import gensim\n",
"model = gensim.models.KeyedVectors.load_word2vec_format('./GoogleNews-vectors-negative300.bin', binary=True) "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('hi', 0.654898464679718),\n",
" ('goodbye', 0.639905571937561),\n",
" ('howdy', 0.6310957074165344),\n",
" ('goodnight', 0.5920578241348267),\n",
" ('greeting', 0.5855878591537476),\n",
" ('Hello', 0.5842196941375732),\n",
" (\"g'day\", 0.5754077434539795),\n",
" ('See_ya', 0.5688871145248413),\n",
" ('ya_doin', 0.5643119812011719),\n",
" ('greet', 0.5636603832244873)]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.most_similar(\"hello\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('coders', 0.6104331612586975),\n",
" ('coder', 0.6063331365585327),\n",
" ('Coding', 0.5804804563522339),\n",
" ('formatting', 0.5671651363372803),\n",
" ('soluble_receptors', 0.5576372146606445),\n",
" ('ICD9', 0.5571348667144775),\n",
" ('refactoring', 0.5495434999465942),\n",
" ('database_schemas', 0.5372464656829834),\n",
" ('recode', 0.534299373626709),\n",
" ('XHTML_CSS', 0.5328801870346069)]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.most_similar(\"coding\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('cats', 0.8099379539489746),\n",
" ('dog', 0.7609456777572632),\n",
" ('kitten', 0.7464985251426697),\n",
" ('feline', 0.7326233983039856),\n",
" ('beagle', 0.7150583267211914),\n",
" ('puppy', 0.7075453996658325),\n",
" ('pup', 0.6934291124343872),\n",
" ('pet', 0.6891531348228455),\n",
" ('felines', 0.6755931377410889),\n",
" ('chihuahua', 0.6709762215614319)]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.most_similar(\"cat\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"hi globe \n"
]
}
],
"source": [
"def transformSentence(sentence):\n",
" outputSentence = \"\"\n",
" \n",
" for word in sentence.split(\" \"):\n",
" try:\n",
" outputSentence += model.most_similar(word)[0][0] + \" \"\n",
" except Exception:\n",
" outputSentence += word + \" \"\n",
" return outputSentence\n",
"\n",
"print(transformSentence(\"hello world\"))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"looks Mom No hand \n"
]
}
],
"source": [
"print(transformSentence(\"look mom no hands\"))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"This gen_eral concept of Clustering was to groups Data wtih similiar trait \n"
]
}
],
"source": [
"print(transformSentence(\"The general idea of clustering is to group data with similar traits\"))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"This manager concept of clusters was to groups datasets wtih similiar traits. \n"
]
}
],
"source": [
"def removeFromString(string, chars):\n",
" for c in chars:\n",
" string = string.replace(c, \"\")\n",
" return string\n",
"\n",
"\n",
"def transformSentenceWithHeuristic(sentence):\n",
" outputSentence = \"\"\n",
" \n",
" for word in sentence.split(\" \"):\n",
" try:\n",
" changed = False\n",
" for w, _ in model.most_similar(word):\n",
" clean = removeFromString(w, [' ', '_']).lower()\n",
" if clean not in word.lower() and \"_\" not in w:\n",
" outputSentence += w + \" \"\n",
" changed = True\n",
" break\n",
" outputSentence = outputSentence if changed else outputSentence + word + \" \"\n",
" except Exception:\n",
" outputSentence += word + \" \"\n",
" return outputSentence\n",
"print(transformSentenceWithHeuristic(\"The general idea of clustering is to group data with similar traits.\"))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Relax up and grabbing a drinks but that was day it I talking abut this hallucinogenic trips it was this 1981 film Fever Treatment. \n"
]
}
],
"source": [
"print(transformSentenceWithHeuristic(\"Sit down and grab a drink because it is time that we talk about the LSD trip that is the 1981 movie Shock Treatment.\"))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(300,)\n",
"[ 0.0123291 0.20410156 -0.28515625 0.21679688 0.11816406 0.08300781\n",
" 0.04980469 -0.00952148 0.22070312 -0.12597656 0.08056641 -0.5859375\n",
" -0.00445557 -0.296875 -0.01312256 -0.08349609 0.05053711 0.15136719\n",
" -0.44921875 -0.0135498 0.21484375 -0.14746094 0.22460938 -0.125\n",
" -0.09716797 0.24902344 -0.2890625 0.36523438 0.41210938 -0.0859375\n",
" -0.07861328 -0.19726562 -0.09082031 -0.14160156 -0.10253906 0.13085938\n",
" -0.00346375 0.07226562 0.04418945 0.34570312 0.07470703 -0.11230469\n",
" 0.06738281 0.11230469 0.01977539 -0.12353516 0.20996094 -0.07226562\n",
" -0.02783203 0.05541992 -0.33398438 0.08544922 0.34375 0.13964844\n",
" 0.04931641 -0.13476562 0.16308594 -0.37304688 0.39648438 0.10693359\n",
" 0.22167969 0.21289062 -0.08984375 0.20703125 0.08935547 -0.08251953\n",
" 0.05957031 0.10205078 -0.19238281 -0.09082031 0.4921875 0.03955078\n",
" -0.07080078 -0.0019989 -0.23046875 0.25585938 0.08984375 -0.10644531\n",
" 0.00105286 -0.05883789 0.05102539 -0.0291748 0.19335938 -0.14160156\n",
" -0.33398438 0.08154297 -0.27539062 0.10058594 -0.10449219 -0.12353516\n",
" -0.140625 0.03491211 -0.11767578 -0.1796875 -0.21484375 -0.23828125\n",
" 0.08447266 -0.07519531 -0.25976562 -0.21289062 -0.22363281 -0.09716797\n",
" 0.11572266 0.15429688 0.07373047 -0.27539062 0.14257812 -0.0201416\n",
" 0.10009766 -0.19042969 -0.09375 0.14160156 0.17089844 0.3125\n",
" -0.16699219 -0.08691406 -0.05004883 -0.24902344 -0.20800781 -0.09423828\n",
" -0.12255859 -0.09472656 -0.390625 -0.06640625 -0.31640625 0.10986328\n",
" -0.00156403 0.04345703 0.15625 -0.18945312 -0.03491211 0.03393555\n",
" -0.14453125 0.01611328 -0.14160156 -0.02392578 0.01501465 0.07568359\n",
" 0.10742188 0.12695312 0.10693359 -0.01184082 -0.24023438 0.0291748\n",
" 0.16210938 0.19921875 -0.28125 0.16699219 -0.11621094 -0.25585938\n",
" 0.38671875 -0.06640625 -0.4609375 -0.06176758 -0.14453125 -0.11621094\n",
" 0.05688477 0.03588867 -0.10693359 0.18847656 -0.16699219 -0.01794434\n",
" 0.10986328 -0.12353516 -0.16308594 -0.14453125 0.12890625 0.11523438\n",
" 0.13671875 0.05688477 -0.08105469 -0.06152344 -0.06689453 0.27929688\n",
" -0.19628906 0.07226562 0.12304688 -0.20996094 -0.22070312 0.21386719\n",
" -0.1484375 -0.05932617 0.05224609 0.06445312 -0.02636719 0.13183594\n",
" 0.19433594 0.27148438 0.18652344 0.140625 0.06542969 -0.14453125\n",
" 0.05029297 0.08837891 0.12255859 0.26757812 0.0534668 -0.32226562\n",
" -0.20703125 0.18164062 0.04418945 -0.22167969 -0.13769531 -0.04174805\n",
" -0.00286865 0.04077148 0.07275391 -0.08300781 0.08398438 -0.3359375\n",
" -0.40039062 0.01757812 -0.18652344 -0.0480957 -0.19140625 0.10107422\n",
" 0.09277344 -0.30664062 -0.19921875 -0.0168457 0.12207031 0.14648438\n",
" -0.12890625 -0.23535156 -0.05371094 -0.06640625 0.06884766 -0.03637695\n",
" 0.2109375 -0.06005859 0.19335938 0.05151367 -0.05322266 0.02893066\n",
" -0.27539062 0.08447266 0.328125 0.01818848 0.01495361 0.04711914\n",
" 0.37695312 -0.21875 -0.03393555 0.01116943 0.36914062 0.02160645\n",
" 0.03466797 0.07275391 0.16015625 -0.16503906 -0.296875 0.15039062\n",
" -0.29101562 0.13964844 0.00448608 0.171875 -0.21972656 0.09326172\n",
" -0.19042969 0.01599121 -0.09228516 0.15722656 -0.14160156 -0.0534668\n",
" 0.03613281 0.23632812 -0.15136719 -0.00689697 -0.27148438 -0.07128906\n",
" -0.16503906 0.18457031 -0.08398438 0.18554688 0.11669922 0.02758789\n",
" -0.04760742 0.17871094 0.06542969 -0.03540039 0.22949219 0.02697754\n",
" -0.09765625 0.26953125 0.08349609 -0.13085938 -0.10107422 -0.00738525\n",
" 0.07128906 0.14941406 -0.20605469 0.18066406 -0.15820312 0.05932617\n",
" 0.28710938 -0.04663086 0.15136719 0.4921875 -0.27539062 0.05615234]\n"
]
}
],
"source": [
"print(model[\"cat\"].shape)\n",
"print(model[\"cat\"])"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1. 0.76094574 0.17324439]\n",
" [0.76094574 0.99999994 0.12194333]\n",
" [0.17324439 0.12194333 1. ]]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"def createCorrelationMatrix(words):\n",
" l = len(words)\n",
" matrix = np.empty((l, l), np.float)\n",
" \n",
" for r in range(0, l):\n",
" for c in range(0, l):\n",
" matrix[r][c] = model.similarity(words[r], words[c])\n",
" return matrix\n",
"\n",
"testMatrix = [\"cat\", \"dog\", \"computer\"]\n",
"print(createCorrelationMatrix(testMatrix))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def displayMap(a):\n",
" plt.imshow(a, cmap='hot', interpolation='nearest')\n",
" plt.show()\n",
"\n",
"displayMap(createCorrelationMatrix(testMatrix))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"AxesImage(90,90;446.4x543.6)\n",
"AxesImage(90,90;446.4x543.6)\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"import matplotlib.image as mpimg\n",
"\n",
"\n",
"def displayMap(a):\n",
" plt.imshow(a, cmap='hot', interpolation='nearest')\n",
" plt.show()\n",
" \n",
" \n",
" \n",
"def heatmap(data, row_labels, col_labels, ax=None):\n",
" \"\"\"\n",
" Create a heatmap from a numpy array and two lists of labels.\n",
"\n",
" Parameters\n",
" ----------\n",
" data\n",
" A 2D numpy array of shape (N, M).\n",
" row_labels\n",
" A list or array of length N with the labels for the rows.\n",
" col_labels\n",
" A list or array of length M with the labels for the columns.\n",
" cbar_kw\n",
" A dictionary with arguments to `matplotlib.Figure.colorbar`. Optional.\n",
" cbarlabel\n",
" The label for the colorbar. Optional.\n",
" **kwargs\n",
" All other arguments are forwarded to `imshow`.\n",
" \"\"\"\n",
" cbar_kw={}\n",
" ax = plt.gca()\n",
"\n",
" im = ax.imshow(data, cmap=\"YlGn\")\n",
"\n",
" # Create colorbar\n",
" cbar = ax.figure.colorbar(im, ax=ax, label=\"Correlation\")\n",
" cbar.ax.set_ylabel(\"Correlation\", rotation=-90, va=\"bottom\")\n",
"\n",
" # We want to show all ticks...\n",
" ax.set_xticks(np.arange(data.shape[1]))\n",
" ax.set_yticks(np.arange(data.shape[0]))\n",
" # ... and label them with the respective list entries.\n",
" ax.set_xticklabels(col_labels)\n",
" ax.set_yticklabels(row_labels)\n",
"\n",
" # Let the horizontal axes labeling appear on top.\n",
" ax.tick_params(top=True, bottom=False,\n",
" labeltop=True, labelbottom=False)\n",
"\n",
" # Rotate the tick labels and set their alignment.\n",
" plt.setp(ax.get_xticklabels(), rotation=-30, ha=\"right\",\n",
" rotation_mode=\"anchor\")\n",
"\n",
" # Turn spines off and create white grid.\n",
" for edge, spine in ax.spines.items():\n",
" spine.set_visible(False)\n",
"\n",
" ax.set_xticks(np.arange(data.shape[1]+1)-.5, minor=True)\n",
" ax.set_yticks(np.arange(data.shape[0]+1)-.5, minor=True)\n",
" ax.grid(which=\"minor\", color=\"w\", linestyle='-', linewidth=3)\n",
" ax.tick_params(which=\"minor\", bottom=False, left=False)\n",
"\n",
" print(im)\n",
" \n",
" return im, cbar\n",
"\n",
"\n",
"def annotate_heatmap(im, data=None,\n",
" threshold=None, **textkw):\n",
" \"\"\"\n",
" A function to annotate a heatmap.\n",
"\n",
" Parameters\n",
" ----------\n",
" im\n",
" The AxesImage to be labeled.\n",
" data\n",
" Data used to annotate. If None, the image's data is used. Optional.\n",
" valfmt\n",
" The format of the annotations inside the heatmap. This should either\n",
" use the string format method, e.g. \"$ {x:.2f}\", or be a\n",
" `matplotlib.ticker.Formatter`. Optional.\n",
" textcolors\n",
" A list or array of two color specifications. The first is used for\n",
" values below a threshold, the second for those above. Optional.\n",
" threshold\n",
" Value in data units according to which the colors from textcolors are\n",
" applied. If None (the default) uses the middle of the colormap as\n",
" separation. Optional.\n",
" **kwargs\n",
" All other arguments are forwarded to each call to `text` used to create\n",
" the text labels.\n",
" \"\"\"\n",
" valfmt=\"{x:.2f}\"\n",
" textcolors=[\"black\", \"white\"]\n",
" if not isinstance(data, (list, np.ndarray)):\n",
" data = im.get_array()\n",
"\n",
" # Normalize the threshold to the images color range.\n",
" if threshold is not None:\n",
" threshold = im.norm(threshold)\n",
" else:\n",
" threshold = im.norm(data.max())/2.\n",
"\n",
" # Set default alignment to center, but allow it to be\n",
" # overwritten by textkw.\n",
" kw = dict(horizontalalignment=\"center\",\n",
" verticalalignment=\"center\")\n",
" kw.update(textkw)\n",
"\n",
" # Get the formatter in case a string is supplied\n",
" if isinstance(valfmt, str):\n",
" valfmt = matplotlib.ticker.StrMethodFormatter(valfmt)\n",
"\n",
" # Loop over the data and create a `Text` for each \"pixel\".\n",
" # Change the text's color depending on the data.\n",
" texts = []\n",
" for i in range(data.shape[0]):\n",
" for j in range(data.shape[1]):\n",
" kw.update(color=textcolors[int(im.norm(data[i, j]) > threshold)])\n",
" text = im.axes.text(j, i, valfmt(data[i, j], None))\n",
" texts.append(text)\n",
"\n",
" return texts\n",
"\n",
"def plotWordCorrelations(words):\n",
" fig, ax = plt.subplots(figsize=(10,10))\n",
" \n",
" matrix = createCorrelationMatrix(words)\n",
"\n",
" im, cbar = heatmap(matrix, words, words, ax=ax)\n",
" \n",
" print(im)\n",
" texts = annotate_heatmap(im, valfmt=\"{x:.1f} t\")\n",
"\n",
" fig.tight_layout()\n",
" plt.show()\n",
" plt.savefig(str(len(words)) + '.png')\n",
" \n",
" \n",
"plotWordCorrelations([\"cat\", \"dog\", \"computer\"])"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"AxesImage(90,90;446.4x543.6)\n",
"AxesImage(90,90;446.4x543.6)\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plotWordCorrelations([\"good\", \"bad\", \"salty\", \"candy\", \"santa\", \"christmas\"])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:11: DeprecationWarning: Call to deprecated `wv` (Attribute will be removed in 4.0.0, use self instead).\n",
" # This is added back by InteractiveShellApp.init_path()\n",
"/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:12: DeprecationWarning: Call to deprecated `wv` (Attribute will be removed in 4.0.0, use self instead).\n",
" if sys.path[0] == '':\n"
]
},
{
"ename": "MemoryError",
"evalue": "Unable to allocate array with shape (3000000, 300) and data type float64",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mMemoryError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-11-7b046372cab7>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 29\u001b[0;31m \u001b[0mx_vals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_vals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mreduce_dimensions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\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<ipython-input-11-7b046372cab7>\u001b[0m in \u001b[0;36mreduce_dimensions\u001b[0;34m(model)\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0mvectors\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvectors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0mtsne\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTSNE\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn_components\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum_dimensions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrandom_state\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 22\u001b[0;31m \u001b[0mvectors\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtsne\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvectors\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 23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0mx_vals\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mvectors\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/sklearn/manifold/_t_sne.py\u001b[0m in \u001b[0;36mfit_transform\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 884\u001b[0m \u001b[0mEmbedding\u001b[0m \u001b[0mof\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mtraining\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlow\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mdimensional\u001b[0m \u001b[0mspace\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 885\u001b[0m \"\"\"\n\u001b[0;32m--> 886\u001b[0;31m \u001b[0membedding\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\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 887\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0membedding_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0membedding\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 888\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0membedding_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/sklearn/manifold/_t_sne.py\u001b[0m in \u001b[0;36m_fit\u001b[0;34m(self, X, skip_num_points)\u001b[0m\n\u001b[1;32m 751\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 752\u001b[0m \u001b[0mt0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\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[0;32m--> 753\u001b[0;31m \u001b[0mdistances_nn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mknn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkneighbors_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'distance'\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 754\u001b[0m \u001b[0mduration\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mt0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 755\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mverbose\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/sklearn/neighbors/_base.py\u001b[0m in \u001b[0;36mkneighbors_graph\u001b[0;34m(self, X, n_neighbors, mode)\u001b[0m\n\u001b[1;32m 761\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'distance'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 762\u001b[0m A_data, A_ind = self.kneighbors(\n\u001b[0;32m--> 763\u001b[0;31m X, n_neighbors, return_distance=True)\n\u001b[0m\u001b[1;32m 764\u001b[0m \u001b[0mA_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA_data\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 765\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/sklearn/neighbors/_base.py\u001b[0m in \u001b[0;36mkneighbors\u001b[0;34m(self, X, n_neighbors, return_distance)\u001b[0m\n\u001b[1;32m 661\u001b[0m delayed_query(\n\u001b[1;32m 662\u001b[0m self._tree, X[s], n_neighbors, return_distance)\n\u001b[0;32m--> 663\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mgen_even_slices\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\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 664\u001b[0m )\n\u001b[1;32m 665\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[0;32m/opt/conda/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m 1002\u001b[0m \u001b[0;31m# remaining jobs.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1003\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1004\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch_one_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\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 1005\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_iterator\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1006\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mdispatch_one_batch\u001b[0;34m(self, iterator)\u001b[0m\n\u001b[1;32m 833\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 834\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[0;32m--> 835\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtasks\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 836\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 837\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m_dispatch\u001b[0;34m(self, batch)\u001b[0m\n\u001b[1;32m 752\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 753\u001b[0m \u001b[0mjob_idx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 754\u001b[0;31m \u001b[0mjob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcb\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 755\u001b[0m \u001b[0;31m# A job can complete so quickly than its callback is\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 756\u001b[0m \u001b[0;31m# called before we get here, causing self._jobs to\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mapply_async\u001b[0;34m(self, func, callback)\u001b[0m\n\u001b[1;32m 207\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mapply_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\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 208\u001b[0m \u001b[0;34m\"\"\"Schedule a func to be run\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 209\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImmediateResult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\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 210\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, batch)\u001b[0m\n\u001b[1;32m 588\u001b[0m \u001b[0;31m# Don't delay the application, to avoid keeping the input\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 589\u001b[0m \u001b[0;31m# arguments in memory\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 590\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbatch\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 591\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 592\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\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[0;32m/opt/conda/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_n_jobs\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 255\u001b[0m return [func(*args, **kwargs)\n\u001b[0;32m--> 256\u001b[0;31m for func, args, kwargs in self.items]\n\u001b[0m\u001b[1;32m 257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\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[0;32m/opt/conda/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_n_jobs\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 255\u001b[0m return [func(*args, **kwargs)\n\u001b[0;32m--> 256\u001b[0;31m for func, args, kwargs in self.items]\n\u001b[0m\u001b[1;32m 257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\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[0;32m/opt/conda/lib/python3.7/site-packages/sklearn/neighbors/_base.py\u001b[0m in \u001b[0;36m_tree_query_parallel_helper\u001b[0;34m(tree, *args, **kwargs)\u001b[0m\n\u001b[1;32m 488\u001b[0m \u001b[0munder\u001b[0m \u001b[0mPyPy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 489\u001b[0m \"\"\"\n\u001b[0;32m--> 490\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtree\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquery\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 491\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32msklearn/neighbors/_binary_tree.pxi\u001b[0m in \u001b[0;36msklearn.neighbors._kd_tree.BinaryTree.query\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mcheck_array\u001b[0;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)\u001b[0m\n\u001b[1;32m 529\u001b[0m \u001b[0marray\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcasting\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"unsafe\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 530\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[0;32m--> 531\u001b[0;31m \u001b[0marray\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\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 532\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mComplexWarning\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 533\u001b[0m raise ValueError(\"Complex data not supported\\n\"\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/numpy/core/_asarray.py\u001b[0m in \u001b[0;36masarray\u001b[0;34m(a, dtype, order)\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 84\u001b[0m \"\"\"\n\u001b[0;32m---> 85\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\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 86\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mMemoryError\u001b[0m: Unable to allocate array with shape (3000000, 300) and data type float64"
]
}
],
"source": [
"from sklearn.decomposition import IncrementalPCA # inital reduction\n",
"from sklearn.manifold import TSNE # final reduction\n",
"import numpy as np # array handling\n",
"\n",
"\n",
"def reduce_dimensions(model):\n",
" num_dimensions = 2 # final num dimensions (2D, 3D, etc)\n",
"\n",
" vectors = [] # positions in vector space\n",
" labels = [] # keep track of words to label our data again later\n",
" for word in model.wv.vocab:\n",
" vectors.append(model.wv[word])\n",
" labels.append(word)\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",
"\n",
"x_vals, y_vals, labels = reduce_dimensions(model)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}