Follow-up to #133.
Problem
`pvmodel.Model.Features()` returns `x[0] = 1.0` — a constant intercept term in the RLS regression. There's no physical basis for this: PV output is proportional to clear-sky irradiance (passes through origin). The intercept only exists in the feature vector because it's the standard textbook formulation.
Consequence: RLS has a free parameter `Beta[0]` that drifts wherever it minimizes training residual. This biases daytime predictions by a constant `Beta[0]` amount — typically 5-15 % on a 10 kW system.
The night-gate in #133 masks the symptom at night but doesn't address the daytime offset. Both are the same underlying bug.
Fix options
- Set `Features[0] = 0` — backward-compatible (persisted `Beta[0]` becomes a dead coefficient that multiplies zero). Smallest diff, no migration.
- Drop `NFeat` from 7 to 6 — principled but requires schema migration for persisted models.
Lean toward option 1.
Test plan
- Pin `Beta[0] = 5000` on a fresh model, verify `Predict` returns the physics-prior value (or learned minus intercept), not `prior + 5000`.
- Run full suite — prediction accuracy on existing fixtures should stay within tolerance.
- Recommend `POST /api/pvmodel/reset` after deploy so RLS re-learns without the drifted intercept. Not required — existing models continue to work, just with the old bias gradually fading as new samples retrain the other coefficients.
Follow-up to #133.
Problem
`pvmodel.Model.Features()` returns `x[0] = 1.0` — a constant intercept term in the RLS regression. There's no physical basis for this: PV output is proportional to clear-sky irradiance (passes through origin). The intercept only exists in the feature vector because it's the standard textbook formulation.
Consequence: RLS has a free parameter `Beta[0]` that drifts wherever it minimizes training residual. This biases daytime predictions by a constant `Beta[0]` amount — typically 5-15 % on a 10 kW system.
The night-gate in #133 masks the symptom at night but doesn't address the daytime offset. Both are the same underlying bug.
Fix options
Lean toward option 1.
Test plan