Upload 2 files
Browse files- api.py +8 -5
- character_detection.py +7 -4
api.py
CHANGED
|
@@ -180,8 +180,9 @@ def hierarchical_cluster_with_min_size(X, max_groups: int, min_cluster_size: int
|
|
| 180 |
# Si hay menos muestras que el mínimo, todo es ruido
|
| 181 |
return np.full(len(X), -1, dtype=int)
|
| 182 |
|
| 183 |
-
# Linkage usando
|
| 184 |
-
|
|
|
|
| 185 |
|
| 186 |
# Encontrar el número óptimo de clusters usando silhouette score
|
| 187 |
best_n_clusters = 2
|
|
@@ -201,9 +202,11 @@ def hierarchical_cluster_with_min_size(X, max_groups: int, min_cluster_size: int
|
|
| 201 |
# Solo evaluar si hay al menos 2 clusters válidos
|
| 202 |
if valid_clusters >= 2:
|
| 203 |
try:
|
| 204 |
-
score = silhouette_score(X, trial_labels, metric='
|
| 205 |
-
# Penalizar
|
| 206 |
-
|
|
|
|
|
|
|
| 207 |
|
| 208 |
if adjusted_score > best_score:
|
| 209 |
best_score = adjusted_score
|
|
|
|
| 180 |
# Si hay menos muestras que el mínimo, todo es ruido
|
| 181 |
return np.full(len(X), -1, dtype=int)
|
| 182 |
|
| 183 |
+
# Linkage usando average linkage (más flexible que ward, menos sensible a outliers)
|
| 184 |
+
# Esto ayuda a agrupar mejor la misma persona con diferentes ángulos/expresiones
|
| 185 |
+
Z = linkage(X, method='average', metric='cosine') # Cosine similarity para embeddings
|
| 186 |
|
| 187 |
# Encontrar el número óptimo de clusters usando silhouette score
|
| 188 |
best_n_clusters = 2
|
|
|
|
| 202 |
# Solo evaluar si hay al menos 2 clusters válidos
|
| 203 |
if valid_clusters >= 2:
|
| 204 |
try:
|
| 205 |
+
score = silhouette_score(X, trial_labels, metric='cosine')
|
| 206 |
+
# Penalizar configuraciones con muchos clusters para evitar overfitting
|
| 207 |
+
# Penalización más fuerte para reducir duplicados
|
| 208 |
+
# Si siguen apareciendo duplicados, aumentar a 0.05 o 0.07
|
| 209 |
+
adjusted_score = score - (n_clusters * 0.03)
|
| 210 |
|
| 211 |
if adjusted_score > best_score:
|
| 212 |
best_score = adjusted_score
|
character_detection.py
CHANGED
|
@@ -197,8 +197,9 @@ class CharacterDetector:
|
|
| 197 |
# Si hay menos muestras que el mínimo, todo es ruido
|
| 198 |
return np.full(len(X), -1, dtype=int)
|
| 199 |
|
| 200 |
-
# Linkage usando
|
| 201 |
-
|
|
|
|
| 202 |
|
| 203 |
# Encontrar el número óptimo de clusters usando silhouette score
|
| 204 |
from sklearn.metrics import silhouette_score
|
|
@@ -216,8 +217,10 @@ class CharacterDetector:
|
|
| 216 |
|
| 217 |
if valid_clusters >= 2:
|
| 218 |
try:
|
| 219 |
-
score = silhouette_score(X, trial_labels, metric='
|
| 220 |
-
|
|
|
|
|
|
|
| 221 |
|
| 222 |
if adjusted_score > best_score:
|
| 223 |
best_score = adjusted_score
|
|
|
|
| 197 |
# Si hay menos muestras que el mínimo, todo es ruido
|
| 198 |
return np.full(len(X), -1, dtype=int)
|
| 199 |
|
| 200 |
+
# Linkage usando average linkage (más flexible que ward, menos sensible a outliers)
|
| 201 |
+
# Esto ayuda a agrupar mejor la misma persona con diferentes ángulos/expresiones
|
| 202 |
+
Z = linkage(X, method='average', metric='cosine') # Cosine similarity para embeddings
|
| 203 |
|
| 204 |
# Encontrar el número óptimo de clusters usando silhouette score
|
| 205 |
from sklearn.metrics import silhouette_score
|
|
|
|
| 217 |
|
| 218 |
if valid_clusters >= 2:
|
| 219 |
try:
|
| 220 |
+
score = silhouette_score(X, trial_labels, metric='cosine')
|
| 221 |
+
# Penalización más fuerte para reducir duplicados
|
| 222 |
+
# Si siguen apareciendo duplicados, aumentar a 0.05 o 0.07
|
| 223 |
+
adjusted_score = score - (n_clusters * 0.03)
|
| 224 |
|
| 225 |
if adjusted_score > best_score:
|
| 226 |
best_score = adjusted_score
|