likelihood 1.2.25__py3-none-any.whl → 1.3.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- likelihood/graph/graph.py +3 -3
- likelihood/graph/nn.py +1 -1
- likelihood/models/deep/autoencoders.py +218 -23
- likelihood/models/simulation.py +0 -6
- likelihood/models/utils.py +3 -11
- likelihood/tools/tools.py +4 -2
- {likelihood-1.2.25.dist-info → likelihood-1.3.1.dist-info}/METADATA +9 -7
- likelihood-1.3.1.dist-info/RECORD +20 -0
- likelihood-1.2.25.dist-info/RECORD +0 -20
- {likelihood-1.2.25.dist-info → likelihood-1.3.1.dist-info}/LICENSE +0 -0
- {likelihood-1.2.25.dist-info → likelihood-1.3.1.dist-info}/WHEEL +0 -0
- {likelihood-1.2.25.dist-info → likelihood-1.3.1.dist-info}/top_level.txt +0 -0
likelihood/graph/graph.py
CHANGED
|
@@ -45,8 +45,8 @@ class DynamicGraph(FeatureSelection):
|
|
|
45
45
|
|
|
46
46
|
def draw(self, name="graph.html", **kwargs) -> None:
|
|
47
47
|
"""Display the network using HTML format"""
|
|
48
|
-
spring_length = kwargs
|
|
49
|
-
node_distance = kwargs
|
|
48
|
+
spring_length = kwargs.get("spring_length", 500)
|
|
49
|
+
node_distance = kwargs.get("node_distance", 100)
|
|
50
50
|
self.G.repulsion(node_distance=node_distance, spring_length=spring_length)
|
|
51
51
|
self.G.show_buttons(filter_=["physics"])
|
|
52
52
|
self.G.show(name)
|
|
@@ -89,5 +89,5 @@ if __name__ == "__main__":
|
|
|
89
89
|
df["y"] = y
|
|
90
90
|
# Instantiate DynamicGraph
|
|
91
91
|
fs = DynamicGraph(df, n_importances=2)
|
|
92
|
-
|
|
92
|
+
fs.fit()
|
|
93
93
|
fs.draw()
|
likelihood/graph/nn.py
CHANGED
|
@@ -96,7 +96,7 @@ def cal_adjacency_matrix(
|
|
|
96
96
|
|
|
97
97
|
assert len(df_categorical) > 0
|
|
98
98
|
|
|
99
|
-
similarity = kwargs
|
|
99
|
+
similarity = kwargs.get("similarity", len(df_categorical.columns) - 1)
|
|
100
100
|
assert similarity <= df_categorical.shape[1]
|
|
101
101
|
|
|
102
102
|
adj_dict = {}
|
|
@@ -19,8 +19,10 @@ from functools import wraps
|
|
|
19
19
|
|
|
20
20
|
import keras_tuner
|
|
21
21
|
import tensorflow as tf
|
|
22
|
+
from keras.src.engine.input_layer import InputLayer
|
|
22
23
|
from pandas.core.frame import DataFrame
|
|
23
24
|
from sklearn.manifold import TSNE
|
|
25
|
+
from tensorflow.keras.regularizers import l2
|
|
24
26
|
|
|
25
27
|
from likelihood.tools import OneHotEncoder
|
|
26
28
|
|
|
@@ -79,6 +81,10 @@ class AutoClassifier(tf.keras.Model):
|
|
|
79
81
|
The activation function to use for the classifier layer. Default is "softmax". If the activation function is not a classification function, the model can be used in regression problems.
|
|
80
82
|
num_layers : `int`
|
|
81
83
|
The number of hidden layers in the classifier. Default is 1.
|
|
84
|
+
dropout : `float`
|
|
85
|
+
The dropout rate to use in the classifier. Default is None.
|
|
86
|
+
l2_reg : `float`
|
|
87
|
+
The L2 regularization parameter. Default is 0.0.
|
|
82
88
|
"""
|
|
83
89
|
super(AutoClassifier, self).__init__()
|
|
84
90
|
self.input_shape_parm = input_shape_parm
|
|
@@ -91,30 +97,69 @@ class AutoClassifier(tf.keras.Model):
|
|
|
91
97
|
self.classifier = None
|
|
92
98
|
self.classifier_activation = kwargs.get("classifier_activation", "softmax")
|
|
93
99
|
self.num_layers = kwargs.get("num_layers", 1)
|
|
100
|
+
self.dropout = kwargs.get("dropout", None)
|
|
101
|
+
self.l2_reg = kwargs.get("l2_reg", 0.0)
|
|
94
102
|
|
|
95
103
|
def build(self, input_shape):
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
104
|
+
# Encoder with L2 regularization
|
|
105
|
+
self.encoder = (
|
|
106
|
+
tf.keras.Sequential(
|
|
107
|
+
[
|
|
108
|
+
tf.keras.layers.Dense(
|
|
109
|
+
units=self.units,
|
|
110
|
+
activation=self.activation,
|
|
111
|
+
kernel_regularizer=l2(self.l2_reg),
|
|
112
|
+
),
|
|
113
|
+
tf.keras.layers.Dense(
|
|
114
|
+
units=int(self.units / 2),
|
|
115
|
+
activation=self.activation,
|
|
116
|
+
kernel_regularizer=l2(self.l2_reg),
|
|
117
|
+
),
|
|
118
|
+
]
|
|
119
|
+
)
|
|
120
|
+
if not self.encoder
|
|
121
|
+
else self.encoder
|
|
101
122
|
)
|
|
102
123
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
124
|
+
# Decoder with L2 regularization
|
|
125
|
+
self.decoder = (
|
|
126
|
+
tf.keras.Sequential(
|
|
127
|
+
[
|
|
128
|
+
tf.keras.layers.Dense(
|
|
129
|
+
units=self.units,
|
|
130
|
+
activation=self.activation,
|
|
131
|
+
kernel_regularizer=l2(self.l2_reg),
|
|
132
|
+
),
|
|
133
|
+
tf.keras.layers.Dense(
|
|
134
|
+
units=self.input_shape_parm,
|
|
135
|
+
activation=self.activation,
|
|
136
|
+
kernel_regularizer=l2(self.l2_reg),
|
|
137
|
+
),
|
|
138
|
+
]
|
|
139
|
+
)
|
|
140
|
+
if not self.decoder
|
|
141
|
+
else self.decoder
|
|
108
142
|
)
|
|
109
143
|
|
|
144
|
+
# Classifier with L2 regularization
|
|
110
145
|
self.classifier = tf.keras.Sequential()
|
|
111
146
|
if self.num_layers > 1:
|
|
112
147
|
for _ in range(self.num_layers - 1):
|
|
113
148
|
self.classifier.add(
|
|
114
|
-
tf.keras.layers.Dense(
|
|
149
|
+
tf.keras.layers.Dense(
|
|
150
|
+
units=self.units,
|
|
151
|
+
activation=self.activation,
|
|
152
|
+
kernel_regularizer=l2(self.l2_reg),
|
|
153
|
+
)
|
|
115
154
|
)
|
|
155
|
+
if self.dropout:
|
|
156
|
+
self.classifier.add(tf.keras.layers.Dropout(self.dropout))
|
|
116
157
|
self.classifier.add(
|
|
117
|
-
tf.keras.layers.Dense(
|
|
158
|
+
tf.keras.layers.Dense(
|
|
159
|
+
units=self.num_classes,
|
|
160
|
+
activation=self.classifier_activation,
|
|
161
|
+
kernel_regularizer=l2(self.l2_reg),
|
|
162
|
+
)
|
|
118
163
|
)
|
|
119
164
|
|
|
120
165
|
def call(self, x):
|
|
@@ -124,6 +169,84 @@ class AutoClassifier(tf.keras.Model):
|
|
|
124
169
|
classification = self.classifier(combined)
|
|
125
170
|
return classification
|
|
126
171
|
|
|
172
|
+
def freeze_encoder_decoder(self):
|
|
173
|
+
"""
|
|
174
|
+
Freezes the encoder and decoder layers to prevent them from being updated during training.
|
|
175
|
+
"""
|
|
176
|
+
for layer in self.encoder.layers:
|
|
177
|
+
layer.trainable = False
|
|
178
|
+
for layer in self.decoder.layers:
|
|
179
|
+
layer.trainable = False
|
|
180
|
+
|
|
181
|
+
def unfreeze_encoder_decoder(self):
|
|
182
|
+
"""
|
|
183
|
+
Unfreezes the encoder and decoder layers allowing them to be updated during training.
|
|
184
|
+
"""
|
|
185
|
+
for layer in self.encoder.layers:
|
|
186
|
+
layer.trainable = True
|
|
187
|
+
for layer in self.decoder.layers:
|
|
188
|
+
layer.trainable = True
|
|
189
|
+
|
|
190
|
+
def set_encoder_decoder(self, source_model):
|
|
191
|
+
"""
|
|
192
|
+
Sets the encoder and decoder layers from another AutoClassifier instance,
|
|
193
|
+
ensuring compatibility in dimensions.
|
|
194
|
+
|
|
195
|
+
Parameters:
|
|
196
|
+
-----------
|
|
197
|
+
source_model : AutoClassifier
|
|
198
|
+
The source model to copy the encoder and decoder layers from.
|
|
199
|
+
|
|
200
|
+
Raises:
|
|
201
|
+
-------
|
|
202
|
+
ValueError
|
|
203
|
+
If the input shape or units of the source model do not match.
|
|
204
|
+
"""
|
|
205
|
+
if not isinstance(source_model, AutoClassifier):
|
|
206
|
+
raise ValueError("Source model must be an instance of AutoClassifier.")
|
|
207
|
+
|
|
208
|
+
# Check compatibility in input shape and units
|
|
209
|
+
if self.input_shape_parm != source_model.input_shape_parm:
|
|
210
|
+
raise ValueError(
|
|
211
|
+
f"Incompatible input shape. Expected {self.input_shape_parm}, got {source_model.input_shape_parm}."
|
|
212
|
+
)
|
|
213
|
+
if self.units != source_model.units:
|
|
214
|
+
raise ValueError(
|
|
215
|
+
f"Incompatible number of units. Expected {self.units}, got {source_model.units}."
|
|
216
|
+
)
|
|
217
|
+
self.encoder, self.decoder = tf.keras.Sequential(), tf.keras.Sequential()
|
|
218
|
+
# Copy the encoder layers
|
|
219
|
+
for i, layer in enumerate(source_model.encoder.layers):
|
|
220
|
+
if isinstance(layer, tf.keras.layers.Dense): # Make sure it's a Dense layer
|
|
221
|
+
dummy_input = tf.convert_to_tensor(tf.random.normal([1, layer.input_shape[1]]))
|
|
222
|
+
dense_layer = tf.keras.layers.Dense(
|
|
223
|
+
units=layer.units,
|
|
224
|
+
activation=self.activation,
|
|
225
|
+
kernel_regularizer=l2(self.l2_reg),
|
|
226
|
+
)
|
|
227
|
+
dense_layer.build(dummy_input.shape)
|
|
228
|
+
self.encoder.add(dense_layer)
|
|
229
|
+
# Set the weights correctly
|
|
230
|
+
self.encoder.layers[i].set_weights(layer.get_weights())
|
|
231
|
+
elif not isinstance(layer, InputLayer):
|
|
232
|
+
raise ValueError(f"Layer type {type(layer)} not supported for copying.")
|
|
233
|
+
|
|
234
|
+
# Copy the decoder layers
|
|
235
|
+
for i, layer in enumerate(source_model.decoder.layers):
|
|
236
|
+
if isinstance(layer, tf.keras.layers.Dense): # Ensure it's a Dense layer
|
|
237
|
+
dummy_input = tf.convert_to_tensor(tf.random.normal([1, layer.input_shape[1]]))
|
|
238
|
+
dense_layer = tf.keras.layers.Dense(
|
|
239
|
+
units=layer.units,
|
|
240
|
+
activation=self.activation,
|
|
241
|
+
kernel_regularizer=l2(self.l2_reg),
|
|
242
|
+
)
|
|
243
|
+
dense_layer.build(dummy_input.shape)
|
|
244
|
+
self.decoder.add(dense_layer)
|
|
245
|
+
# Set the weights correctly
|
|
246
|
+
self.decoder.layers[i].set_weights(layer.get_weights())
|
|
247
|
+
elif not isinstance(layer, InputLayer):
|
|
248
|
+
raise ValueError(f"Layer type {type(layer)} not supported for copying.")
|
|
249
|
+
|
|
127
250
|
def get_config(self):
|
|
128
251
|
config = {
|
|
129
252
|
"input_shape_parm": self.input_shape_parm,
|
|
@@ -132,6 +255,8 @@ class AutoClassifier(tf.keras.Model):
|
|
|
132
255
|
"activation": self.activation,
|
|
133
256
|
"classifier_activation": self.classifier_activation,
|
|
134
257
|
"num_layers": self.num_layers,
|
|
258
|
+
"dropout": self.dropout,
|
|
259
|
+
"l2_reg": self.l2_reg,
|
|
135
260
|
}
|
|
136
261
|
base_config = super(AutoClassifier, self).get_config()
|
|
137
262
|
return dict(list(base_config.items()) + list(config.items()))
|
|
@@ -145,6 +270,8 @@ class AutoClassifier(tf.keras.Model):
|
|
|
145
270
|
activation=config["activation"],
|
|
146
271
|
classifier_activation=config["classifier_activation"],
|
|
147
272
|
num_layers=config["num_layers"],
|
|
273
|
+
dropout=config["dropout"],
|
|
274
|
+
l2_reg=config["l2_reg"],
|
|
148
275
|
)
|
|
149
276
|
|
|
150
277
|
|
|
@@ -156,6 +283,7 @@ def call_existing_code(
|
|
|
156
283
|
input_shape_parm: None | int = None,
|
|
157
284
|
num_classes: None | int = None,
|
|
158
285
|
num_layers: int = 1,
|
|
286
|
+
**kwargs,
|
|
159
287
|
) -> AutoClassifier:
|
|
160
288
|
"""
|
|
161
289
|
Calls an existing AutoClassifier instance.
|
|
@@ -180,12 +308,16 @@ def call_existing_code(
|
|
|
180
308
|
`AutoClassifier`
|
|
181
309
|
The AutoClassifier instance.
|
|
182
310
|
"""
|
|
311
|
+
dropout = kwargs.get("dropout", None)
|
|
312
|
+
l2_reg = kwargs.get("l2_reg", 0.0)
|
|
183
313
|
model = AutoClassifier(
|
|
184
314
|
input_shape_parm=input_shape_parm,
|
|
185
315
|
num_classes=num_classes,
|
|
186
316
|
units=units,
|
|
187
317
|
activation=activation,
|
|
188
318
|
num_layers=num_layers,
|
|
319
|
+
dropout=dropout,
|
|
320
|
+
l2_reg=l2_reg,
|
|
189
321
|
)
|
|
190
322
|
model.compile(
|
|
191
323
|
optimizer=optimizer,
|
|
@@ -232,27 +364,65 @@ def build_model(
|
|
|
232
364
|
step=2,
|
|
233
365
|
)
|
|
234
366
|
if "units" not in hyperparameters_keys
|
|
235
|
-
else
|
|
367
|
+
else (
|
|
368
|
+
hp.Choice("units", hyperparameters["units"])
|
|
369
|
+
if isinstance(hyperparameters["units"], list)
|
|
370
|
+
else hyperparameters["units"]
|
|
371
|
+
)
|
|
236
372
|
)
|
|
237
373
|
activation = (
|
|
238
374
|
hp.Choice("activation", ["sigmoid", "relu", "tanh", "selu", "softplus", "softsign"])
|
|
239
375
|
if "activation" not in hyperparameters_keys
|
|
240
|
-
else
|
|
376
|
+
else (
|
|
377
|
+
hp.Choice("activation", hyperparameters["activation"])
|
|
378
|
+
if isinstance(hyperparameters["activation"], list)
|
|
379
|
+
else hyperparameters["activation"]
|
|
380
|
+
)
|
|
241
381
|
)
|
|
242
382
|
optimizer = (
|
|
243
383
|
hp.Choice("optimizer", ["sgd", "adam", "adadelta", "rmsprop", "adamax", "adagrad"])
|
|
244
384
|
if "optimizer" not in hyperparameters_keys
|
|
245
|
-
else
|
|
385
|
+
else (
|
|
386
|
+
hp.Choice("optimizer", hyperparameters["optimizer"])
|
|
387
|
+
if isinstance(hyperparameters["optimizer"], list)
|
|
388
|
+
else hyperparameters["optimizer"]
|
|
389
|
+
)
|
|
246
390
|
)
|
|
247
391
|
threshold = (
|
|
248
392
|
hp.Float("threshold", min_value=0.1, max_value=0.9, sampling="log")
|
|
249
393
|
if "threshold" not in hyperparameters_keys
|
|
250
|
-
else
|
|
394
|
+
else (
|
|
395
|
+
hp.Choice("threshold", hyperparameters["threshold"])
|
|
396
|
+
if isinstance(hyperparameters["threshold"], list)
|
|
397
|
+
else hyperparameters["threshold"]
|
|
398
|
+
)
|
|
251
399
|
)
|
|
252
400
|
num_layers = (
|
|
253
401
|
hp.Int("num_layers", min_value=1, max_value=10, step=1)
|
|
254
402
|
if "num_layers" not in hyperparameters_keys
|
|
255
|
-
else
|
|
403
|
+
else (
|
|
404
|
+
hp.Choice("num_layers", hyperparameters["num_layers"])
|
|
405
|
+
if isinstance(hyperparameters["num_layers"], list)
|
|
406
|
+
else hyperparameters["num_layers"]
|
|
407
|
+
)
|
|
408
|
+
)
|
|
409
|
+
dropout = (
|
|
410
|
+
hp.Float("dropout", min_value=0.1, max_value=0.9, sampling="log")
|
|
411
|
+
if "dropout" not in hyperparameters_keys
|
|
412
|
+
else (
|
|
413
|
+
hp.Choice("dropout", hyperparameters["dropout"])
|
|
414
|
+
if isinstance(hyperparameters["dropout"], list)
|
|
415
|
+
else hyperparameters["dropout"]
|
|
416
|
+
)
|
|
417
|
+
)
|
|
418
|
+
l2_reg = (
|
|
419
|
+
hp.Float("l2_reg", min_value=1e-6, max_value=0.1, sampling="log")
|
|
420
|
+
if "l2_reg" not in hyperparameters_keys
|
|
421
|
+
else (
|
|
422
|
+
hp.Choice("l2_reg", hyperparameters["l2_reg"])
|
|
423
|
+
if isinstance(hyperparameters["l2_reg"], list)
|
|
424
|
+
else hyperparameters["l2_reg"]
|
|
425
|
+
)
|
|
256
426
|
)
|
|
257
427
|
|
|
258
428
|
model = call_existing_code(
|
|
@@ -263,6 +433,8 @@ def build_model(
|
|
|
263
433
|
input_shape_parm=input_shape_parm,
|
|
264
434
|
num_classes=num_classes,
|
|
265
435
|
num_layers=num_layers,
|
|
436
|
+
dropout=dropout,
|
|
437
|
+
l2_reg=l2_reg,
|
|
266
438
|
)
|
|
267
439
|
return model
|
|
268
440
|
|
|
@@ -408,10 +580,8 @@ class GetInsights:
|
|
|
408
580
|
self.model = model
|
|
409
581
|
self.encoder_layer = self.model.encoder.layers[0]
|
|
410
582
|
self.decoder_layer = self.model.decoder.layers[0]
|
|
411
|
-
self.classifier_layer = self.model.classifier.layers[-2]
|
|
412
583
|
self.encoder_weights = self.encoder_layer.get_weights()[0]
|
|
413
584
|
self.decoder_weights = self.decoder_layer.get_weights()[0]
|
|
414
|
-
self.classifier_weights = self.classifier_layer.get_weights()[0]
|
|
415
585
|
colors = dict(mcolors.BASE_COLORS, **mcolors.CSS4_COLORS)
|
|
416
586
|
|
|
417
587
|
by_hsv = sorted(
|
|
@@ -463,11 +633,31 @@ class GetInsights:
|
|
|
463
633
|
)
|
|
464
634
|
self.data["class"] = self.classification
|
|
465
635
|
self.data_input["class"] = self.classification
|
|
466
|
-
|
|
636
|
+
|
|
637
|
+
self.data_normalized = self.data.copy(deep=True)
|
|
638
|
+
self.data_normalized.iloc[:, :-1] = (
|
|
639
|
+
2.0
|
|
640
|
+
* (self.data_normalized.iloc[:, :-1] - self.data_normalized.iloc[:, :-1].min())
|
|
641
|
+
/ (self.data_normalized.iloc[:, :-1].max() - self.data_normalized.iloc[:, :-1].min())
|
|
642
|
+
- 1
|
|
643
|
+
)
|
|
644
|
+
radviz(self.data_normalized, "class", color=self.colors)
|
|
467
645
|
plt.title("Radviz Visualization of Latent Space")
|
|
468
646
|
plt.show()
|
|
469
|
-
|
|
470
|
-
|
|
647
|
+
self.data_input_normalized = self.data_input.copy(deep=True)
|
|
648
|
+
self.data_input_normalized.iloc[:, :-1] = (
|
|
649
|
+
2.0
|
|
650
|
+
* (
|
|
651
|
+
self.data_input_normalized.iloc[:, :-1]
|
|
652
|
+
- self.data_input_normalized.iloc[:, :-1].min()
|
|
653
|
+
)
|
|
654
|
+
/ (
|
|
655
|
+
self.data_input_normalized.iloc[:, :-1].max()
|
|
656
|
+
- self.data_input_normalized.iloc[:, :-1].min()
|
|
657
|
+
)
|
|
658
|
+
- 1
|
|
659
|
+
)
|
|
660
|
+
radviz(self.data_input_normalized, "class", color=self.colors)
|
|
471
661
|
plt.title("Radviz Visualization of Input Data")
|
|
472
662
|
plt.show()
|
|
473
663
|
return self._statistics(self.data_input)
|
|
@@ -580,7 +770,12 @@ if __name__ == "__main__":
|
|
|
580
770
|
y = np.asarray(y).astype(np.float32)
|
|
581
771
|
|
|
582
772
|
model = AutoClassifier(
|
|
583
|
-
input_shape_parm=X.shape[1],
|
|
773
|
+
input_shape_parm=X.shape[1],
|
|
774
|
+
num_classes=3,
|
|
775
|
+
units=27,
|
|
776
|
+
activation="tanh",
|
|
777
|
+
num_layers=2,
|
|
778
|
+
dropout=0.2,
|
|
584
779
|
)
|
|
585
780
|
model.compile(
|
|
586
781
|
optimizer="adam",
|
likelihood/models/simulation.py
CHANGED
|
@@ -2,31 +2,25 @@ import pickle
|
|
|
2
2
|
import warnings
|
|
3
3
|
from typing import List, Tuple, Union
|
|
4
4
|
|
|
5
|
-
import matplotlib.pyplot as plt
|
|
6
5
|
import numpy as np
|
|
7
6
|
import pandas as pd
|
|
8
7
|
from pandas.core.frame import DataFrame
|
|
9
8
|
|
|
10
9
|
from likelihood.tools import DataScaler, FeatureSelection, OneHotEncoder, cdf, check_nan_inf
|
|
11
10
|
|
|
12
|
-
# Suppress RankWarning
|
|
13
11
|
warnings.simplefilter("ignore", np.RankWarning)
|
|
14
12
|
|
|
15
13
|
|
|
16
14
|
# --------------------------------------------------------------------------------------------------------------------------------------
|
|
17
15
|
def categories_by_quartile(df: DataFrame, column: str) -> Tuple[str, str]:
|
|
18
|
-
# Count the frequency of each category in the column
|
|
19
16
|
freq = df[column].value_counts()
|
|
20
17
|
|
|
21
|
-
# Calculate the 25th percentile (Q1) and 75th percentile (Q3)
|
|
22
18
|
q1 = freq.quantile(0.25)
|
|
23
19
|
q3 = freq.quantile(0.75)
|
|
24
20
|
|
|
25
|
-
# Filter categories that are below the 25th percentile and above the 75th percentile
|
|
26
21
|
least_frequent = freq[freq <= q1]
|
|
27
22
|
most_frequent = freq[freq >= q3]
|
|
28
23
|
|
|
29
|
-
# Get the least frequent category (25th percentile) and the most frequent category (75th percentile)
|
|
30
24
|
least_frequent_category = least_frequent.idxmin() if not least_frequent.empty else None
|
|
31
25
|
most_frequent_category = most_frequent.idxmax() if not most_frequent.empty else None
|
|
32
26
|
|
likelihood/models/utils.py
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import matplotlib.pyplot as plt
|
|
2
1
|
import numpy as np
|
|
3
|
-
from numpy import ndarray
|
|
4
2
|
|
|
5
3
|
from likelihood.tools import cal_average
|
|
6
4
|
|
|
7
5
|
|
|
8
6
|
class FeaturesArima:
|
|
9
|
-
def forward(self, y_sum: ndarray, theta: list, mode: bool, noise: float):
|
|
7
|
+
def forward(self, y_sum: np.ndarray, theta: list, mode: bool, noise: float):
|
|
10
8
|
if mode:
|
|
11
9
|
y_vec = []
|
|
12
10
|
|
|
@@ -31,20 +29,14 @@ class FeaturesArima:
|
|
|
31
29
|
|
|
32
30
|
return np.array(y_vec)
|
|
33
31
|
|
|
34
|
-
def integrated(self, datapoints: ndarray):
|
|
32
|
+
def integrated(self, datapoints: np.ndarray):
|
|
35
33
|
datapoints = self.datapoints
|
|
36
|
-
# n = datapoints.shape[0]
|
|
37
|
-
|
|
38
|
-
# y_sum = [
|
|
39
|
-
# ((1.0 - datapoints[i - 1] / datapoints[i]) ** self.d) * datapoints[i]
|
|
40
|
-
# for i in range(1, n)
|
|
41
|
-
# ]
|
|
42
34
|
y_sum = list(np.diff(datapoints, self.d))
|
|
43
35
|
y_sum.insert(0, datapoints[0])
|
|
44
36
|
|
|
45
37
|
return np.array(y_sum)
|
|
46
38
|
|
|
47
|
-
def average(self, datapoints: ndarray):
|
|
39
|
+
def average(self, datapoints: np.ndarray):
|
|
48
40
|
y_sum_average = cal_average(datapoints)
|
|
49
41
|
y_sum_eps = datapoints - y_sum_average
|
|
50
42
|
|
likelihood/tools/tools.py
CHANGED
|
@@ -979,6 +979,7 @@ class PerformanceMeasures:
|
|
|
979
979
|
def f_mean(self, y_true: np.ndarray, y_pred: np.ndarray, labels: List[int]) -> float:
|
|
980
980
|
F_vec = self._f1_score(y_true, y_pred, labels)
|
|
981
981
|
mean_f_measure = np.mean(F_vec)
|
|
982
|
+
mean_f_measure = np.around(mean_f_measure, decimals=4)
|
|
982
983
|
|
|
983
984
|
for label, f_measure in zip(labels, F_vec):
|
|
984
985
|
print(f"F-measure of label {label} -> {f_measure}")
|
|
@@ -1005,9 +1006,9 @@ class PerformanceMeasures:
|
|
|
1005
1006
|
|
|
1006
1007
|
def _summary_pred(self, y_true: np.ndarray, y_pred: np.ndarray, labels: List[int]) -> None:
|
|
1007
1008
|
count_mat = self._confu_mat(y_true, y_pred, labels)
|
|
1008
|
-
print("
|
|
1009
|
+
print(" " * 6, " | ".join(f"--{label}--" for label in labels))
|
|
1009
1010
|
for i, label_i in enumerate(labels):
|
|
1010
|
-
row = [f"
|
|
1011
|
+
row = [f" {int(count_mat[i, j]):5d} " for j in range(len(labels))]
|
|
1011
1012
|
print(f"--{label_i}--|", " | ".join(row))
|
|
1012
1013
|
|
|
1013
1014
|
def _f1_score(self, y_true: np.ndarray, y_pred: np.ndarray, labels: List[int]) -> np.ndarray:
|
|
@@ -1023,6 +1024,7 @@ class PerformanceMeasures:
|
|
|
1023
1024
|
count_mat.diagonal(), sum_rows, out=np.zeros_like(sum_rows), where=sum_rows != 0
|
|
1024
1025
|
)
|
|
1025
1026
|
f1_vec = 2 * ((precision * recall) / (precision + recall))
|
|
1027
|
+
f1_vec = np.around(f1_vec, decimals=4)
|
|
1026
1028
|
|
|
1027
1029
|
return f1_vec
|
|
1028
1030
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: likelihood
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.1
|
|
4
4
|
Summary: A package that performs the maximum likelihood algorithm.
|
|
5
5
|
Home-page: https://github.com/jzsmoreno/likelihood/
|
|
6
6
|
Author: J. A. Moreno-Guerra
|
|
@@ -14,14 +14,16 @@ Requires-Python: >=3.10
|
|
|
14
14
|
Description-Content-Type: text/markdown
|
|
15
15
|
License-File: LICENSE
|
|
16
16
|
Requires-Dist: black[jupyter]>=24.3.0
|
|
17
|
-
Requires-Dist: mypy-extensions
|
|
18
|
-
Requires-Dist: types-openpyxl
|
|
19
|
-
Requires-Dist: pydocstyle
|
|
20
|
-
Requires-Dist: flake8
|
|
21
|
-
Requires-Dist: isort
|
|
22
|
-
Requires-Dist: mypy
|
|
17
|
+
Requires-Dist: mypy-extensions>=1.0.0
|
|
18
|
+
Requires-Dist: types-openpyxl>=3.1.0.15
|
|
19
|
+
Requires-Dist: pydocstyle>=6.3.0
|
|
20
|
+
Requires-Dist: flake8>=6.0.0
|
|
21
|
+
Requires-Dist: isort>=5.12.0
|
|
22
|
+
Requires-Dist: mypy>=1.4.1
|
|
23
23
|
Requires-Dist: numpy<2.0.0
|
|
24
|
+
Requires-Dist: pydot==2.0.0
|
|
24
25
|
Requires-Dist: matplotlib
|
|
26
|
+
Requires-Dist: graphviz
|
|
25
27
|
Requires-Dist: pyyaml
|
|
26
28
|
Requires-Dist: pandas
|
|
27
29
|
Requires-Dist: corner
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
likelihood/__init__.py,sha256=5C0hapdsk85XZhN_rssRAEFpkRRuKNtj6cyRbqD2_gM,994
|
|
2
|
+
likelihood/main.py,sha256=fcCkGOOWKjfvw2tLVqjuKPV8t0rVCIT9FlbYcOv4EYo,7974
|
|
3
|
+
likelihood/graph/__init__.py,sha256=6TuFDfmXTwpLyHl7_KqBfdzW6zqHjGzIFvymjFPlvjI,21
|
|
4
|
+
likelihood/graph/graph.py,sha256=bLrNMvIh7GOTdPTwnNss8oPZ7cbSHQScAsH_ttmVUK0,3294
|
|
5
|
+
likelihood/graph/nn.py,sha256=-OvHAeB3l2nd0ZeAk03cVDGBgaTn-WyGIsj5Rq7XeCY,12237
|
|
6
|
+
likelihood/models/__init__.py,sha256=e6nB4w47w0Q9DrAFeP3OcUgcoHOtf7Il4mBhgf4AARg,52
|
|
7
|
+
likelihood/models/hmm.py,sha256=0s0gFySH1u4NjRaZDxiZ8oeTaFhFrw1x0GJxwy3dFrA,6253
|
|
8
|
+
likelihood/models/regression.py,sha256=9cakyGlJCEO6WfpoKLh3GxdXQeQp7cUvJIkQ5odT0TA,9404
|
|
9
|
+
likelihood/models/simulation.py,sha256=LFyE_szo7sDukviMLeg_6RoyAaI7yMXUy8f4mDOrGoc,8460
|
|
10
|
+
likelihood/models/utils.py,sha256=dvigPi_hxcs5ntfHr7Y1JvP5ULtMW3kkN0nJpS4orE8,1319
|
|
11
|
+
likelihood/models/deep/__init__.py,sha256=-KIPippVaMqgG8mEgYjNxYQdqOUcFhUuKhbVe8TTCfo,28
|
|
12
|
+
likelihood/models/deep/autoencoders.py,sha256=S11ARmoROTNFC4AZLuTcB-ymbm14NUH-a0Dg861fsYM,28203
|
|
13
|
+
likelihood/tools/__init__.py,sha256=MCjsCWfBNKE2uMN0VizDN1uFzZ_md0X2WZeBdWhrCR8,50
|
|
14
|
+
likelihood/tools/numeric_tools.py,sha256=FA44kbiAcxcquz1el_g3Pqsp5ii8XFkAIrsMs5bGkj0,11445
|
|
15
|
+
likelihood/tools/tools.py,sha256=6JLZBHxc4f1lJfw4aBwdS2s16EpydFNqLZF73I7wddQ,44412
|
|
16
|
+
likelihood-1.3.1.dist-info/LICENSE,sha256=XWHWt9egYEUHGPTnlcZfJKLPmysacOwdiLj_-J7Z9ew,1066
|
|
17
|
+
likelihood-1.3.1.dist-info/METADATA,sha256=CuHvFiy8Pr1ToXw2oCvqoEsnImRtcifH2Mn7HQnFEkc,2822
|
|
18
|
+
likelihood-1.3.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
19
|
+
likelihood-1.3.1.dist-info/top_level.txt,sha256=KDiBLr870YTxqLFqObTOSrTK10uw8dFsITSNLlte3PA,11
|
|
20
|
+
likelihood-1.3.1.dist-info/RECORD,,
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
likelihood/__init__.py,sha256=5C0hapdsk85XZhN_rssRAEFpkRRuKNtj6cyRbqD2_gM,994
|
|
2
|
-
likelihood/main.py,sha256=fcCkGOOWKjfvw2tLVqjuKPV8t0rVCIT9FlbYcOv4EYo,7974
|
|
3
|
-
likelihood/graph/__init__.py,sha256=6TuFDfmXTwpLyHl7_KqBfdzW6zqHjGzIFvymjFPlvjI,21
|
|
4
|
-
likelihood/graph/graph.py,sha256=hGWCznxaRQ8BfY2aLjrvwriZkAIsz5ydKXF4x_7b0EQ,3359
|
|
5
|
-
likelihood/graph/nn.py,sha256=WuK66hRTN5hdVIArgfSweqtE098tb6QFd2ZMFaHvnZA,12263
|
|
6
|
-
likelihood/models/__init__.py,sha256=e6nB4w47w0Q9DrAFeP3OcUgcoHOtf7Il4mBhgf4AARg,52
|
|
7
|
-
likelihood/models/hmm.py,sha256=0s0gFySH1u4NjRaZDxiZ8oeTaFhFrw1x0GJxwy3dFrA,6253
|
|
8
|
-
likelihood/models/regression.py,sha256=9cakyGlJCEO6WfpoKLh3GxdXQeQp7cUvJIkQ5odT0TA,9404
|
|
9
|
-
likelihood/models/simulation.py,sha256=L_9Mihcca7i_AnvWWrZilFV8VEhz_Z8fDLepmwBGSi8,8832
|
|
10
|
-
likelihood/models/utils.py,sha256=VtEj07lV-GRoWraQgpfjU0jTt1Ntf9MXgYwe6XYQh20,1552
|
|
11
|
-
likelihood/models/deep/__init__.py,sha256=-KIPippVaMqgG8mEgYjNxYQdqOUcFhUuKhbVe8TTCfo,28
|
|
12
|
-
likelihood/models/deep/autoencoders.py,sha256=seE1rb1t1gbbKRyEzfi01BqMsV4MU6yakVTLcukAMkg,20591
|
|
13
|
-
likelihood/tools/__init__.py,sha256=MCjsCWfBNKE2uMN0VizDN1uFzZ_md0X2WZeBdWhrCR8,50
|
|
14
|
-
likelihood/tools/numeric_tools.py,sha256=FA44kbiAcxcquz1el_g3Pqsp5ii8XFkAIrsMs5bGkj0,11445
|
|
15
|
-
likelihood/tools/tools.py,sha256=iZBC7IHTFpAyxooyel7ZFi-5-G0nCotNLLtxenPw9T8,44303
|
|
16
|
-
likelihood-1.2.25.dist-info/LICENSE,sha256=XWHWt9egYEUHGPTnlcZfJKLPmysacOwdiLj_-J7Z9ew,1066
|
|
17
|
-
likelihood-1.2.25.dist-info/METADATA,sha256=hUsmkghXP8m4z3FtWcM64gwBEW74HIOTNJifK26OOkw,2771
|
|
18
|
-
likelihood-1.2.25.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
19
|
-
likelihood-1.2.25.dist-info/top_level.txt,sha256=KDiBLr870YTxqLFqObTOSrTK10uw8dFsITSNLlte3PA,11
|
|
20
|
-
likelihood-1.2.25.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|