fix: use Procrustes-aligned scores for all 10 SVD components (consistent with compass)

main
Sven Geboers 2 weeks ago
parent fafb53cb3d
commit 0d17c6364a
  1. 24
      explorer.py

@ -2670,22 +2670,16 @@ def build_svd_components_tab(db_path: str) -> None:
if score_list if score_list
} }
# Extract 1D scores for this component. # Extract 1D scores for this component using Procrustes-aligned PCA scores.
# Components 1 and 2 are literally the x and y axes of the compass (Procrustes-aligned # All 10 components use _get_aligned_party_scores (compute_nd_axes with annual-only
# PCA via compute_2d_axes). Use _get_aligned_party_coords so the numbers are identical # windows). This is mathematically identical to the compass x/y positions for
# to what the compass shows. Components 3-10 fall back to compute_nd_axes scores. # components 1 and 2, and consistently uses the same aligned data for 3-10.
party_1d_coords: dict = {} party_1d_coords: dict = {}
if comp_sel in (1, 2): aligned_all_scores = _get_aligned_party_scores(svd_window)
coord_idx = 0 if comp_sel == 1 else 1 for party, all_scores in aligned_all_scores.items():
aligned_2d = _get_aligned_party_coords(svd_window) idx = comp_sel - 1 # 0-indexed
for party, xy in aligned_2d.items(): if idx < len(all_scores):
party_1d_coords[party] = (float(xy[coord_idx]),) party_1d_coords[party] = (float(all_scores[idx]),)
else:
aligned_all_scores = _get_aligned_party_scores(svd_window)
for party, all_scores in aligned_all_scores.items():
idx = comp_sel - 1 # 0-indexed
if idx < len(all_scores):
party_1d_coords[party] = (float(all_scores[idx]),)
# Auto-compute flip directions for ALL components 1-10 based on aligned party centroids. # Auto-compute flip directions for ALL components 1-10 based on aligned party centroids.
# Since we now use aligned PCA scores for all components, compute flip directly from # Since we now use aligned PCA scores for all components, compute flip directly from

Loading…
Cancel
Save