@@ -27,13 +27,13 @@ def config_params():
27
27
}
28
28
29
29
def setup (self ):
30
- import umap
31
30
from sklearn .decomposition import PCA
32
31
from sklearn .manifold import TSNE
32
+ from umap import UMAP
33
33
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
37
37
38
38
self .model = None
39
39
self .components = None
@@ -43,6 +43,7 @@ def process(self, data: Data, new_data: Data):
43
43
if data is None :
44
44
return None
45
45
46
+ method = self .params .Control .method .value
46
47
data_array = np .squeeze (data .data )
47
48
48
49
if self .params .Control .reset .value :
@@ -53,45 +54,55 @@ def process(self, data: Data, new_data: Data):
53
54
if self .components is not None :
54
55
new_components = None
55
56
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
+
56
60
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
+
57
65
return {
58
66
"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 ,
60
68
}
61
69
62
70
if data_array .ndim != 2 :
63
71
raise ValueError ("Data must be 2D" )
64
72
65
- method = self .params .Control .method .value
66
73
n_components = int (self .params .Control .n_components .value )
67
74
perplexity = self .params .Control .tsne_perplexity .value
68
75
n_neighbors = int (self .params .Control .umap_neighbors .value )
69
76
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 " ]
73
80
74
81
new_components = None
75
82
if method == "PCA" :
76
- self .model = self .pca (n_components = n_components )
83
+ self .model = self .pca_cls (n_components = n_components )
77
84
self .components = self .model .fit_transform (data_array )
78
85
79
86
if new_data is not None :
80
87
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
+
81
92
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 )
83
94
self .components = self .model .fit_transform (data_array )
95
+
84
96
elif method == "UMAP" :
85
97
# 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 )
90
100
91
101
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" ]
95
106
96
107
return {
97
108
"transformed" : (self .components , self .meta ),
0 commit comments