Jupyter Notebook中Logistic函数无法正确修改输入数组值问题
问题:Logistic变换函数未修改输入数组的原因?
先把你的代码和运行结果贴出来方便分析:
import math import numpy as np # takes a list of numbers as input def logistic_transform(nums): e = math.e print(e) print(nums) for num in nums: num = 1 / 1 + (e ** num) return nums input = [1, 2, 3] test = logistic_transform(input) print(test)
运行输出:
2.718281828459045 [1, 2, 3] [1, 2, 3]
为啥数组没被修改?还有哪些问题?
1. 循环里的num只是临时副本,碰不到原数组
当你用for num in nums遍历列表时,num只是原列表中每个元素的临时变量副本——就像你复印了一份文件,修改复印件根本不会影响原件。你给num赋值只是改了这个副本的值,原列表里的元素完全没被触动。
2. Logistic公式写错了(运算顺序+符号全错)
你写的1 / 1 + (e ** num)其实等价于1 + e^num,这和归一化的logistic函数完全不是一回事!正确的logistic归一化公式应该是:
$$\sigma(x) = \frac{1}{1 + e^{-x}}$$
你不仅没加括号导致运算顺序错误,还把指数的符号搞反了——就算能修改原数组,得到的结果也是爆炸式增长的大数,根本不是0-1之间的归一化值。
修正后的代码方案
方案1:纯Python列表实现(生成新列表,不修改原输入)
推荐这种方式,避免意外修改原数据:
import math def logistic_transform(nums): transformed = [] for num in nums: # 正确的logistic公式:加括号保证运算顺序,指数带负号 transformed_num = 1 / (1 + math.e ** (-num)) transformed.append(transformed_num) return transformed # 别用input当变量名,它是Python内置的输入函数 input_list = [1, 2, 3] test = logistic_transform(input_list) print(test)
运行后会得到正确的归一化结果:
[0.7310585786300049, 0.8807970779778823, 0.9525741268224334]
方案2:用numpy矢量运算(更高效,适合大数据)
既然你已经导入了numpy,直接用它的矢量运算更方便,不用写循环:
import numpy as np def logistic_transform(nums): # numpy的exp函数可以直接对整个数组做运算,一步到位 return 1 / (1 + np.exp(-nums)) input_array = np.array([1, 2, 3]) test = logistic_transform(input_array) print(test)
输出结果:
[0.73105858 0.88079708 0.95257413]
小提醒
尽量别用input作为变量名,它是Python的内置函数(用来获取用户输入),覆盖它可能会导致后续代码出现奇怪的问题哦~
内容的提问来源于stack exchange,提问作者tammy2442
相关产品推荐
相关产品推荐

