{"id":22039379,"url":"https://github.com/mpolinowski/tstochastic-neighbor-embedding","last_synced_at":"2026-05-11T03:20:19.735Z","repository":{"id":234831454,"uuid":"626779185","full_name":"mpolinowski/tstochastic-neighbor-embedding","owner":"mpolinowski","description":"Improve Data Quality by discarding non-correlating, noisy Dimensions","archived":false,"fork":false,"pushed_at":"2023-04-12T06:31:04.000Z","size":930,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-28T19:17:26.772Z","etag":null,"topics":["matplotlib-pyplot","python","scikit-learn","t-sne"],"latest_commit_sha":null,"homepage":"https://mpolinowski.github.io/docs/IoT-and-Machine-Learning/ML/2023-04-12-tstochastic-neighbor-embedding/2023-04-12","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mpolinowski.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-04-12T06:30:56.000Z","updated_at":"2023-04-12T06:59:56.000Z","dependencies_parsed_at":"2024-04-21T02:03:27.559Z","dependency_job_id":"63a43668-6bb0-403b-b363-36be7c7d6e8f","html_url":"https://github.com/mpolinowski/tstochastic-neighbor-embedding","commit_stats":null,"previous_names":["mpolinowski/tstochastic-neighbor-embedding"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpolinowski%2Ftstochastic-neighbor-embedding","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpolinowski%2Ftstochastic-neighbor-embedding/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpolinowski%2Ftstochastic-neighbor-embedding/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpolinowski%2Ftstochastic-neighbor-embedding/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mpolinowski","download_url":"https://codeload.github.com/mpolinowski/tstochastic-neighbor-embedding/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245104529,"owners_count":20561380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["matplotlib-pyplot","python","scikit-learn","t-sne"],"created_at":"2024-11-30T11:10:33.545Z","updated_at":"2026-05-11T03:20:19.622Z","avatar_url":"https://github.com/mpolinowski.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"---\njupyter:\n  jupytext:\n    formats: ipynb,md\n    text_representation:\n      extension: .md\n      format_name: markdown\n      format_version: '1.3'\n      jupytext_version: 1.14.4\n  kernelspec:\n    display_name: Python 3 (ipykernel)\n    language: python\n    name: python3\n---\n\n# tStochastic Neighbor Embedding (t-SNE)\n\n\u003e [Stochastic Neighbor Embedding with Gaussian and Student-t Distributions: Tutorial and Survey](https://arxiv.org/abs/2009.10301): Stochastic Neighbor Embedding (SNE) is a manifold learning and dimensionality reduction method with a probabilistic approach. In SNE, every point is consider to be the neighbor of all other points with some probability and this probability is tried to be preserved in the embedding space. SNE considers Gaussian distribution for the probability in both the input and embedding spaces. However, t-SNE uses the Student-t and Gaussian distributions in these spaces, respectively. In this tutorial and survey paper, we explain SNE, symmetric SNE, t-SNE (or Cauchy-SNE), and t-SNE with general degrees of freedom. We also cover the out-of-sample extension and acceleration for these methods. \n\u003e `Benyamin Ghojogh`, `Ali Ghodsi`, `Fakhri Karray`, `Mark Crowley`\n\n```python\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.mplot3d import Axes3D\nimport pandas as pd\nimport seaborn as sns\nfrom sklearn.manifold import TSNE\nfrom sklearn.preprocessing import MinMaxScaler, StandardScaler\n```\n\n```python\nraw_data = pd.read_csv('data/A_multivariate_study_of_variation_in_two_species_of_rock_crab_of_genus_Leptograpsus.csv')\n\ndata = raw_data.rename(columns={\n    'sp': 'Species',\n    'sex': 'Sex',\n    'index': 'Index',\n    'FL': 'Frontal Lobe',\n    'RW': 'Rear Width',\n    'CL': 'Carapace Midline',\n    'CW': 'Maximum Width',\n    'BD': 'Body Depth'})\n\ndata['Species'] = data['Species'].map({'B':'Blue', 'O':'Orange'})\ndata['Sex'] = data['Sex'].map({'M':'Male', 'F':'Female'})\ndata['Class'] = data.Species + data.Sex\n\ndata_columns = ['Frontal Lobe',\n                'Rear Width',\n                'Carapace Midline',\n                'Maximum Width',\n                'Body Depth']\n\ndata.head()\n```\n\n|    | Species | Sex | Index | Frontal Lobe | Rear Width | Carapace Midline | Maximum Width | Body Depth | Class |\n| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |\n| 0 | Blue | Male | 1 | 8.1 | 6.7 | 16.1 | 19.0 | 7.0 | BlueMale |\n| 1 | Blue | Male | 2 | 8.8 | 7.7 | 18.1 | 20.8 | 7.4 | BlueMale |\n| 2 | Blue | Male | 3 | 9.2 | 7.8 | 19.0 | 22.4 | 7.7 | BlueMale |\n| 3 | Blue | Male | 4 | 9.6 | 7.9 | 20.1 | 23.1 | 8.2 | BlueMale |\n| 4 | Blue | Male | 5 | 9.8 | 8.0 | 20.3 | 23.0 | 8.2 | BlueMale |\n\n\n## RAW Data Analysis\n\n### 2-Dimensional Plot\n\n```python\n# reduce data to 2 dimensions\nno_components = 2\nno_iter = 2000\nperplexity = 10\ninit = 'random'\n\ndata_tsne = TSNE(\n    n_components=no_components,\n    perplexity=perplexity,\n    n_iter=no_iter,\n    init=init).fit_transform(data[data_columns])\n\n# add columns to original dataset\ndata[['TSNE1', 'TSNE2']] = data_tsne\n\ndata.tail()\n```\n\n|    | Species | Sex | Index | Frontal Lobe | Rear Width | Carapace Midline | Maximum Width | Body Depth | Class | TSNE1 | TSNE2 |\n| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |\n| 195 | Orange | Female | 46 | 21.4 | 18.0 | 41.2 | 46.2 | 18.7 | OrangeFemale | 39.232815 | -1.699857 |\n| 196 | Orange | Female | 47 | 21.7 | 17.1 | 41.7 | 47.2 | 19.6 | OrangeFemale | 40.689430 | 0.257805 |\n| 197 | Orange | Female | 48 | 21.9 | 17.2 | 42.6 | 47.4 | 19.5 | OrangeFemale | 41.692440 | 1.029953 |\n| 198 | Orange | Female | 49 | 22.5 | 17.2 | 43.0 | 48.7 | 19.8 | OrangeFemale | 42.851078 | 2.015537 |\n| 199 | Orange | Female | 50 | 23.1 | 20.2 | 46.2 | 52.5 | 21.1 | OrangeFemale | 49.569035 | 3.964387 |\n\n```python\nfig = plt.figure(figsize=(8,8))\nplt.title('RAW Data Analysis')\nsns.scatterplot(x='TSNE1', y='TSNE2', hue='Class', data=data)\n```\n\n![tStochastic Neighbor Embedding (t-SNE)](https://github.com/mpolinowski/tstochastic-neighbor-embedding/blob/master/assets/tStochastic-Neighbor-Embedding_01.png)\n\n\n### 3-Dimensional Plot\n\n```python\n# reduce data to 3 dimensions\nno_components = 3\nno_iter = 2000\nperplexity = 10\ninit = 'random'\n\ndata_tsne = TSNE(\n    n_components=no_components,\n    perplexity=perplexity,\n    n_iter=no_iter,\n    init=init).fit_transform(data[data_columns])\n\n# add columns to original dataset\ndata[['TSNE1', 'TSNE2', 'TSNE3']] = data_tsne\n\ndata.tail()\n```\n\n|    | Species | Sex | Index | Frontal Lobe | Rear Width | Carapace Midline | Maximum Width | Body Depth | Class | TSNE1 | TSNE2 | TSNE3 |\n| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |\n| 195 | Orange | Female | 46 | 21.4 | 18.0 | 41.2 | 46.2 | 18.7 | OrangeFemale | -12.564007 | 4.956237 | -2.111369 |\n| 196 | Orange | Female | 47 | 21.7 | 17.1 | 41.7 | 47.2 | 19.6 | OrangeFemale | -13.217113 | 5.572454 | -2.733016 |\n| 197 | Orange | Female | 48 | 21.9 | 17.2 | 42.6 | 47.4 | 19.5 | OrangeFemale | -13.523155 | 5.879868 | -2.971745 |\n| 198 | Orange | Female | 49 | 22.5 | 17.2 | 43.0 | 48.7 | 19.8 | OrangeFemale | -13.959590 | 6.371356 | -3.287457 |\n| 199 | Orange | Female | 50 | 23.1 | 20.2 | 46.2 | 52.5 | 21.1 | OrangeFemale | -15.850336 | 8.684433 | -3.833084 |\n\n```python\nclass_colours = {\n    'BlueMale': '#0027c4', #blue\n    'BlueFemale': '#f18b0a', #orange\n    'OrangeMale': '#0af10a', # green\n    'OrangeFemale': '#ff1500', #red\n}\n\ncolours = data['Class'].apply(lambda x: class_colours[x])\n\nx=data.TSNE1\ny=data.TSNE2\nz=data.TSNE3\n\nfig = plt.figure(figsize=(10,10))\nplt.title('RAW Data Analysis')\nax = fig.add_subplot(projection='3d')\n\nax.scatter(xs=x, ys=y, zs=z, s=50, c=colours)\n```\n\n![tStochastic Neighbor Embedding (t-SNE)](https://github.com/mpolinowski/tstochastic-neighbor-embedding/blob/master/assets/tStochastic-Neighbor-Embedding_02.png)\n\n\n## Normalized Data Analysis\n\n### 2-Dimensional Plot\n\n```python\n# normalize the data columns\n# values have to be between 0-1\ndata_norm = data.copy()\ndata_norm[data_columns] = MinMaxScaler().fit_transform(data[data_columns])\n\ndata_norm.describe()\n```\n\n```python\n# reduce data to 2 dimensions\nno_components = 2\nno_iter = 1000\nperplexity = 10\ninit = 'random'\n\ndata_tsne = TSNE(\n    n_components=no_components,\n    perplexity=perplexity,\n    n_iter=no_iter,\n    init=init).fit_transform(data_norm[data_columns])\n\n# add columns to original dataset\ndata_norm[['TSNE1', 'TSNE2']] = data_tsne\n\ndata_norm.tail()\n```\n\n```python\nfig = plt.figure(figsize=(8,8))\nplt.title('Normalized Data Analysis')\nsns.scatterplot(x='TSNE1', y='TSNE2', hue='Class', data=data_norm)\n```\n\n![tStochastic Neighbor Embedding (t-SNE)](https://github.com/mpolinowski/tstochastic-neighbor-embedding/blob/master/assets/tStochastic-Neighbor-Embedding_03.png)\n\n\n### 3-Dimensional Plot\n\n```python\n# reduce data to 3 dimensions\nno_components = 3\nno_iter = 1000\nperplexity = 10\ninit = 'random'\n\ndata_tsne = TSNE(\n    n_components=no_components,\n    perplexity=perplexity,\n    n_iter=no_iter,\n    init=init).fit_transform(data_norm[data_columns])\n\n# add columns to original dataset\ndata_norm[['TSNE1', 'TSNE2', 'TSNE3']] = data_tsne\n\ndata_norm.tail()\n```\n\n```python\nclass_colours = {\n    'BlueMale': '#0027c4', #blue\n    'BlueFemale': '#f18b0a', #orange\n    'OrangeMale': '#0af10a', # green\n    'OrangeFemale': '#ff1500', #red\n}\n\ncolours = data_norm['Class'].apply(lambda x: class_colours[x])\n\nx=data_norm.TSNE1\ny=data_norm.TSNE2\nz=data_norm.TSNE3\n\nfig = plt.figure(figsize=(10,8))\nplt.title('Normalized Data Analysis')\nax = fig.add_subplot(projection='3d')\n\nax.scatter(xs=x, ys=y, zs=z, s=50, c=colours)\n```\n\n![tStochastic Neighbor Embedding (t-SNE)](https://github.com/mpolinowski/tstochastic-neighbor-embedding/blob/master/assets/tStochastic-Neighbor-Embedding_04.png)\n\n\n## Standardized Data Analysis\n\n### 2-Dimensional Plot\n\n```python\n# standardize date to mean of 0 and std-dev of 1\ndata_std = data.copy()\ndata_std[data_columns] = StandardScaler().fit_transform(data[data_columns])\n\ndata_std.describe()\n```\n\n```python\n# reduce data to 2 dimensions\nno_components = 2\nno_iter = 1000\nperplexity = 10\ninit = 'random'\n\ndata_tsne = TSNE(\n    n_components=no_components,\n    perplexity=perplexity,\n    n_iter=no_iter,\n    init=init).fit_transform(data_std[data_columns])\n\n# add columns to original dataset\ndata_std[['TSNE1', 'TSNE2']] = data_tsne\n\ndata_std.tail()\n```\n\n```python\nfig = plt.figure(figsize=(12,8))\nplt.title('Standardized Data Analysis')\nsns.scatterplot(x='TSNE1', y='TSNE2', hue='Class', data=data_std)\n```\n\n![tStochastic Neighbor Embedding (t-SNE)](https://github.com/mpolinowski/tstochastic-neighbor-embedding/blob/master/assets/tStochastic-Neighbor-Embedding_05.png)\n\n\n### 3-Dimensional Plot\n\n```python\n# reduce data to 3 dimensions\nno_components = 3\nno_iter = 1000\nperplexity = 10\ninit = 'random'\n\ndata_tsne = TSNE(\n    n_components=no_components,\n    perplexity=perplexity,\n    n_iter=no_iter,\n    init=init).fit_transform(data_std[data_columns])\n\n# add columns to original dataset\ndata_std[['TSNE1', 'TSNE2', 'TSNE3']] = data_tsne\n\ndata_std.tail()\n```\n\n```python\nclass_colours = {\n    'BlueMale': '#0027c4', #blue\n    'BlueFemale': '#f18b0a', #orange\n    'OrangeMale': '#0af10a', # green\n    'OrangeFemale': '#ff1500', #red\n}\n\ncolours = data_std['Class'].apply(lambda x: class_colours[x])\n\nx=data_std.TSNE1\ny=data_std.TSNE2\nz=data_std.TSNE3\n\nfig = plt.figure(figsize=(10,8))\nplt.title('Standardized Data Analysis')\nax = fig.add_subplot(projection='3d')\n\nax.scatter(xs=x, ys=y, zs=z, s=50, c=colours)\n```\n\n![tStochastic Neighbor Embedding (t-SNE)](https://github.com/mpolinowski/tstochastic-neighbor-embedding/blob/master/assets/tStochastic-Neighbor-Embedding_06.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmpolinowski%2Ftstochastic-neighbor-embedding","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmpolinowski%2Ftstochastic-neighbor-embedding","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmpolinowski%2Ftstochastic-neighbor-embedding/lists"}