Skip to content

Commit 74b5f96

Browse files
authored
Merge pull request #4237 from AcKoucher/fix-rc-regression-score
fix segment-based RC regression score computation
2 parents 280988f + f996a66 commit 74b5f96

1 file changed

Lines changed: 20 additions & 3 deletions

File tree

flow/util/correlateRC.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,23 @@
1818

1919
LAYER_HEADER_RE = re.compile("^([^\\(]+)\\(([^\\)]+)\\)$")
2020

21+
# Helper functions
22+
# =============================================================================
23+
24+
25+
# sklearn's default baseline model for scoring the fit i.e., measuring R² is
26+
# "predict the mean" which is not the proper model for our regressions since
27+
# both R and C are through-origin fits - the R² computation doesn't behave
28+
# well for var(y) ≈ 0 - so we compute R² manually with a "predict zero"
29+
# baseline model.
30+
def compute_through_origin_fit_score(model, inputs, observed):
31+
sum_squared_observed = (observed**2).sum()
32+
if sum_squared_observed == 0:
33+
return "No data"
34+
score = 1.0 - ((observed - model.predict(inputs)) ** 2).sum() / sum_squared_observed
35+
return f"{score:.4f}"
36+
37+
2138
# Parse and validate arguments
2239
# =============================================================================
2340

@@ -410,9 +427,9 @@ def generic_rc_fit(type_sieve):
410427
resistances,
411428
capacitances_ff,
412429
) in layer_models.items():
413-
r_sq_res = res_model.score(lengths, resistances)
414-
r_sq_cap = cap_model.score(lengths, capacitances_ff)
415-
print("{:<12s} | {:>8.4f} | {:>8.4f}".format(layer_name, r_sq_res, r_sq_cap))
430+
r_sq_res = compute_through_origin_fit_score(res_model, lengths, resistances)
431+
r_sq_cap = compute_through_origin_fit_score(cap_model, lengths, capacitances_ff)
432+
print("{:<12s} | {:>8s} | {:>8s}".format(layer_name, r_sq_res, r_sq_cap))
416433
print("-" * 34)
417434
print("")
418435

0 commit comments

Comments
 (0)