当前位置:   article > 正文

简单谈谈数据的归一化问题(Python)_python list 归一化

python list 归一化

开发过程中经常遇到需要把数据归一化处理的情况,简单记录几种归一化方法。

需求1:归一化(将一组数转换到[0~1]区间内)一组数据,数据包含正负数,归一化后的数据列保持其原数据列的大小顺序。

  1. def normalization(data):
  2. """
  3. 归一化函数
  4. 把所有数据归一化到[0,1]区间内,数据列表中的最大值和最小值分别映射到1和0,所以该方法一定会出现端点值0和1。
  5. 此映射是线性映射,实质上是数据在数轴上等比缩放。
  6. :param data: 数据列表,数据取值范围:全体实数
  7. :return:
  8. """
  9. min_value = min(data)
  10. max_value = max(data)
  11. new_list = []
  12. for i in data:
  13. new_list.append((i-min_value) / (max_value-min_value))
  14. return new_list
  15. if __name__ == '__main__':
  16. d = [-3, 4, 6, -1, -5]
  17. print(normalization(d))
  18. # [0.18181818181818182, 0.8181818181818182, 1.0, 0.36363636363636365, 0.0]

上述方法满足了需求,需要注意的是,这个方法会使归一化结果中出现端点值(即0和1)


需求2:归一化一组数据(包含正负数),并使得归一化后的数据和为1,保持其原数据的大小顺序。

分析:要使得归一化结果和为1,就需要考虑先求和,后逐个求比值。

  1. def softmax_linear_mapping(data):
  2. """
  3. 线性映射归一化函数。归一化到[0, 1]区间,且和为1。归一化后的数据列依然保持原数据列中的大小顺序。
  4. 局限性:仅适用于非负数据
  5. :param data: 非负数据列,数据取值范围:非负数
  6. :return:
  7. """
  8. sum_all = sum(data)
  9. new_list = []
  10. for i in data:
  11. new_list.append(i / sum_all)
  12. return new_list
  13. if __name__ == '__main__':
  14. d = [3, 4, 6, 1, 5]
  15. print(softmax_linear_mapping(d))
  16. # [0.15789473684210525, 0.21052631578947367, 0.3157894736842105, 0.05263157894736842, 0.2631578947368421]
  17. d = [-3, 4, 6, -1, -5]
  18. print(softmax_linear_mapping(d))
  19. # [-3.0, 4.0, 6.0, -1.0, -5.0]

但不幸的是,这个方法有先天缺陷:不能处理负数列。

为了解决这个问题,尝试引入一个非线性函数,将数据区间(-∞, +∞)映射到(0, +∞)上,这样就可以愉快的玩耍了。

优化 [社会我白哥,人狠话不多]

  1. import math
  2. def softmax(data):
  3. """
  4. 非线性映射归一化函数。归一化到[0, 1]区间,且和为1。归一化后的数据列依然保持原数据列中的大小顺序。
  5. 非线性函数使用以e为底的指数函数:math.exp()。
  6. 使用它可以把输入数据的范围区间(-∞, +∞)映射到(0, +∞),这样就可以使得该函数有能力处理负数。
  7. :param data: 数据列,数据的取值范围是全体实数
  8. :return:
  9. """
  10. exp_list = [math.exp(i) for i in data]
  11. sum_exp = sum(exp_list)
  12. new_list = []
  13. for i in exp_list:
  14. new_list.append(i / sum_exp)
  15. return new_list
  16. if __name__ == '__main__':
  17. d = [3, 4, 6, 1, 5]
  18. print(softmax(d))
  19. # [0.031920112758713086, 0.0867678624743735, 0.6411326034074455, 0.0043199175011450494, 0.235859503858323]
  20. d = [-3, 4, 6, -1, -5]
  21. print(softmax(d))
  22. # [0.00010859836836988283, 0.11909257170564182, 0.8799816932989085, 0.0008024394361374001, 1.4697190942372094e-05]

~ 完美 ~

Mr.bai

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/174474
推荐阅读
相关标签
  

闽ICP备14008679号