Skip to content

Instantly share code, notes, and snippets.

@x1001000
Created November 4, 2022 01:22
Show Gist options
  • Save x1001000/9c3023e278d7a9c6b162cd5a42155ea9 to your computer and use it in GitHub Desktop.
Save x1001000/9c3023e278d7a9c6b162cd5a42155ea9 to your computer and use it in GitHub Desktop.
HuangShiuans code with its output
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyNC9F+cWBz7lhcWPRXiAczs",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/x1001000/9c3023e278d7a9c6b162cd5a42155ea9/huangshiuans-code-with-its-output.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"source": [
"import numpy as np\n",
"from sklearn.datasets import load_diabetes\n",
"\n",
"# == cut target into 10 level\n",
"data,target = load_diabetes(return_X_y=True)\n",
"bins = 10\n",
"bin_len = (max(target)-min(target))/bins\n",
"cuts = [min(target)+I*bin_len for I in range(1,bins)]\n",
"label = np.full(len(target),0)\n",
"for IBIN in range(bins):\n",
" if IBIN == 0:\n",
" IND = np.where(target<=cuts[IBIN])\n",
" elif IBIN == bins-1:\n",
" IND = np.where(target>=cuts[IBIN-1])\n",
" else:\n",
" IND = np.where((cuts[IBIN-1]<target) & (target<=cuts[IBIN]))\n",
" label[IND] = IBIN+1\n",
"\n",
"# == seperate data into train and test\n",
"data_tra = data[:-1,:]\n",
"label_tra = label[:-1].reshape(-1,1)\n",
"data_tes = data[-1,:].reshape(1,-1)\n",
"label_tes = label[-1].reshape(1,1)"
],
"metadata": {
"id": "lRGea8vDCJsP"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "bRyTgBq8zI4J"
},
"outputs": [],
"source": [
"# %% initial data\n",
"def gen_data():\n",
" import numpy as np\n",
" from sklearn.datasets import load_diabetes\n",
" \n",
" # == cut target into 10 level\n",
" data,target = load_diabetes(return_X_y=True)\n",
" bins = 10\n",
" bin_len = (max(target)-min(target))/bins\n",
" cuts = [min(target)+I*bin_len for I in range(1,bins)]\n",
" label = np.full(len(target),0)\n",
" for IBIN in range(bins):\n",
" if IBIN == 0:\n",
" IND = np.where(target<=cuts[IBIN])\n",
" elif IBIN == bins-1:\n",
" IND = np.where(target>=cuts[IBIN-1])\n",
" else:\n",
" IND = np.where((cuts[IBIN-1]<target) & (target<=cuts[IBIN]))\n",
" label[IND] = IBIN+1\n",
" \n",
" # == seperate data into train and test\n",
" data_tra = data[:-1,:]\n",
" label_tra = label[:-1].reshape(-1,1)\n",
" data_tes = data[-1,:].reshape(1,-1)\n",
" label_tes = label[-1].reshape(1,1)\n",
" \n",
" return data_tra,label_tra,data_tes,label_tes"
]
},
{
"cell_type": "code",
"source": [
"# %% generate contour plot\n",
"def gen_contourplot(data_tra,label_tra,data_tes,label_tes):\n",
" import numpy as np\n",
" import matplotlib.pyplot as plt\n",
" from scipy.interpolate import griddata\n",
" from sklearn.manifold import TSNE\n",
" \n",
" # == tsne transfrom\n",
" tsne_data = np.vstack([data_tra,data_tes])\n",
" tsne_level = np.vstack([label_tra,label_tes])\n",
" tsne_trs = TSNE(learning_rate=200, init='pca').fit_transform(np.hstack([tsne_data,tsne_level]))\n",
" \n",
" # == generate plt data \n",
" plt_x = tsne_trs[:-1,0]\n",
" plt_y = tsne_trs[:-1,1]\n",
" plt_z = tsne_level[:-1,0]\n",
" plt_mesh = 2000\n",
" x_pt = np.linspace(min(plt_x)-1, max(plt_x)+1, plt_mesh)\n",
" y_pt = np.linspace(min(plt_y)-1, max(plt_y)+1, plt_mesh)\n",
" x_grid, y_grid = np.meshgrid(x_pt, y_pt)\n",
" z_pt = griddata((plt_x,plt_y), plt_z, (x_grid,y_grid), method='nearest')\n",
" \n",
" # == plot data in 2-D \n",
" fig = plt.figure(dpi=130, figsize=(5,4))\n",
" plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)\n",
" plt.contourf(x_pt, y_pt, z_pt, max(plt_z)+1, cmap='YlGnBu', alpha=0.8)\n",
" plt_data = tsne_trs[-1,:]\n",
" plt.scatter(plt_data[0], plt_data[1], s=80, marker='v', linewidths=1.5,\n",
" edgecolors='#008800', color='#00FF00')\n",
" \n",
" # == add info in plot \n",
" axes = plt.gca()\n",
" y_min, y_max = axes.get_ylim()\n",
" x_min, x_max = axes.get_xlim()\n",
" unit_y = (y_max-y_min)/100\n",
" unit_x = (x_max-x_min)/100\n",
" bbox_props = dict(boxstyle='round', fc='w', ec='0.5', alpha=0.5)\n",
" plt.annotate('demo version', xy=(x_max-15*unit_x,y_min+5*unit_y), fontsize=6, alpha=0.5, bbox=bbox_props)\n",
" plt.axis('off')\n",
" \n",
" return fig"
],
"metadata": {
"id": "wqfmtY-T0G_U"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"data_tra,label_tra,data_tes,label_tes = gen_data()"
],
"metadata": {
"id": "uE30OjmY0J2p"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"fig = gen_contourplot(data_tra,label_tra,data_tes,label_tes)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 617
},
"id": "dFX9wPhd0M0H",
"outputId": "f94a1a99-758f-4b4f-dc7d-2a159a190f65"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.7/dist-packages/sklearn/manifold/_t_sne.py:986: FutureWarning: The PCA initialization in TSNE will change to have the standard deviation of PC1 equal to 1e-4 in 1.2. This will ensure better convergence.\n",
" FutureWarning,\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 650x520 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment