t-SNE Explained: Top 6 Tools & Practical How To Get Started Guide [Python]

by | Dec 22, 2023 | Data Science, Machine Learning

What is t-SNE?

t-SNE, or t-distributed Stochastic Neighbor Embedding, is a popular non-linear dimensionality reduction technique used primarily for visualizing high-dimensional data in a lower-dimensional space, typically 2D or 3D. It was introduced by Laurens van der Maaten and Geoffrey Hinton in 2008.

The primary goal of t-SNE is to map high-dimensional data points to a lower-dimensional space while preserving the relationships and structure present in the original data. Unlike linear methods like PCA (Principal Component Analysis), t-SNE excels at capturing non-linear relationships and is particularly useful for visualizing complex structures or clusters within data.

t-SNE operates by constructing a probability distribution representing pairwise similarities between data points in the high-dimensional space. It then makes a similar probability distribution in the lower-dimensional space. The algorithm iteratively adjusts the lower-dimensional representation to minimize the difference between these two distributions, effectively trying to find a configuration where similar points in the high-dimensional space remain close to each other in the lower-dimensional space.

t-SNE operates by constructing a probability distribution representing pairwise similarities between data points in the high-dimensional space.

t-SNE operates by constructing a probability distribution representing pairwise similarities between data points in the high-dimensional space.

One of the notable aspects of t-SNE is its ability to emphasize local structures, meaning it tends to preserve the relative distances and neighbourhood relationships between nearby points. This often results in well-separated clusters or groups in the visualization, providing insights into the data’s structure.

t-SNE is widely used in various domains such as machine learning, data visualization, biology (especially genomics), natural language processing, and other fields where understanding and visualizing high-dimensional data is essential for analysis and interpretation.

Theoretical Foundation

Dimensionality reduction is critical in handling high-dimensional data due to its computational complexity, visualization challenges, and impact on model performance. Within this realm, t-SNE maintains local relationships among data points, emphasizing the retention of proximity for nearby points in the original high-dimensional space. Central to t-SNE is its probabilistic approach, employing conditional probabilities to model similarities between data points. Through Gaussian distributions, t-SNE computes these probabilities, enabling the preservation of local structures even in non-linear datasets—an attribute distinctly differentiating it from linear methods like PCA.

The core objective of t-SNE revolves around minimizing the disparity between conditional probabilities in high and low dimensions. Achieving this involves optimizing a specific cost function.

However, while t-SNE excels in capturing local relationships, it confronts challenges with larger datasets due to its computational demands, prompting trade-offs between accuracy and computational resources. Understanding the evolution of t-SNE from its original formulation to potential enhancements provides insight into its continued development and adaptations in handling diverse data complexities.

Mechanics of the t-SNE Algorithm

The mechanics of t-SNE encompass intricate processes fundamental to its operation. At its core, t-SNE relies on similarity measurement to understand relationships among data points in a high-dimensional space. Through this, t-SNE computes conditional probabilities to determine similarities, considering the proximity of points and establishing neighbourhood relationships based on their similarities. The perplexity parameter, crucial in this context, determines the size of these local neighbourhoods, impacting how t-SNE interprets similarities.

Once the similarities are established, t-SNE maps these high-dimensional similarities to a lower-dimensional space, aiming to maintain the relationships found in the original space. It utilizes a gradient descent optimization method to minimize the difference between the conditional probabilities of the high and low-dimensional spaces. This iterative process continually adjusts the positions of data points in the lower-dimensional embedding to better match the relationships observed in the higher-dimensional space.

Through this mechanism, t-SNE effectively reduces dimensions while striving to preserve the intricate local structures present in the data. However, as with any algorithm, understanding the mechanics and nuances of parameter choices, such as the learning rate and number of iterations, significantly influences the quality and interpretability of the resultant lower-dimensional representation. Grasping these mechanics aids in optimizing t-SNE for various data types and analytical goals, ensuring more meaningful visualizations and insights.

Visual Representation of t-SNE

Visualizing the functionality of t-SNE serves as a pivotal tool in understanding its core principles. When applied to datasets, t-SNE demonstrates its prowess in preserving local structures and uncovering patterns within complex data. Through illustrative examples, the effectiveness of t-SNE in reducing dimensions while maintaining relationships becomes apparent.

By employing synthetic datasets or well-known datasets like MNIST, t-SNE generates lower-dimensional representations that vividly showcase the retention of local structures. These visualizations often reveal clusters of similar data points, representing groups or classes in the original high-dimensional space. The ability of t-SNE to separate distinct clusters while maintaining the relative distances between data points within these clusters is visually striking and demonstrates its efficacy in revealing underlying patterns.

t-sne on minst dataset

This property makes t-SNE a powerful tool for data visualization and exploration. Visual representations aid in intuitively comprehending how t-SNE handles the intricate relationships among data points. These representations facilitate a more precise grasp of the algorithm’s mechanics and serve as powerful tools for exploratory data analysis, enabling researchers and analysts to glean insights and identify meaningful patterns within complex datasets.

t-SNE in Machine Learning

t-SNE is not a machine learning algorithm in the traditional sense, as it’s primarily used for dimensionality reduction and visualization rather than predictive modelling. However, it plays a crucial role in machine learning workflows, especially in the preprocessing and exploratory data analysis stages.

Here’s how t-SNE is commonly used in machine learning:


  • Feature Visualization: Before training a machine learning model, t-SNE helps visualize high-dimensional data in a lower-dimensional space, understanding the structure and relationships between data points. This visualization can guide feature selection, transformation, or engineering.

Data Exploration and Analysis

  • Cluster Identification: t-SNE can reveal inherent clusters or groups within the data, assisting in understanding existing natural groupings and guiding further analysis.
  • Pattern Recognition: It assists in identifying complex patterns and relationships that might not be apparent in the original high-dimensional space.

Model Interpretability

  • Visualizing Embeddings: When dealing with embeddings or learned representations from neural networks or other models, t-SNE can visualize these embeddings in a lower-dimensional space, aiding in interpreting and understanding the model’s behaviour.

Evaluation and Validation

  • Comparing Different Models: Visualization using t-SNE can help compare and evaluate the performance of different models or algorithms based on how well they preserve the original data structure in the lower-dimensional space.

While t-SNE doesn’t make predictions or perform classification/regression tasks, its role in visualizing data relationships is instrumental in understanding the data and guiding subsequent machine learning processes. It helps researchers and practitioners gain insights into the underlying structures within complex datasets, facilitating better model design and decision-making in the machine-learning pipeline.

Comparison t-SNE with Principal Component Analysis (PCA)

Understanding how t-SNE differs from other dimensionality reduction methods, notably Principal Component Analysis (PCA), offers valuable insights into its unique functionalities and limitations.

  • Approach Differences:
    • PCA focuses on linear dimensionality reduction by identifying orthogonal axes of maximum variance.
    • t-SNE, on the other hand, preserves local relationships, emphasizing non-linear structures within the data.
  • Preservation of Information:
    • PCA tends to maintain global structures, capturing high-variance directions, but might overlook local relationships.
    • In contrast, t-SNE excels in preserving local structures, revealing clusters and relationships between nearby data points.
  • Scaling with Dataset Size:
    • PCA is computationally efficient and scales well with larger datasets.
    • t-SNE encounters computational challenges with larger datasets due to its quadratic time complexity, making it less suitable for extensive datasets.
  • Interpretability:
    • PCA generates easily interpretable principal components representing the most significant dimensions.
    • t-SNE’s lower-dimensional representation may be more complex to interpret due to its focus on local relationships, making it more suitable for visualization than direct interpretation.

Understanding these distinctions helps practitioners choose the most appropriate technique for their analytical objectives. While PCA might be preferable for large-scale dimensionality reduction or feature extraction, t-SNE shines when the goal is to visualize and explore complex, non-linear structures within the data. Both techniques offer unique advantages, and their selection depends on the nature of the dataset and the desired outcomes.

Intuitive Understanding of t-SNE

Gaining an intuitive grasp of t-SNE’s functionality can be facilitated by drawing analogies and real-world parallels, simplifying its intricate processes for a broader audience.

1. Map Analogy

Imagine the original high-dimensional data as a vast landscape, where each data point represents a unique location. t-SNE acts as a cartographer, aiming not to create a more miniature landscape but to craft a map that retains the essence of the original terrain. As a map preserves neighbourhoods and proximity between cities or landmarks, t-SNE strives to maintain the relationships and closeness between data points.

2. Social Network Analogy

Consider a social network where individuals form distinct communities based on shared interests or relationships. t-SNE operates akin to identifying clusters within this network, ensuring that friends or acquaintances with similar interests are located close to each other in the lower-dimensional representation. This representation preserves the local connections, revealing communities while minimizing distances between individuals with stronger relationships.

3. Real-life Examples

Relating t-SNE to real-life scenarios, such as understanding how different music genres relate to each other or how words cluster based on semantic meanings in language, can provide tangible insights. Just as similar genres group together on a music map or related words gather in semantic clusters, t-SNE visualizations aim to reveal these intricate relationships within data.

By employing relatable analogies and real-world examples, understanding t-SNE becomes more accessible. These simplified narratives bridge the gap between complex algorithms and everyday concepts, aiding diverse audiences in grasping the essence of t-SNE’s goal: preserving relationships and structures within high-dimensional data while projecting them into a more manageable space.

How to visualize data using t-SNE in Python: An Example With Scikit-Learn (sklearn)

Here’s an example of implementing t-SNE using Python’s popular library, scikit-learn, and visualizing the results using Matplotlib:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.manifold import TSNE

# Load a sample dataset (e.g., iris dataset)
iris = datasets.load_iris()
X = iris.data
y = iris.target

# Initialize t-SNE with desired parameters
tsne = TSNE(n_components=2, random_state=42)

# Fit and transform the data to lower dimensions
X_tsne = tsne.fit_transform(X)

# Visualize the t-SNE representation
plt.figure(figsize=(8, 6))

# Plot each class with a different color
for i, c in zip(np.unique(y), ['r', 'g', 'b']):
    plt.scatter(X_tsne[y == i, 0], X_tsne[y == i, 1], c=c, label=f'Class {i}')

plt.title('t-SNE Visualization of Iris Dataset')
plt.xlabel('t-SNE Component 1')
plt.ylabel('t-SNE Component 2')
t-sne python example using sklearn

This example uses the Iris dataset, reduces its dimensions to 2 using t-SNE, and visualizes the resulting lower-dimensional representation. You can replace datasets.load_iris() with your preferred dataset or use your dataset by loading it into the X variable.

Make sure to install sci-kit-learn (pip install sci-kit-learn) to run this code. This code snippet demonstrates a basic application of t-SNE for visualizing a dataset in a 2-dimensional space, facilitating the understanding of its clusters and patterns.

What are Applications of t-SNE?

t-SNE’s versatility extends across various domains, primarily excelling in data visualization and aiding in clustering and pattern recognition tasks.

1. Data Visualization

  • Exploratory Data Analysis:
    • Visualizing high-dimensional data in a lower-dimensional space for human interpretation and understanding.
    • Applications in fields like biology (gene expression data), image analysis (MNIST dataset), and natural language processing (word embeddings).
  • Feature Representation:
    • Reducing dimensions for visualizing learned features in neural networks, aiding in comprehending model behaviour and feature relationships.

2. Clustering and Pattern Recognition

  • Cluster Identification:
    • Identifying clusters or groups within data enables a better understanding of inherent structures and relationships.
    • Applications in customer segmentation, anomaly detection, and grouping similar data points.
  • Pattern Discovery:
    • Uncovering complex patterns within data is particularly useful in fields like genomics, where t-SNE assists in revealing relationships between genes or cell types.

3. Improved Model Performance

  • Input to Machine Learning Models:
    • Providing preprocessed, lower-dimensional data as input to machine learning algorithms, potentially improving model training efficiency and performance.

4. Visualization for Model Interpretability

  • Interpreting Model Decisions:
    • Visualizing embeddings of data points to understand how machine learning models make predictions or classify instances, aiding in model interpretability.

5. Domain-Specific Applications

  • Bioinformatics:
    • Analyzing and visualizing gene expression data to understand relationships between genes or cell types.
  • Natural Language Processing:
    • Mapping word embeddings or language representations to visualize semantic similarities among words.

6. Interactive Visualizations

  • Interactive Tools and Dashboards:
    • Building interactive visualizations or dashboards to allow users to explore complex datasets and gain insights dynamically.

t-SNE’s applications span diverse fields, offering invaluable assistance in visualizing high-dimensional data, uncovering patterns, aiding in model interpretability, and enhancing understanding of complex datasets across various domains. Its utility lies in data exploration and improving machine learning models’ performance and interoperability.

Parameters and Tuning in t-SNE

Understanding and effectively tuning the parameters of t-SNE significantly impact the quality of the resulting lower-dimensional representation and visualization.

1. Perplexity Parameter

  • Impact on Neighborhood Size:
    • Defines the effective number of nearest neighbours considered when mapping data points.
    • Higher perplexity values capture more global structures, while lower values focus on finer local structures.

2. Learning Rate and Number of Iterations

  • Learning Rate:
    • Determines the step size in adjusting the positions of data points during optimization.
    • Smaller learning rates allow for finer adjustments but might require more convergence iteration.
  • Number of Iterations:
    • Dictates the number of iterations or optimization steps the algorithm performs.
    • Increasing iterations might enhance convergence but also risk overfitting or increased computational time.

3. Initialization and Randomness

  • Random Initialization:
    • The initial positioning of data points in the lower-dimensional space impacts the final embedding.
    • Random seeds or multiple initializations can help assess the stability of the algorithm’s output.

4. Optimization Techniques and Speed

  • Gradient Descent Variants:
    • Variants like Barnes-Hut approximation or optimized gradient descent methods aid in accelerating computation for larger datasets.
    • These techniques trade-off between accuracy and computational speed.

5. Balancing Computation and Quality

  • Trade-offs:
    • Balancing computational resources with the quality of the resulting visualization.
    • Adjusting parameters to achieve a suitable trade-off between accuracy and computational demands.

6. Visualization Considerations

  • Coloring and Annotations:
    • Utilizing colour schemes or annotations to highlight specific clusters or groups within the visualization for enhanced interpretation.

7. Cross-Validation and Evaluation

  • Parameter Selection via Validation:
    • Employing cross-validation or grid search to select optimal parameter values, considering the dataset’s characteristics and the desired outcome.

Understanding the nuances and impact of each parameter in t-SNE allows you to fine-tune the algorithm for optimal results. However, it’s crucial to balance parameter adjustments with computational efficiency and avoid overfitting or misinterpreting the data. Experimentation and careful consideration of parameter choices are essential to harness t-SNE effectively for various datasets and analytical goals.

Advantages and Limitations of t-SNE

t-SNE presents distinct advantages in visualizing and understanding high-dimensional data but has limitations that warrant consideration.


  • Preservation of Local Structures: The ability to reveal intricate local relationships and structures in the data enables fine-grained visualizations.
  • Effective in Non-linear Data: Superiority in capturing non-linear relationships, distinguishing it from linear dimensionality reduction methods like PCA.
  • Clarity in Visualization: Produces visually compelling representations that aid intuitive understanding and exploratory analysis of complex datasets.
  • Cluster Separation: Effectively separates distinct clusters in the data, allowing for more precise identification of groups or classes.
  • Application Diversity: Versatile application across various domains, assisting in diverse tasks like clustering, pattern recognition, and model interpretability.


  • Computational Demands: Resource-intensive for larger datasets due to its quadratic time complexity, leading to longer computation times.
  • Parameter Sensitivity: Sensitivity to parameter settings, where suboptimal choices may result in misleading or less informative visualizations.
  • Loss of Global Structure: Focusing on local relationships might lead to losing global structures, potentially overlooking broader data trends.
  • Interpretability Challenges: Difficulty in directly interpreting lower-dimensional representations, mainly when focusing on complex local structures.
  • Overcrowding in Visualization: Crowding or overlapping data points in the lower-dimensional space potentially hinders clarity in visualizations, especially with dense clusters.

Understanding these strengths and limitations helps you leverage t-SNE effectively while being mindful of its constraints. Careful parameter selection, consideration of computational resources, and contextual understanding of the dataset’s nature are pivotal in harnessing the power of t-SNE for meaningful insights and visualizations.

Best Practices and Tips for Using t-SNE

Employing t-SNE effectively involves adopting certain best practices and considering essential tips to optimize its performance and interpretation.

1. Understand Data Characteristics

  • Data Preprocessing:
    • Normalize or scale data appropriately, ensuring uniformity in feature ranges before applying t-SNE.
    • Handle missing values or outliers adequately to prevent distortion in the visualization.

2. Start with Small Samples

  • Initial Exploration:
    • Begin with a subset of the data to experiment with parameter settings and visualize the algorithm’s behaviour before applying it to the entire dataset.

3. Parameter Tuning

  • Perplexity Selection:
    • Experiment with different perplexity values, considering local and global data structures.
    • Evaluate the impact of perplexity on the resulting visualization’s clarity and meaningfulness.
  • Iterative Adjustments:
    • Iterate over multiple parameter settings (learning rate, number of iterations) to balance computational efficiency and representation quality.

4. Multiple Runs and Seed Initialization

  • Multiple Initializations: Run t-SNE with various random seeds or multiple initializations to assess stability and consistency in the generated embeddings.

5. Visual Inspection and Interpretation

  • Visual Inspection: Carefully inspect and interpret the resulting visualization, focusing on local structures and cluster separations for insights.
  • Colour and Annotation: Utilize colour coding or annotations to label or group-specific data points, enhancing interpretability and highlighting patterns within clusters.

6. Consider Alternate Embeddings

  • Use Multiple Techniques: Combine t-SNE with other dimensionality reduction methods or visualize data using different embeddings to understand the dataset comprehensively.

7. Computational Efficiency

  • Dimensionality Reduction as a Preprocessing Step: Apply t-SNE as a preprocessing step for visualization or downstream tasks rather than on the original high-dimensional dataset, reducing the computational load for subsequent analyses.

8. Documentation and Reproducibility

  • Document Parameters and Results: Maintain comprehensive documentation of parameter choices and resulting visualizations for reproducibility and comparison.

Adhering to these best practices and tips enhances the efficacy of t-SNE, facilitating meaningful insights and interpretations while mitigating potential pitfalls associated with parameter selection and data interpretation. Experimentation and an iterative approach are vital to using t-SNE for diverse datasets and analytical goals.

Tools and Libraries for Implementing t-SNE

Several powerful tools and libraries support the implementation of t-SNE, providing accessible means to apply this algorithm across various programming languages and environments.

1. Python Libraries

  • scikit-learn:
    • Offers a simple and efficient API for t-SNE implementation within the broader scikit-learn machine learning library.
    • Provides flexibility in parameter settings and integrates seamlessly with other data analysis tools.
  • TensorFlow and TensorFlow Probability:
    • TensorFlow’s computational graph capabilities and TensorFlow Probability’s high-level abstractions offer t-SNE implementations suitable for deep learning tasks and probabilistic models.
  • UMAP (Uniform Manifold Approximation and Projection):
    • Although primarily focused on manifold learning, UMAP provides a fast and scalable alternative to t-SNE, often yielding similar results.

2. R Packages

  • Rtsne:
    • A popular R package providing an interface to the Barnes-Hut implementation of t-SNE, enabling efficient computation for large datasets.
  • Rtsne and RtsneWrapper:
    • Alternate R packages that offer additional functionalities or wrappers around t-SNE implementations.

3. Visualization Tools

  • Plotly and Matplotlib:
    • Visualization libraries complementing t-SNE implementations offer interactive and publication-quality visualizations of the lower-dimensional embeddings.

4. Standalone Implementations

  • Multicore-TSNE and Barnes-Hut-SNE:
    • Standalone implementations of t-SNE optimized for speed and scalability, suitable for larger datasets.

5. Integrations with Data Analysis Platforms

  • KNIME and Orange:
    • Data analysis platforms that incorporate t-SNE as part of their visual analytics and machine learning workflows.

6. Cloud-Based Services

  • Google Colab and Microsoft Azure ML:
    • Cloud-based platforms offer t-SNE implementations within their machine learning ecosystems, facilitating easy access and scalability.

Leveraging these tools and libraries streamlines the application of t-SNE across various programming languages and environments, allowing users to explore, visualize, and analyze high-dimensional data efficiently. The choice of tool often depends on the specific requirements, preferences, and the ecosystem in which the analysis is conducted.


t-SNE, renowned for its capacity to reveal complex structures within high-dimensional data, is a pivotal tool in data exploration, visualization, and pattern recognition. Its ability to capture and represent local relationships in a lower-dimensional space has extensive applications across diverse domains.

In this exploration of t-SNE, we’ve delved into its theoretical underpinnings, mechanics, and applications. Its probabilistic approach, focus on preserving local structures, and non-linear nature distinguishes it from traditional linear dimensionality reduction methods like PCA. We’ve attempted to demystify t-SNE through various examples and analogies, simplifying its intricate processes for a broader audience.

The advantages of t-SNE lie in its capability to visualize fine-grained structures and clusters within data, aiding in pattern discovery and model interpretability. However, it comes with computational demands and challenges in parameter tuning, necessitating careful consideration and exploration of parameter choices.

Our best practices and tips provided insights into optimizing t-SNE’s performance, guiding users in parameter selection, data preprocessing, and visualization enhancement. Moreover, exploring tools and libraries offered various resources to implement t-SNE across different programming languages and environments.

Understanding the strengths, limitations, and nuances of t-SNE empowers practitioners to leverage this algorithm effectively, uncovering hidden patterns and gaining deeper insights from complex datasets. Its versatility and applicability across diverse domains make t-SNE an indispensable tool in the arsenal of data scientists and researchers, enabling profound explorations and discoveries within high-dimensional data landscapes.

About the Author

Neri Van Otten

Neri Van Otten

Neri Van Otten is the founder of Spot Intelligence, a machine learning engineer with over 12 years of experience specialising in Natural Language Processing (NLP) and deep learning innovation. Dedicated to making your projects succeed.

Recent Articles

fact checking with large language models LLMs

Fact-Checking With Large Language Models (LLMs): Is It A Powerful NLP Verification Tool?

Can a Machine Tell a Lie? Picture this: you're scrolling through social media, bombarded by claims about the latest scientific breakthrough, political scandal, or...

key elements of cognitive computing

Cognitive Computing Made Simple: Powerful Artificial Intelligence (AI) Capabilities & Examples

What is Cognitive Computing? The term "cognitive computing" has become increasingly prominent in today's rapidly evolving technological landscape. As our society...

Multilayer Perceptron Architecture

Multilayer Perceptron Explained And How To Train & Optimise MLPs

What is a Multilayer perceptron (MLP)? In artificial intelligence and machine learning, the Multilayer Perceptron (MLP) stands as one of the foundational architectures,...

Left: Illustration of SGD optimization with a typical learning rate schedule. The model converges to a minimum at the end of training. Right: Illustration of Snapshot Ensembling. The model undergoes several learning rate annealing cycles, converging to and escaping from multiple local minima. We take a snapshot at each minimum for test-time ensembling

Learning Rate In Machine Learning And Deep Learning Made Simple

Machine learning algorithms are at the core of many modern technological advancements, powering everything from recommendation systems to autonomous vehicles....

What causes the cold-start problem?

The Cold-Start Problem In Machine Learning Explained & 6 Mitigating Strategies

What is the Cold-Start Problem in Machine Learning? The cold-start problem refers to a common challenge encountered in machine learning systems, particularly in...

Nodes and edges in a bayesian network

Bayesian Network Made Simple [How It Is Used In Artificial Intelligence & Machine Learning]

What is a Bayesian Network? Bayesian network, also known as belief networks or Bayes nets, are probabilistic graphical models representing random variables and their...

Query2vec is an example of knowledge graph reasoning. Conjunctive queries: Where did Canadian citizens with Turing Award Graduate?

Knowledge Graph Reasoning Made Simple [3 Technical Methods & How To Handle Uncertanty]

What is Knowledge Graph Reasoning? Knowledge Graph Reasoning refers to drawing logical inferences, making deductions, and uncovering implicit information within a...

the process of speech recognition

How To Implement Speech Recognition [3 Ways & 7 Machine Learning Models]

What is Speech Recognition? Speech recognition, also known as automatic speech recognition (ASR) or voice recognition, is a technology that converts spoken language...

Key components of conversational AI

Conversational AI Explained: Top 9 Tools & How To Guide [Including GPT]

What is Conversational AI? Conversational AI, short for Conversational Artificial Intelligence, refers to using artificial intelligence and natural language processing...


Submit a Comment

Your email address will not be published. Required fields are marked *

nlp trends

2024 NLP Expert Trend Predictions

Get a FREE PDF with expert predictions for 2024. How will natural language processing (NLP) impact businesses? What can we expect from the state-of-the-art models?

Find out this and more by subscribing* to our NLP newsletter.

You have Successfully Subscribed!