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:
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user