Skill Tracer
Skills › Scientific Agent Skills › scikit-learn › unsupervised_learning.md

unsupervised_learning.md

530 lines · skills/scikit-learn/references/unsupervised_learning.md at 5f2bc03

Open on GitHub
1# Unsupervised Learning Reference
2
3Targets scikit-learn 1.9.1. Snippets with caller-supplied data/columns are illustrative; fit all learned preprocessing inside the training folds when estimating predictive performance.
4

Unsupervised Learning Reference

Targets scikit-learn 1.9.1. Snippets with caller-supplied data/columns are illustrative; fit all learned preprocessing inside the training folds when estimating predictive performance.

Raw lines 1 to 4
5## Overview
6
7Unsupervised learning discovers patterns in unlabeled data through clustering, dimensionality reduction, and density estimation.
8

Overview

Unsupervised learning discovers patterns in unlabeled data through clustering, dimensionality reduction, and density estimation.

Raw lines 5 to 8
9## Clustering
11### K-Means
13**KMeans (`sklearn.cluster.KMeans`)**
14- Partition-based clustering into K clusters
15- Key parameters:
16 - `n_clusters`: Number of clusters to form
17 - `init`: Initialization method ('k-means++', 'random')
18 - `n_init`: Number of initializations (default='auto'; one run with k-means++, ten with random init). Set an integer explicitly for repeatable search effort
19 - `max_iter`: Maximum iterations
20- Use when: Know number of clusters, spherical cluster shapes
21- Fast and scalable
22- Example:
23```python
24from sklearn.cluster import KMeans
26model = KMeans(n_clusters=3, init='k-means++', n_init=10, random_state=42)
27labels = model.fit_predict(X)
28centers = model.cluster_centers_
30# Inertia (sum of squared distances to nearest center)
31print(f"Inertia: {model.inertia_}")
32```
34**MiniBatchKMeans**
35- Faster K-Means using mini-batches
36- Use when: Large datasets, need faster training
37- Slightly less accurate than K-Means
38- Example:
39```python
40from sklearn.cluster import MiniBatchKMeans
42model = MiniBatchKMeans(n_clusters=3, batch_size=100, random_state=42)
43labels = model.fit_predict(X)
44```

K-Means

**KMeans (sklearn.cluster.KMeans)**

  • Partition-based clustering into K clusters
  • Key parameters:
  • n_clusters: Number of clusters to form
  • init: Initialization method ('k-means++', 'random')
  • n_init: Number of initializations (default='auto'; one run with k-means++, ten with random init). Set an integer explicitly for repeatable search effort
  • max_iter: Maximum iterations
  • Use when: Know number of clusters, spherical cluster shapes
  • Fast and scalable
  • Example:
from sklearn.cluster import KMeans

model = KMeans(n_clusters=3, init='k-means++', n_init=10, random_state=42)
labels = model.fit_predict(X)
centers = model.cluster_centers_

# Inertia (sum of squared distances to nearest center)
print(f"Inertia: {model.inertia_}")

MiniBatchKMeans

  • Faster K-Means using mini-batches
  • Use when: Large datasets, need faster training
  • Slightly less accurate than K-Means
  • Example:
from sklearn.cluster import MiniBatchKMeans

model = MiniBatchKMeans(n_clusters=3, batch_size=100, random_state=42)
labels = model.fit_predict(X)
Raw lines 11 to 45
46### Density-Based Clustering
48**DBSCAN (`sklearn.cluster.DBSCAN`)**
49- Density-Based Spatial Clustering
50- Key parameters:
51 - `eps`: Maximum distance between two samples to be neighbors
52 - `min_samples`: Minimum samples in neighborhood to form core point
53 - `metric`: Distance metric
54- Use when: Arbitrary cluster shapes, presence of noise/outliers
55- Automatically determines number of clusters
56- Labels noise points as -1
57- Example:
58```python
59from sklearn.cluster import DBSCAN
61model = DBSCAN(eps=0.5, min_samples=5, metric='euclidean')
62labels = model.fit_predict(X)
64# Number of clusters (excluding noise)
65n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
66n_noise = list(labels).count(-1)
67print(f"Clusters: {n_clusters}, Noise points: {n_noise}")
68```
70**HDBSCAN (`sklearn.cluster.HDBSCAN`)**
71- Hierarchical DBSCAN with adaptive epsilon (added in scikit-learn 1.3)
72- Handles varying density; performance and semantics still depend on data and parameters
73- scikit-learn includes the point itself in `min_samples`; the contrib `hdbscan` package does not. Do not transfer that parameter unchanged between implementations
74- Key parameter: `min_cluster_size`
75- Use when: Varying density clusters
76- Example:
77```python
78from sklearn.cluster import HDBSCAN
80model = HDBSCAN(min_cluster_size=10, min_samples=5)
81labels = model.fit_predict(X)
82```
84**OPTICS (`sklearn.cluster.OPTICS`)**
85- Ordering points to identify clustering structure
86- Similar to DBSCAN but doesn't require eps parameter
87- Key parameters: `min_samples`, `max_eps`
88- Use when: Varying density, exploratory analysis
89- Example:
90```python
91from sklearn.cluster import OPTICS
93model = OPTICS(min_samples=5, max_eps=0.5)
94labels = model.fit_predict(X)
95```

Density-Based Clustering

**DBSCAN (sklearn.cluster.DBSCAN)**

  • Density-Based Spatial Clustering
  • Key parameters:
  • eps: Maximum distance between two samples to be neighbors
  • min_samples: Minimum samples in neighborhood to form core point
  • metric: Distance metric
  • Use when: Arbitrary cluster shapes, presence of noise/outliers
  • Automatically determines number of clusters
  • Labels noise points as -1
  • Example:
from sklearn.cluster import DBSCAN

model = DBSCAN(eps=0.5, min_samples=5, metric='euclidean')
labels = model.fit_predict(X)

# Number of clusters (excluding noise)
n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
n_noise = list(labels).count(-1)
print(f"Clusters: {n_clusters}, Noise points: {n_noise}")

**HDBSCAN (sklearn.cluster.HDBSCAN)**

  • Hierarchical DBSCAN with adaptive epsilon (added in scikit-learn 1.3)
  • Handles varying density; performance and semantics still depend on data and parameters
  • scikit-learn includes the point itself in min_samples; the contrib hdbscan package does not. Do not transfer that parameter unchanged between implementations
  • Key parameter: min_cluster_size
  • Use when: Varying density clusters
  • Example:
from sklearn.cluster import HDBSCAN

model = HDBSCAN(min_cluster_size=10, min_samples=5)
labels = model.fit_predict(X)

**OPTICS (sklearn.cluster.OPTICS)**

  • Ordering points to identify clustering structure
  • Similar to DBSCAN but doesn't require eps parameter
  • Key parameters: min_samples, max_eps
  • Use when: Varying density, exploratory analysis
  • Example:
from sklearn.cluster import OPTICS

model = OPTICS(min_samples=5, max_eps=0.5)
labels = model.fit_predict(X)
Raw lines 46 to 96
97### Hierarchical Clustering
99**AgglomerativeClustering**
100- Bottom-up hierarchical clustering
101- Key parameters:
102 - `n_clusters`: Number of clusters (or use `distance_threshold`)
103 - `linkage`: 'ward', 'complete', 'average', 'single'
104 - `metric`: Distance metric
105- Use when: Need dendrogram, hierarchical structure important
106- Example:
107```python
108from sklearn.cluster import AgglomerativeClustering
110model = AgglomerativeClustering(n_clusters=3, linkage='ward')
111labels = model.fit_predict(X)
113# Create dendrogram using scipy
114from scipy.cluster.hierarchy import dendrogram, linkage
115Z = linkage(X, method='ward')
116dendrogram(Z)
117```

Hierarchical Clustering

AgglomerativeClustering

  • Bottom-up hierarchical clustering
  • Key parameters:
  • n_clusters: Number of clusters (or use distance_threshold)
  • linkage: 'ward', 'complete', 'average', 'single'
  • metric: Distance metric
  • Use when: Need dendrogram, hierarchical structure important
  • Example:
from sklearn.cluster import AgglomerativeClustering

model = AgglomerativeClustering(n_clusters=3, linkage='ward')
labels = model.fit_predict(X)

# Create dendrogram using scipy
from scipy.cluster.hierarchy import dendrogram, linkage
Z = linkage(X, method='ward')
dendrogram(Z)
Raw lines 97 to 118
119### Other Clustering Methods
121**MeanShift**
122- Finds clusters by shifting points toward mode of density
123- Automatically determines number of clusters
124- Key parameter: `bandwidth`
125- Use when: Don't know number of clusters, arbitrary shapes
126- Example:
127```python
128from sklearn.cluster import MeanShift, estimate_bandwidth
130# Estimate bandwidth
131bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=500)
132model = MeanShift(bandwidth=bandwidth)
133labels = model.fit_predict(X)
134```
136**SpectralClustering**
137- Uses graph-based approach with eigenvalues
138- Key parameters: `n_clusters`, `affinity` ('rbf', 'nearest_neighbors')
139- Use when: Non-convex clusters, graph structure
140- Example:
141```python
142from sklearn.cluster import SpectralClustering
144model = SpectralClustering(n_clusters=3, affinity='rbf', random_state=42)
145labels = model.fit_predict(X)
146```
148**AffinityPropagation**
149- Finds exemplars by message passing
150- Automatically determines number of clusters
151- Key parameters: `damping`, `preference`
152- Use when: Don't know number of clusters
153- Example:
154```python
155from sklearn.cluster import AffinityPropagation
157model = AffinityPropagation(damping=0.9, random_state=42)
158labels = model.fit_predict(X)
159n_clusters = len(model.cluster_centers_indices_)
160```
162**BIRCH**
163- Balanced Iterative Reducing and Clustering using Hierarchies
164- Memory efficient for large datasets
165- Key parameters: `n_clusters`, `threshold`, `branching_factor`
166- Use when: Very large datasets
167- Example:
168```python
169from sklearn.cluster import Birch
171model = Birch(n_clusters=3, threshold=0.5)
172labels = model.fit_predict(X)
173```

Other Clustering Methods

MeanShift

  • Finds clusters by shifting points toward mode of density
  • Automatically determines number of clusters
  • Key parameter: bandwidth
  • Use when: Don't know number of clusters, arbitrary shapes
  • Example:
from sklearn.cluster import MeanShift, estimate_bandwidth

# Estimate bandwidth
bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=500)
model = MeanShift(bandwidth=bandwidth)
labels = model.fit_predict(X)

SpectralClustering

  • Uses graph-based approach with eigenvalues
  • Key parameters: n_clusters, affinity ('rbf', 'nearest_neighbors')
  • Use when: Non-convex clusters, graph structure
  • Example:
from sklearn.cluster import SpectralClustering

model = SpectralClustering(n_clusters=3, affinity='rbf', random_state=42)
labels = model.fit_predict(X)

AffinityPropagation

  • Finds exemplars by message passing
  • Automatically determines number of clusters
  • Key parameters: damping, preference
  • Use when: Don't know number of clusters
  • Example:
from sklearn.cluster import AffinityPropagation

model = AffinityPropagation(damping=0.9, random_state=42)
labels = model.fit_predict(X)
n_clusters = len(model.cluster_centers_indices_)

BIRCH

  • Balanced Iterative Reducing and Clustering using Hierarchies
  • Memory efficient for large datasets
  • Key parameters: n_clusters, threshold, branching_factor
  • Use when: Very large datasets
  • Example:
from sklearn.cluster import Birch

model = Birch(n_clusters=3, threshold=0.5)
labels = model.fit_predict(X)
Raw lines 119 to 174
175### Clustering Evaluation
177**Metrics when ground truth is known:**
178```python
179from sklearn.metrics import adjusted_rand_score, normalized_mutual_info_score
180from sklearn.metrics import adjusted_mutual_info_score, fowlkes_mallows_score
182# Compare predicted labels with true labels
183ari = adjusted_rand_score(y_true, y_pred)
184nmi = normalized_mutual_info_score(y_true, y_pred)
185ami = adjusted_mutual_info_score(y_true, y_pred)
186fmi = fowlkes_mallows_score(y_true, y_pred)
187```
189**Metrics without ground truth:**
190These require `2 <= n_labels < n_samples`. Noise label `-1` is otherwise treated as an ordinary cluster: explicitly decide whether to exclude noise and report retained coverage. Scores on different subsets are not directly comparable, and these Euclidean indices favor compact/convex clusters.
191```python
192from sklearn.metrics import silhouette_score, calinski_harabasz_score
193from sklearn.metrics import davies_bouldin_score
195# Silhouette: [-1, 1], higher is better
196silhouette = silhouette_score(X, labels)
198# Calinski-Harabasz: higher is better
199ch_score = calinski_harabasz_score(X, labels)
201# Davies-Bouldin: lower is better
202db_score = davies_bouldin_score(X, labels)
203```
205**Elbow method for K-Means:**
206```python
207from sklearn.cluster import KMeans
208import matplotlib.pyplot as plt
210inertias = []
211K_range = range(2, 11)
212for k in K_range:
213 model = KMeans(n_clusters=k, random_state=42)
214 model.fit(X)
215 inertias.append(model.inertia_)
217plt.plot(K_range, inertias, 'bo-')
218plt.xlabel('Number of clusters')
219plt.ylabel('Inertia')
220plt.title('Elbow Method')
221```

Clustering Evaluation

Metrics when ground truth is known:

from sklearn.metrics import adjusted_rand_score, normalized_mutual_info_score
from sklearn.metrics import adjusted_mutual_info_score, fowlkes_mallows_score

# Compare predicted labels with true labels
ari = adjusted_rand_score(y_true, y_pred)
nmi = normalized_mutual_info_score(y_true, y_pred)
ami = adjusted_mutual_info_score(y_true, y_pred)
fmi = fowlkes_mallows_score(y_true, y_pred)

Metrics without ground truth: These require 2 <= n_labels < n_samples. Noise label -1 is otherwise treated as an ordinary cluster: explicitly decide whether to exclude noise and report retained coverage. Scores on different subsets are not directly comparable, and these Euclidean indices favor compact/convex clusters.

from sklearn.metrics import silhouette_score, calinski_harabasz_score
from sklearn.metrics import davies_bouldin_score

# Silhouette: [-1, 1], higher is better
silhouette = silhouette_score(X, labels)

# Calinski-Harabasz: higher is better
ch_score = calinski_harabasz_score(X, labels)

# Davies-Bouldin: lower is better
db_score = davies_bouldin_score(X, labels)

Elbow method for K-Means:

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

inertias = []
K_range = range(2, 11)
for k in K_range:
    model = KMeans(n_clusters=k, random_state=42)
    model.fit(X)
    inertias.append(model.inertia_)

plt.plot(K_range, inertias, 'bo-')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.title('Elbow Method')
Raw lines 175 to 222
223## Dimensionality Reduction

Dimensionality Reduction

Raw lines 223 to 224
225### Principal Component Analysis (PCA)
227**PCA (`sklearn.decomposition.PCA`)**
228- Linear dimensionality reduction using SVD
229- Key parameters:
230 - `n_components`: Number of components (int or float for explained variance)
231 - `whiten`: Whiten components to unit variance
232- Use when: Linear relationships, want to explain variance
233- Example:
234```python
235from sklearn.decomposition import PCA
237# Keep components explaining 95% variance
238pca = PCA(n_components=0.95)
239X_reduced = pca.fit_transform(X)
241print(f"Original dimensions: {X.shape[1]}")
242print(f"Reduced dimensions: {X_reduced.shape[1]}")
243print(f"Explained variance ratio: {pca.explained_variance_ratio_}")
244print(f"Total variance explained: {pca.explained_variance_ratio_.sum()}")
246# Or specify exact number of components
247pca = PCA(n_components=2)
248X_2d = pca.fit_transform(X)
249```
251**IncrementalPCA**
252- PCA for large datasets that don't fit in memory
253- Processes data in batches
254- Key parameter: `n_components`, `batch_size`
255- Example:
256```python
257from sklearn.decomposition import IncrementalPCA
259pca = IncrementalPCA(n_components=50, batch_size=100)
260X_reduced = pca.fit_transform(X)
261```
263**KernelPCA**
264- Non-linear dimensionality reduction using kernels
265- Key parameters: `n_components`, `kernel` ('linear', 'poly', 'rbf', 'sigmoid')
266- Use when: Non-linear relationships
267- Example:
268```python
269from sklearn.decomposition import KernelPCA
271pca = KernelPCA(n_components=2, kernel='rbf', gamma=0.1)
272X_reduced = pca.fit_transform(X)
273```

Principal Component Analysis (PCA)

**PCA (sklearn.decomposition.PCA)**

  • Linear dimensionality reduction using SVD
  • Key parameters:
  • n_components: Number of components (int or float for explained variance)
  • whiten: Whiten components to unit variance
  • Use when: Linear relationships, want to explain variance
  • Example:
from sklearn.decomposition import PCA

# Keep components explaining 95% variance
pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(X)

print(f"Original dimensions: {X.shape[1]}")
print(f"Reduced dimensions: {X_reduced.shape[1]}")
print(f"Explained variance ratio: {pca.explained_variance_ratio_}")
print(f"Total variance explained: {pca.explained_variance_ratio_.sum()}")

# Or specify exact number of components
pca = PCA(n_components=2)
X_2d = pca.fit_transform(X)

IncrementalPCA

  • PCA for large datasets that don't fit in memory
  • Processes data in batches
  • Key parameter: n_components, batch_size
  • Example:
from sklearn.decomposition import IncrementalPCA

pca = IncrementalPCA(n_components=50, batch_size=100)
X_reduced = pca.fit_transform(X)

KernelPCA

  • Non-linear dimensionality reduction using kernels
  • Key parameters: n_components, kernel ('linear', 'poly', 'rbf', 'sigmoid')
  • Use when: Non-linear relationships
  • Example:
from sklearn.decomposition import KernelPCA

pca = KernelPCA(n_components=2, kernel='rbf', gamma=0.1)
X_reduced = pca.fit_transform(X)
Raw lines 225 to 274
275### Manifold Learning
277**t-SNE (`sklearn.manifold.TSNE`)**
278- t-distributed Stochastic Neighbor Embedding
279- Excellent for 2D/3D visualization
280- Key parameters:
281 - `n_components`: Usually 2 or 3
282 - `perplexity`: Balance between local and global structure (5-50)
283 - `learning_rate`: Usually 10-1000
284 - `max_iter`: Number of iterations (minimum 250; renamed from `n_iter` in 1.5)
285- Use when: Visualizing high-dimensional data
286- `perplexity` must be less than the sample count. No `transform()` method; refitting on new data changes the embedding
287- Example:
288```python
289from sklearn.manifold import TSNE
291tsne = TSNE(n_components=2, perplexity=30, learning_rate=200, max_iter=1000, random_state=42)
292X_embedded = tsne.fit_transform(X)
294# Visualize
295import matplotlib.pyplot as plt
296plt.scatter(X_embedded[:, 0], X_embedded[:, 1], c=labels, cmap='viridis')
297plt.title('t-SNE visualization')
298```
300**UMAP (not in scikit-learn, but compatible)**
301- Uniform Manifold Approximation and Projection
302- Runtime and apparent geometry depend on dataset and settings; neither UMAP nor t-SNE reliably preserves global distances or proves clusters
303- Install: `uv pip install umap-learn`
304- Example:
305```python
306from umap import UMAP
308reducer = UMAP(n_components=2, n_neighbors=15, min_dist=0.1, random_state=42)
309X_embedded = reducer.fit_transform(X)
310```
312**Isomap**
313- Isometric Mapping
314- Preserves geodesic distances
315- Key parameters: `n_components`, `n_neighbors`
316- Use when: Non-linear manifolds
317- Example:
318```python
319from sklearn.manifold import Isomap
321isomap = Isomap(n_components=2, n_neighbors=5)
322X_embedded = isomap.fit_transform(X)
323```
325**Locally Linear Embedding (LLE)**
326- Preserves local neighborhood structure
327- Key parameters: `n_components`, `n_neighbors`
328- Example:
329```python
330from sklearn.manifold import LocallyLinearEmbedding
332lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10)
333X_embedded = lle.fit_transform(X)
334```
336**MDS (Multidimensional Scaling)**
337- Preserves pairwise distances
338- Key parameters: `n_components`, `metric`, `metric_params`, `init` (e.g. `'classical_mds'` in 1.8+)
339- Note: `dissimilarity` is deprecated; the former `metric` boolean was renamed to `metric_mds`
340- Example:
341```python
342from sklearn.manifold import MDS
344mds = MDS(n_components=2, metric='euclidean', init='classical_mds', random_state=42)
345X_embedded = mds.fit_transform(X)
346```
348**ClassicalMDS (`sklearn.manifold.ClassicalMDS`)**
349- Classical (Torgerson) MDS via eigendecomposition of the double-centered distance matrix
350- Added in scikit-learn 1.8; faster initialization path for `MDS`
351- Example:
352```python
353from sklearn.manifold import ClassicalMDS
355cmds = ClassicalMDS(n_components=2)
356X_embedded = cmds.fit_transform(X)
357```

Manifold Learning

**t-SNE (sklearn.manifold.TSNE)**

  • t-distributed Stochastic Neighbor Embedding
  • Excellent for 2D/3D visualization
  • Key parameters:
  • n_components: Usually 2 or 3
  • perplexity: Balance between local and global structure (5-50)
  • learning_rate: Usually 10-1000
  • max_iter: Number of iterations (minimum 250; renamed from n_iter in 1.5)
  • Use when: Visualizing high-dimensional data
  • perplexity must be less than the sample count. No transform() method; refitting on new data changes the embedding
  • Example:
from sklearn.manifold import TSNE

tsne = TSNE(n_components=2, perplexity=30, learning_rate=200, max_iter=1000, random_state=42)
X_embedded = tsne.fit_transform(X)

# Visualize
import matplotlib.pyplot as plt
plt.scatter(X_embedded[:, 0], X_embedded[:, 1], c=labels, cmap='viridis')
plt.title('t-SNE visualization')

UMAP (not in scikit-learn, but compatible)

  • Uniform Manifold Approximation and Projection
  • Runtime and apparent geometry depend on dataset and settings; neither UMAP nor t-SNE reliably preserves global distances or proves clusters
  • Install: uv pip install umap-learn
  • Example:
from umap import UMAP

reducer = UMAP(n_components=2, n_neighbors=15, min_dist=0.1, random_state=42)
X_embedded = reducer.fit_transform(X)

Isomap

  • Isometric Mapping
  • Preserves geodesic distances
  • Key parameters: n_components, n_neighbors
  • Use when: Non-linear manifolds
  • Example:
from sklearn.manifold import Isomap

isomap = Isomap(n_components=2, n_neighbors=5)
X_embedded = isomap.fit_transform(X)

Locally Linear Embedding (LLE)

  • Preserves local neighborhood structure
  • Key parameters: n_components, n_neighbors
  • Example:
from sklearn.manifold import LocallyLinearEmbedding

lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10)
X_embedded = lle.fit_transform(X)

MDS (Multidimensional Scaling)

  • Preserves pairwise distances
  • Key parameters: n_components, metric, metric_params, init (e.g. 'classical_mds' in 1.8+)
  • Note: dissimilarity is deprecated; the former metric boolean was renamed to metric_mds
  • Example:
from sklearn.manifold import MDS

mds = MDS(n_components=2, metric='euclidean', init='classical_mds', random_state=42)
X_embedded = mds.fit_transform(X)

**ClassicalMDS (sklearn.manifold.ClassicalMDS)**

  • Classical (Torgerson) MDS via eigendecomposition of the double-centered distance matrix
  • Added in scikit-learn 1.8; faster initialization path for MDS
  • Example:
from sklearn.manifold import ClassicalMDS

cmds = ClassicalMDS(n_components=2)
X_embedded = cmds.fit_transform(X)
Raw lines 275 to 358
359### Matrix Factorization
361**NMF (Non-negative Matrix Factorization)**
362- Factorizes into non-negative matrices
363- Key parameters: `n_components`, `init` ('nndsvd', 'random')
364- Use when: Data is non-negative (images, text)
365- Interpretable components
366- Example:
367```python
368from sklearn.decomposition import NMF
370nmf = NMF(n_components=10, init='nndsvd', random_state=42)
371W = nmf.fit_transform(X) # Document-topic matrix
372H = nmf.components_ # Topic-word matrix
373```
375**TruncatedSVD**
376- SVD for sparse matrices
377- Unlike PCA, does not center input, preserving sparsity; components need not match centered PCA
378- Use when: Text data, sparse matrices
379- Example:
380```python
381from sklearn.decomposition import TruncatedSVD
383svd = TruncatedSVD(n_components=100, random_state=42)
384X_reduced = svd.fit_transform(X_sparse)
385print(f"Explained variance: {svd.explained_variance_ratio_.sum()}")
386```
388**FastICA**
389- Independent Component Analysis
390- Separates multivariate signal into independent components
391- Key parameter: `n_components`
392- Use when: Signal separation (e.g., audio, EEG)
393- Example:
394```python
395from sklearn.decomposition import FastICA
397ica = FastICA(n_components=10, random_state=42)
398S = ica.fit_transform(X) # Independent sources
399A = ica.mixing_ # Mixing matrix
400```
402**LatentDirichletAllocation (LDA)**
403- Topic modeling for text data
404- Key parameters: `n_components` (number of topics), `learning_method` ('batch', 'online')
405- Use when: Topic modeling, document clustering
406- Example:
407```python
408from sklearn.decomposition import LatentDirichletAllocation
410lda = LatentDirichletAllocation(n_components=10, random_state=42)
411doc_topics = lda.fit_transform(X_counts) # Document-topic distribution
413# Get top words for each topic
414feature_names = vectorizer.get_feature_names_out()
415for topic_idx, topic in enumerate(lda.components_):
416 top_words = [feature_names[i] for i in topic.argsort()[-10:]]
417 print(f"Topic {topic_idx}: {', '.join(top_words)}")
418```

Matrix Factorization

NMF (Non-negative Matrix Factorization)

  • Factorizes into non-negative matrices
  • Key parameters: n_components, init ('nndsvd', 'random')
  • Use when: Data is non-negative (images, text)
  • Interpretable components
  • Example:
from sklearn.decomposition import NMF

nmf = NMF(n_components=10, init='nndsvd', random_state=42)
W = nmf.fit_transform(X)  # Document-topic matrix
H = nmf.components_  # Topic-word matrix

TruncatedSVD

  • SVD for sparse matrices
  • Unlike PCA, does not center input, preserving sparsity; components need not match centered PCA
  • Use when: Text data, sparse matrices
  • Example:
from sklearn.decomposition import TruncatedSVD

svd = TruncatedSVD(n_components=100, random_state=42)
X_reduced = svd.fit_transform(X_sparse)
print(f"Explained variance: {svd.explained_variance_ratio_.sum()}")

FastICA

  • Independent Component Analysis
  • Separates multivariate signal into independent components
  • Key parameter: n_components
  • Use when: Signal separation (e.g., audio, EEG)
  • Example:
from sklearn.decomposition import FastICA

ica = FastICA(n_components=10, random_state=42)
S = ica.fit_transform(X)  # Independent sources
A = ica.mixing_  # Mixing matrix

LatentDirichletAllocation (LDA)

  • Topic modeling for text data
  • Key parameters: n_components (number of topics), learning_method ('batch', 'online')
  • Use when: Topic modeling, document clustering
  • Example:
from sklearn.decomposition import LatentDirichletAllocation

lda = LatentDirichletAllocation(n_components=10, random_state=42)
doc_topics = lda.fit_transform(X_counts)  # Document-topic distribution

# Get top words for each topic
feature_names = vectorizer.get_feature_names_out()
for topic_idx, topic in enumerate(lda.components_):
    top_words = [feature_names[i] for i in topic.argsort()[-10:]]
    print(f"Topic {topic_idx}: {', '.join(top_words)}")
Raw lines 359 to 419
420## Outlier and Novelty Detection

Outlier and Novelty Detection

Raw lines 420 to 421
422### Outlier Detection
424**IsolationForest**
425- Isolates anomalies using random trees
426- Key parameters:
427 - `contamination`: Expected proportion of outliers
428 - `n_estimators`: Number of trees
429- Use when: High-dimensional data, efficiency important
430- Example:
431```python
432from sklearn.ensemble import IsolationForest
434model = IsolationForest(contamination=0.1, random_state=42)
435predictions = model.fit_predict(X) # -1 for outliers, 1 for inliers
436```
438**LocalOutlierFactor**
439- Measures local density deviation
440- Key parameters: `n_neighbors`, `contamination`
441- Use when: Varying density regions
442- Example:
443```python
444from sklearn.neighbors import LocalOutlierFactor
446lof = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
447predictions = lof.fit_predict(X) # -1 for outliers, 1 for inliers
448outlier_scores = lof.negative_outlier_factor_
449```
450For novelty detection use `LocalOutlierFactor(novelty=True).fit(X_train)` and call `predict`/`score_samples` only on unseen observations. Do not use novelty predictions to reproduce training `fit_predict` labels.
452**One-Class SVM**
453- Learns decision boundary around normal data
454- `nu` bounds the fraction of training margin errors and lower-bounds the support-vector fraction; it is not an estimated test-set outlier prevalence. Other parameters: `kernel`, `gamma`
455- Use when: Small training set of normal data
456- Example:
457```python
458from sklearn.svm import OneClassSVM
460model = OneClassSVM(nu=0.1, kernel='rbf', gamma='auto')
461model.fit(X_train)
462predictions = model.predict(X_test) # -1 for outliers, 1 for inliers
463```
465**EllipticEnvelope**
466- Assumes Gaussian distribution
467- Key parameter: `contamination`
468- Use when: Data is Gaussian-distributed
469- Example:
470```python
471from sklearn.covariance import EllipticEnvelope
473model = EllipticEnvelope(contamination=0.1, random_state=42)
474predictions = model.fit_predict(X)
475```

Outlier Detection

IsolationForest

  • Isolates anomalies using random trees
  • Key parameters:
  • contamination: Expected proportion of outliers
  • n_estimators: Number of trees
  • Use when: High-dimensional data, efficiency important
  • Example:
from sklearn.ensemble import IsolationForest

model = IsolationForest(contamination=0.1, random_state=42)
predictions = model.fit_predict(X)  # -1 for outliers, 1 for inliers

LocalOutlierFactor

  • Measures local density deviation
  • Key parameters: n_neighbors, contamination
  • Use when: Varying density regions
  • Example:
from sklearn.neighbors import LocalOutlierFactor

lof = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
predictions = lof.fit_predict(X)  # -1 for outliers, 1 for inliers
outlier_scores = lof.negative_outlier_factor_

For novelty detection use LocalOutlierFactor(novelty=True).fit(X_train) and call predict/score_samples only on unseen observations. Do not use novelty predictions to reproduce training fit_predict labels.

One-Class SVM

  • Learns decision boundary around normal data
  • nu bounds the fraction of training margin errors and lower-bounds the support-vector fraction; it is not an estimated test-set outlier prevalence. Other parameters: kernel, gamma
  • Use when: Small training set of normal data
  • Example:
from sklearn.svm import OneClassSVM

model = OneClassSVM(nu=0.1, kernel='rbf', gamma='auto')
model.fit(X_train)
predictions = model.predict(X_test)  # -1 for outliers, 1 for inliers

EllipticEnvelope

  • Assumes Gaussian distribution
  • Key parameter: contamination
  • Use when: Data is Gaussian-distributed
  • Example:
from sklearn.covariance import EllipticEnvelope

model = EllipticEnvelope(contamination=0.1, random_state=42)
predictions = model.fit_predict(X)
Raw lines 422 to 476
477## Gaussian Mixture Models
479**GaussianMixture**
480- Probabilistic clustering with mixture of Gaussians
481- Key parameters:
482 - `n_components`: Number of mixture components
483 - `covariance_type`: 'full', 'tied', 'diag', 'spherical'
484- Use when: Soft clustering, need probability estimates
485- Example:
486```python
487from sklearn.mixture import GaussianMixture
489gmm = GaussianMixture(n_components=3, covariance_type='full', random_state=42)
490gmm.fit(X)
492# Predict cluster labels
493labels = gmm.predict(X)
495# Get probability of each cluster
496probabilities = gmm.predict_proba(X)
498# Information criteria for model selection
499print(f"BIC: {gmm.bic(X)}") # Lower is better
500print(f"AIC: {gmm.aic(X)}") # Lower is better
501```

Gaussian Mixture Models

GaussianMixture

  • Probabilistic clustering with mixture of Gaussians
  • Key parameters:
  • n_components: Number of mixture components
  • covariance_type: 'full', 'tied', 'diag', 'spherical'
  • Use when: Soft clustering, need probability estimates
  • Example:
from sklearn.mixture import GaussianMixture

gmm = GaussianMixture(n_components=3, covariance_type='full', random_state=42)
gmm.fit(X)

# Predict cluster labels
labels = gmm.predict(X)

# Get probability of each cluster
probabilities = gmm.predict_proba(X)

# Information criteria for model selection
print(f"BIC: {gmm.bic(X)}")  # Lower is better
print(f"AIC: {gmm.aic(X)}")  # Lower is better
Raw lines 477 to 502
503## Choosing the Right Method

Choosing the Right Method

Raw lines 503 to 504
505### Clustering:
506- **Know K, spherical clusters**: K-Means
507- **Arbitrary shapes, noise**: DBSCAN, HDBSCAN
508- **Hierarchical structure**: AgglomerativeClustering
509- **Very large data**: MiniBatchKMeans, BIRCH
510- **Probabilistic**: GaussianMixture

Clustering:

  • Know K, spherical clusters: K-Means
  • Arbitrary shapes, noise: DBSCAN, HDBSCAN
  • Hierarchical structure: AgglomerativeClustering
  • Very large data: MiniBatchKMeans, BIRCH
  • Probabilistic: GaussianMixture
Raw lines 505 to 511
512### Dimensionality Reduction:
513- **Linear, variance explanation**: PCA
514- **Non-linear, visualization**: t-SNE, UMAP
515- **Non-negative data**: NMF
516- **Sparse data**: TruncatedSVD
517- **Topic modeling**: LatentDirichletAllocation

Dimensionality Reduction:

  • Linear, variance explanation: PCA
  • Non-linear, visualization: t-SNE, UMAP
  • Non-negative data: NMF
  • Sparse data: TruncatedSVD
  • Topic modeling: LatentDirichletAllocation
Raw lines 512 to 518
519### Outlier Detection:
520- **High-dimensional**: IsolationForest
521- **Varying density**: LocalOutlierFactor
522- **Gaussian data**: EllipticEnvelope

Outlier Detection:

  • High-dimensional: IsolationForest
  • Varying density: LocalOutlierFactor
  • Gaussian data: EllipticEnvelope
Raw lines 519 to 523
524## Upstream references
526- https://scikit-learn.org/stable/modules/clustering.html
527- https://scikit-learn.org/stable/modules/generated/sklearn.cluster.HDBSCAN.html
528- https://scikit-learn.org/stable/modules/generated/sklearn.manifold.ClassicalMDS.html
529- https://scikit-learn.org/stable/modules/outlier_detection.html
530- https://umap-learn.readthedocs.io/en/latest/parameters.html

Upstream references

  • https://scikit-learn.org/stable/modules/clustering.html
  • https://scikit-learn.org/stable/modules/generated/sklearn.cluster.HDBSCAN.html
  • https://scikit-learn.org/stable/modules/generated/sklearn.manifold.ClassicalMDS.html
  • https://scikit-learn.org/stable/modules/outlier_detection.html
  • https://umap-learn.readthedocs.io/en/latest/parameters.html
Raw lines 524 to 530