fix: PhysicalFeatureExtractor 除零 → 设零而非人为放大

- 之前 np.sign(x)*1e-12 在 x=0 时得 0,a/0=inf
- 固定 1e-12 兜底又会制造极端比值(14080/1e-12=1.4e16)
- 改为: 分母<1e-10 时直接设 ratio=0,不做人为放大
- 物理意义: 波段为零的像素,光谱比值无意义
This commit is contained in:
duxin
2026-07-29 14:36:35 +08:00
parent 60403b7a3f
commit 7ecdf6a2a0

View File

@ -502,11 +502,15 @@ class PhysicalFeatureExtractor(TransformerMixin, BaseEstimator, _ArrayAsFloat64)
a = X[:, ia]; b = X[:, ib]
if ftype == 'ratio':
denom = a + b
denom = np.where(np.abs(denom) < 1e-12, 1e-12, denom)
feats.append(((a - b) / denom).reshape(-1, 1))
valid = np.abs(denom) >= 1e-10
vals = np.zeros_like(a, dtype=np.float64)
vals[valid] = (a[valid] - b[valid]) / denom[valid]
feats.append(vals.reshape(-1, 1))
else: # ratio_single
denom = np.where(np.abs(b) < 1e-12, 1e-12, b)
feats.append((a / denom).reshape(-1, 1))
valid = np.abs(b) >= 1e-10
vals = np.zeros_like(a, dtype=np.float64)
vals[valid] = a[valid] / b[valid]
feats.append(vals.reshape(-1, 1))
out = np.hstack(feats)
out = np.nan_to_num(out, nan=0.0, posinf=0.0, neginf=0.0)
out = np.clip(out, -1e15, 1e15)