python中参数化sigmoid函数的错误处理

2024-05-18 21:42:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图把一组数字转换成sigmoid:

actualarray = {
    'open_cost_1':{
        'cost_matrix': [
            {'a': 24,'b': 56,'c': 78},
            {'a': 3,'b': 98,'c':1711},
            {'a': 121,'b': 12121,'c': 12989121},
        ]
    },
    'open_cost_2':{
        'cost_matrix': [
            {'a': 123,'b': 1312,'c': 1231},
            {'a': 1011,'b': 1911,'c':911},
            {'a': 1433,'b': 19829,'c': 1132},
        ]
    }
}

其中每个cost_matrix中的每个dict列表中的每个数字通过不同的sigmoid函数进行规范化:

^{pr2}$

但是,当我运行这个程序时,我得到:

 RuntimeWarning: overflow encountered in exp
  return ((np.exp(b+m*v) / (1 + np.exp(b+m*v)))*2)-1
 RuntimeWarning: invalid value encountered in double_scalars
  return ((np.exp(b+m*v) / (1 + np.exp(b+m*v)))*2)-1

阵列变成:

{
    'open_cost_2': {
        'cost_matrix': [
            {
                'a': 123,
                'c': 1231,
                'b': 1312
            },
            {
                'a': 1011,
                'c': 911,
                'b': 1911
            },
            {
                'a': 1433,
                'c': 1132,
                'b': 19829
            }
        ],
        'normalised_matrix_sigmoid': [
            {
                'a': 1.0,
                'c': nan,
                'b': nan
            },
            {
                'a': nan,
                'c': nan,
                'b': nan
            },
            {
                'a': nan,
                'c': nan,
                'b': nan
            }
        ]
    },
    'open_cost_1': {
        'cost_matrix': [
            {
                'a': 24,
                'c': 78,
                'b': 56
            },
            {
                'a': 3,
                'c': 1711,
                'b': 98
            },
            {
                'a': 121,
                'c': 12989121,
                'b': 12121
            }
        ]
    }
}

注意,每个代价总是大于0,因此我在sigmoid函数中乘以2减去1。在

我怎样才能适应这个错误呢?在


Tags: 函数in列表returnnp数字opennan
1条回答
网友
1楼 · 发布于 2024-05-18 21:42:08

正如警告所述,sigmoid函数实现中的指数溢出。发生这种情况时,函数返回nan

In [3]: sigmoid(1000, 1, 1)
/Users/warren/miniconda3/bin/ipython:2: RuntimeWarning: overflow encountered in exp
  if __name__ == '__main__':
/Users/warren/miniconda3/bin/ipython:2: RuntimeWarning: invalid value encountered in double_scalars
  if __name__ == '__main__':
Out[3]: nan

您可以使用^{},而不是用exp来编写sigmoid函数。它可以正确地处理非常大的参数。在

^{pr2}$

检查它在不溢出的情况下返回的sigmoid函数是否相同:

In [8]: sigmoid(1, 2, 3)
Out[8]: 0.99817789761119879

In [9]: mysigmoid(1, 2, 3)
Out[9]: 0.99817789761119879

关于sigmoid函数的另一个问题,请参阅Numpy Pure Functions for performance, caching。在

相关问题 更多 >

    热门问题