Lesson 7

Let's embark on another captivating adventure within our **Intro to Unsupervised Machine Learning** course. We have already delved into key topics, including unsupervised machine learning techniques, the concept of clusters with k-means clustering, and the secrets of dimensionality reduction methods such as *Principal Component Analysis* (PCA) and *Independent Component Analysis* (ICA).

This lesson introduces another critical tool in the toolbox for dimensionality reduction - the **t-Distributed Stochastic Neighbor Embedding (t-SNE)**. This advanced technique offers an impressive way to visualize high-dimensional data by minimizing the divergence or difference between two distributions - namely, a pair modeled over high-dimensional and corresponding low-dimensional space.

Our primary objective in this lesson is to provide you with an in-depth understanding of the mechanism and theory underlying the `t-SNE`

algorithm. Using hands-on examples, we will transition from theory to practice and implement it in Python using the `scikit-learn`

library. To keep things consistent, we will continue using the Iris dataset, a popular dataset in machine learning. Now, let's delve into the fascinating world of t-SNE.

Visualizing high-dimensional data can be quite challenging. Imagine plotting points in a space with more than three dimensions - it's almost impossible for our human brains to comprehend! However, t-SNE, a non-linear dimensionality reduction technique, comes to our rescue. t-SNE is particularly great for visualizing high-dimensional datasets in a 2D or even 3D space.

This method was developed by Laurens van der Maaten and Geoffrey Hinton in 2008. Simply put, t-SNE maps high-dimensional data points to a lower-dimensional space (2D or 3D). Fascinatingly, it keeps similar data points close together and dissimilar data points far apart in this lower-dimensional space. Neat, right?

Now, are you curious about the magic that occurs when t-SNE works? Let’s take a peek under the hood at the machinery of the t-SNE algorithm.

t-SNE starts by calculating the probability of similarity of points in high-dimensional space and reproduces the same for points in the corresponding low-dimensional space. The similarity of points is gauged based on the Gaussian joint distribution in high-dimensional space and the Student's t-distribution in the lower-dimensional space.

Then, t-SNE attempts to minimize the divergence or difference between the high-dimensional and low-dimensional distributions for corresponding points in the low-dimensional space. This minimization is performed using gradient descent, and the extent of similarity between the high-dimensional and low-dimensional distributions is measured using the Kullback-Leibler (KL) Divergence.

To illustrate, let's denote the similarity distribution in high-dimensional space as $P$, and in low-dimensional space as $Q$. The cost function $C$ that t-SNE minimizes is the KL Divergence of $P$ from $Q$, represented as:

$C = KL(P || Q) = \sum_{i \neq j} p_{ij} log \left( \frac{{p_{ij}}}{{q_{ij}}} \right)$

In this formula, the summation is over all pairs of instances except when $i$ equals $j$, since $p_{ii}$ and $q_{ii}$ are both equal to zero.

While t-SNE may sound like a magical solution to high-dimensional visualization, the magic doesn't happen without some fine-tuning. Two main hyperparameters are crucial in the workings of t-SNE:

**Perplexity:**This element measures how to balance attention to local and global aspects of the data. It can be considered a knob that sets the number of effective nearest neighbors. Typically, it is set between 5 and 50. Smaller values make t-SNE focus more on local structure, while larger values make the algorithm look for global patterns.**Learning Rate:**This variable determines how fast the algorithm learns from the data. It's usually set between 10 and 1000. However, keep in mind that, just like many machine learning algorithms, setting the learning rate too high or too low could lead to poor results.

Fine-tuning these hyperparameters can significantly impact your t-SNE visualization, bringing us closer to unveiling the hidden structure of our data.

With the concepts and theory out of the way, let's bring the t-SNE algorithm to life with hands-on coding! We'll be using the `scikit-learn`

library in Python, which provides a straightforward and efficient way of implementing t-SNE.

Let's begin by loading the necessary libraries:

Python`1import matplotlib.pyplot as plt 2from sklearn import datasets 3from sklearn.manifold import TSNE`

We'll load the Iris dataset, which we have been using for our practice:

Python`1iris = datasets.load_iris() 2X = iris.data 3y = iris.target`

Next, we apply t-SNE to the Iris dataset:

Python`1tsne = TSNE(n_components=2, random_state=0) 2X_2d = tsne.fit_transform(X)`

We can now visualize our results. The visualization helps to show if similar items cluster together, testing the effectiveness of t-SNE:

Python`1plt.figure(figsize=(6, 5)) 2colors = ['r', 'g', 'b'] 3target_names = iris.target_names 4for color, i, target_name in zip(colors, [0, 1, 2], target_names): 5 plt.scatter(X_2d[y == i, 0], X_2d[y == i, 1], color=color, alpha=0.8, lw=2, label=target_name) 6plt.legend(loc='best', shadow=False, scatterpoints=1) 7plt.title('t-SNE of IRIS dataset') 8plt.show()`

The plot displays the three Iris species in a 2D space, showcasing that the species form distinct clusters. This serves as a proof-of-concept for t-SNE's capability in maintaining inherent data structures.

The visualization of results is arguably one of the most critical parts of using t-SNE. It allows us to observe the distribution of our data in lower-dimensional space, which can often reveal intricate structures within our data. However, it's essential to note that interpreting these plots requires care, particularly regarding distance and density. Distances between well-separated clusters may not hold meaningful information, and t-SNE plots should not be interpreted as traditional scatterplots.

As powerful and flexible as t-SNE is, it has limitations and should be used carefully. Here are some key points to remember as you work with t-SNE:

**Computational Resources:**t-SNE can be computationally intensive for large datasets, an important consideration when working with big data.**Deceptive Simplicity:**It's easy to misinterpret t-SNE results due to its emphasis on preserving local structures and viewing clusters as a byproduct.**Hyperparameter Sensitivity:**The results can be heavily influenced by both perplexity and learning rate, accounting for an additional layer of complexity.

Notwithstanding its limitations, t-SNE can effectively reveal rich structures within high-dimensional data when used wisely!

Congratulations on cracking another essential concept in the world of unsupervised machine learning! Having taken a leap forward, you've now gained an understanding of t-SNE and forged ahead with the practical experience of implementing it on the Iris dataset.

Remember, mastering these skills depends heavily on practice and critical thinking. In our next session, we'll use our newfound knowledge with hands-on tasks.

Prepare for the practice session. The upcoming tasks will bridge the gap between theory and practice, strengthening and cementing your understanding of t-SNE. As you dive deeper into these exercises, remember that practice is what makes a skill truly your own. It's the key to translating what you learn into applicable, extendable knowledge. So, are you ready to take up the challenge? Happy learning!