Skip to content

Commit c5056cd

Browse files
committed
Clean up dimensionality reduction
1 parent 23ed2d7 commit c5056cd

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

src/goofi/nodes/analysis/dimensionalityreduction.py

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ def config_params():
2727
}
2828

2929
def setup(self):
30-
import umap
3130
from sklearn.decomposition import PCA
3231
from sklearn.manifold import TSNE
32+
from umap import UMAP
3333

34-
self.tsne = TSNE
35-
self.pca = PCA
36-
self.umap = umap
34+
self.tsne_cls = TSNE
35+
self.pca_cls = PCA
36+
self.umap_cls = UMAP
3737

3838
self.model = None
3939
self.components = None
@@ -43,6 +43,7 @@ def process(self, data: Data, new_data: Data):
4343
if data is None:
4444
return None
4545

46+
method = self.params.Control.method.value
4647
data_array = np.squeeze(data.data)
4748

4849
if self.params.Control.reset.value:
@@ -53,45 +54,55 @@ def process(self, data: Data, new_data: Data):
5354
if self.components is not None:
5455
new_components = None
5556
if new_data is not None and self.model is not None:
57+
if method == "t-SNE":
58+
raise ValueError("The t-SNE algorithm does not support transforming new data")
59+
5660
new_components = self.model.transform(new_data.data)
61+
new_meta = new_data.meta
62+
if "channels" in new_meta and "dim1" in new_meta["channels"]:
63+
del new_meta["channels"]["dim1"]
64+
5765
return {
5866
"transformed": (self.components, self.meta),
59-
"new_components": (new_components, self.meta) if new_components is not None else None,
67+
"new_components": (new_components, new_meta) if new_components is not None else None,
6068
}
6169

6270
if data_array.ndim != 2:
6371
raise ValueError("Data must be 2D")
6472

65-
method = self.params.Control.method.value
6673
n_components = int(self.params.Control.n_components.value)
6774
perplexity = self.params.Control.tsne_perplexity.value
6875
n_neighbors = int(self.params.Control.umap_neighbors.value)
6976

70-
self.meta = data.meta.copy()
71-
if "channels" in self.meta and "dim0" in self.meta["channels"]:
72-
del self.meta["channels"]["dim0"]
77+
self.meta = data.meta
78+
if "channels" in self.meta and "dim1" in self.meta["channels"]:
79+
del self.meta["channels"]["dim1"]
7380

7481
new_components = None
7582
if method == "PCA":
76-
self.model = self.pca(n_components=n_components)
83+
self.model = self.pca_cls(n_components=n_components)
7784
self.components = self.model.fit_transform(data_array)
7885

7986
if new_data is not None:
8087
new_components = self.model.transform(new_data.data)
88+
new_meta = new_data.meta
89+
if "channels" in new_meta and "dim1" in new_meta["channels"]:
90+
del new_meta["channels"]["dim1"]
91+
8192
elif method == "t-SNE":
82-
self.model = self.tsne(n_components=n_components, perplexity=perplexity, init="pca", random_state=42)
93+
self.model = self.tsne_cls(n_components=n_components, perplexity=perplexity, init="pca", random_state=42)
8394
self.components = self.model.fit_transform(data_array)
95+
8496
elif method == "UMAP":
8597
# Initialize UMAP model
86-
self.model = self.umap.UMAP(n_neighbors=n_neighbors, n_components=n_components, random_state=42)
87-
# Train UMAP on the original dataset
88-
self.model = self.model.fit(data_array) # Save the model for future use
89-
self.components = self.model.transform(data_array) # Project original data into the UMAP space
98+
self.model = self.umap_cls(n_neighbors=n_neighbors, n_components=n_components, random_state=42)
99+
self.components = self.model.fit_transform(data_array)
90100

91101
if new_data is not None:
92-
new_components = self.umap_model.transform(new_data.data) # Project new data
93-
else:
94-
raise ValueError(f"Unsupported method: {method}")
102+
new_components = self.model.transform(new_data.data)
103+
new_meta = new_data.meta
104+
if "channels" in new_meta and "dim1" in new_meta["channels"]:
105+
del new_meta["channels"]["dim1"]
95106

96107
return {
97108
"transformed": (self.components, self.meta),

0 commit comments

Comments
 (0)