You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Takagi-Sugeno模型因子数增加时溢出、预测值为NaN该如何解决?

问题定位

  • 核心原因是梯度爆炸,高维场景下学习率设置过高,参数更新步长太大,导致权重和预测值快速溢出为无穷大,最后触发数值计算警告、输出NaN
  • 次要问题包括特征幂次变换的数值累积、归一化函数的隐式原数组修改、无梯度约束机制

可行修复方案

1. 调低学习率

你当前代码中学习率设为1,属于过高配置,建议降到1e-3 ~ 1e-2区间,高维场景下可进一步调小:

# 原代码
model = TakagiSugeno(lr=1, n_iters=1000)
# 修改后
model = TakagiSugeno(lr=0.001, n_iters=1000)

2. 修复归一化函数的引用修改问题

原归一化函数直接修改输入数组,会导致原始数据被意外篡改,改为对数组副本操作,同时增加除0保护:

def normalise_x(X):
    X_norm = []
    # 生成副本避免修改原数组
    X = X.copy()
    for x in X.T:
        min_val = np.min(x)
        x -= min_val
        max_val = np.max(x)
        if max_val != 0:
            x = x/max_val
        X_norm.append(x)
    return np.array(X_norm).T

def normalise_y(X):
    # 生成副本避免修改原数组
    X = X.copy()
    min_val = np.min(X)
    X -= min_val
    max_val = np.max(X)
    if max_val != 0:
        X = X/max_val
    return X

3. 增加梯度裁剪机制

在参数更新步骤对梯度做截断,避免梯度过大导致参数爆炸,可根据实际场景调整裁剪阈值:
修改model_estimation方法内的参数更新逻辑:

# 梯度裁剪,限制梯度在[-1,1]区间
dw = np.clip(dw, -1, 1)
db = np.clip(db, -1, 1)
# 权重更新
self.weights[c] -= self.lr * dw
self.bias[c] -= self.lr * db

4. 可选优化:增加L2正则化

在梯度计算时加入权重正则项,抑制权重过度增长,正则系数可根据效果调整:

reg_lambda = 0.001
dw = (2 / n_samples) * np.dot(weight_mult(X_polynom[c], cluster_w[c]).T, (y_predicted - y)) + reg_lambda * self.weights[c]

按上述方案修改后,因子数超过9时也不会出现数值溢出、输出NaN的问题。

内容的提问来源于stack exchange,提问作者Nikita Maximovich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:45:04