Adjustment UDF v26.4 — Release Notes
Dieses Release bringt ein vollständiges interaktives Regressions-Tool als Beispiel, eine deutlich schnellere robuste Schätzung sowie mehrere neue Diagnose- und Statistik-Funktionen. Daneben wurden eine Reihe numerischer und code-technischer Bugs behoben.
Download: Release v26.4 auf GitHub
────────────────────────────────────────
Highlight: Interactive Regression
────────────────────────────────────────
Das neue Beispiel 'examples/InteractiveRegression.au3' ist ein vollständiges GUI-Tool für Curve-Fitting per Least-Squares. Es kombiniert alle Kernfähigkeiten der UDF in einer kompakten, interaktiv bedienbaren Oberfläche — und ist gleichzeitig als Lernwerkzeug konzipiert: Beim Spielen mit den Modi und Daten lassen sich die Auswirkungen von Fehlerannahmen, Gewichtung und Modellwahl direkt im Plot beobachten.
Funktionsumfang:
- Vier Regressionsmodi: Normal (OLS/WLS), Orthogonal (TLS), Deming, York
- Symbolische Formeleingabe mit automatischer Parameter- und Beobachtungserkennung (z.B. 'A * #X + B')
- Editierbare Tabellen für Daten und Parameter, mit Tab-/Enter-/Pfeiltasten-Navigation und Excel-kompatiblem Mehrzellen-Paste
- Live-Plot mit Datenpunkten, gefitteter Kurve, Residuen-Linien und optionalem 1σ/2σ-Konfidenzband (GDI+)
- Robuste Schätzung mit allen sechs M-Schätzern der UDF
- CSV-Import (Auto-Erkennung Trennzeichen und Dezimaltrenner) sowie CSV-Export mit Formel-Metadaten (Round-Trip)
- Vorhersage mit korrekter σ-Propagation
- Ausreißer-Highlighting basierend auf normierten Verbesserungen
- "σ · s₀"-Knopf für globale Varianzfaktor-Skalierung der σ-Eingaben
────────────────────────────────────────
Performance: Schnellere robuste Schätzung
────────────────────────────────────────
Iterative Reweighted Least Squares (IRLS) ist bei großen Problemen oder vielen Iterationen der Hauptkostenfaktor. Mehrere Optimierungen reduzieren die Laufzeit deutlich, ohne Genauigkeit zu verlieren:
- Warm-Start des Gauß-Newton-Innen-Loops zwischen IRLS-Iterationen
- Begrenzung der inneren GN/LM-Iterationen während Re-Solves
- Überspringen des State-Resets vor VKS im Single-Pass-Modus
- Default-Konvergenzgrenze für IRLS gelockert (1e-3 → 1e-2)
- Cascade-Init (Huber → redescending) als Default deaktiviert, bleibt aber per 'cascadeInit' zuschaltbar
────────────────────────────────────────
Neue Features
────────────────────────────────────────
Statistik
- Parameter-Korrelationsmatrix abrufbar (compute-on-demand)
- Konditionszahl der Normalgleichungs-Matrix routinemäßig verfügbar (vorher nur im SVD-Fallback)
- Sanity-Check 'tr(R) = f' deckt unsichtbar gebrochene Redundanzanteile auf
Diagnostik
- Iteratives Data Snooping mit weichem Downweighting (statt harter Ausreißer-Eliminierung)
- Äußere Zuverlässigkeit (Opt-in): Mindestaufdeckbarkeit 'δ₀ᵢ' und Parameter-Effekt '∇xᵢ' jedes nicht erkannten Ausreißers
Konvergenz
- Gradienten-Test '‖g(x)‖ < tol' zusätzlich aktiv, wenn Restriktionen vorhanden sind
- Parameter-Korrektur-Toleranz skaliert mit der Parameter-Größenordnung (vermeidet falsche Konvergenz bei sehr kleinen Parametern)
Solver / Robust
- Cascade-Init Huber → redescending (MM-Estimator) als optionaler Modus
- Anfänglicher Marquardt-Dämpfungsfaktor 'lmTau' konfigurierbar
────────────────────────────────────────
Bugfixes
────────────────────────────────────────
VKS / Robust
- Statistiken werden nach VKS-Konvergenz mit den finalen Gewichten aktualisiert
- σ̂²-Clipping am 'MIN_SIGMA2'-Floor statt Reset auf 1.0
- Aktiver VKS erzwingt den gewichteten Lösungsweg; geclipptes σ̂² signalisiert den Aufrufer korrekt als Nicht-Konvergenz
- MAD-Skala nutzt die a-priori 1/σᵢ statt des Whitening-Vektors der laufenden Iteration
- 'robustParams' werden automatisch auf Defaults gefüllt, wenn der Aufrufer sie auf Null lässt
- '__adj_initWeights' initialisierte für σ=1 + Multi-VKS-Gruppe keine Gewichte → korrigiert
Statistik / Diagnostik
- 'diag(Qvv)' und 'diag(Qŷ)' werden vor 'sqrt' auf 0 gefloort (vermied bisher NaN bei numerischen Negativwerten in Maschinenpräzision)
- Pope-Statistik nutzt nun korrekt die τ-Verteilung statt Student-t
- Baarda-/Pope-p-Werte berechnen sich numerisch stabil (keine katastrophale Auslöschung bei großen w/τ)
Solver
- LM-Konvergenztest im GLM/CLS-Pfad ist nun residual-basiert ('r2sum') statt parameter-basiert
- Schrittweiten-Skalierung im numerischen Differentiations-Modus smooth-blendet zwischen den Regimen, statt hart umzuschalten
API
- '_adj_setInitialValue' legt fehlende Parameter an, statt zu erroren
- '_adj_removeObs' setzt '_prepareRunCount' korrekt zurück; vermeidet Crash beim nächsten 'solve'-Aufruf
Code-Qualität
- Mehrere undeklarierte Locals in AdjustmentStats / AdjustmentDiagnostics, die in ByRef-Caller leakten, beseitigt
- Au3Check-Cleanup über alle UDF- und Beispiel-Dateien
────────────────────────────────────────
Kompatibilität
────────────────────────────────────────
Voll abwärtskompatibel zu v26.3.x. Keine API-Änderungen außer Erweiterungen. Default-Verhalten ist identisch — die Performance-relevanten Default-Anpassungen betreffen nur die robuste Schätzung und liegen weiterhin im konservativen Bereich (siehe '_adj_robustDefaults').
────────────────────────────────────────
Download
────────────────────────────────────────
>>> Release v26.4 von GitHub herunterladen <<<
Quellcode und Issue-Tracker: https://github.com/Sylvan86/autoit-adjustment-udf