Skip to content

feat(metrics): Rényi-Entropy-Spektrum & Hill-Numbers (effektive Vokabulargröße) #46

Description

@aspala

Was & Warum

Metrics.File.Entropy liefert nur Shannon (α=1). Rényi-Entropy verallgemeinert das über einen Parameter α: kleine α gewichten seltene Tokens stärker, große α nur die häufigsten. Das liefert ein Spektrum statt eines Skalars und charakterisiert die Verteilungsform robuster.

Hill-Numbers D = exp(H_α) sind die „effektive Vokabulargröße" — interpretierbarer als rohe vocab_size: sagt, wie viele Tokens wirklich zählen.

Quasi gratis, weil die Frequenzen aus ctx.token_counts schon da sind — gleicher Aufbau wie Shannon.

Skala (Spektrum-Steilheit H₀ vs. H₂)

Verhalten Beispiel Spektrum
flach (uniform) a b c d e f g h H₀ ≈ H₂
mittel leichte Schieflage H₀ > H₂
steil (dominiert) x x x x x x x y H₀ >> H₂, Hill-Number << vocab_size

Umsetzung

  • Neues Modul lib/codeqa/metrics/file/renyi_entropy.ex, @behaviour CodeQA.Metrics.File.FileMetric.
  • Input: ctx.token_counts → Wahrscheinlichkeitsverteilung. Rényi für α ∈ {0, 1, 2, ∞} berechnen (α=1 = Shannon-Limit als Spezialfall behandeln).
  • keys: ["renyi_0", "renyi_1", "renyi_2", "renyi_inf", "hill_1", "hill_2", "spectrum_slope"] (spectrum_slope = H₀−H₂ als Konzentrations-Indikator).
  • Registrieren in lib/codeqa/engine/analyzer.ex.
  • Edge-Cases: leer / 1 unique Token → Nullwerte bzw. Hill-Number = vocab_size.

Test

  • test/codeqa/metrics/file/renyi_entropy_test.exs, Muster wie brevity_test.exs.
  • Assertion: uniforme Verteilung → renyi_0 ≈ renyi_2, spectrum_slope ≈ 0; dominiertes Token → spectrum_slope groß, hill_2 << vocab_size.

Hinweis

Überlappt thematisch mit #44 (Yule's K / Simpson's D) — beide messen Konzentration. Rényi über Entropy-Achse, Yule über Frequenz-Spektrum. Komplementär, beide bauen.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions