Softmax函数原理及Python实现过程解析


Posted in Python onMay 22, 2020

Softmax原理

Softmax函数用于将分类结果归一化,形成一个概率分布。作用类似于二分类中的Sigmoid函数。

对于一个k维向量z,我们想把这个结果转换为一个k个类别的概率分布p(z)。softmax可以用于实现上述结果,具体计算公式为:

Softmax函数原理及Python实现过程解析

对于k维向量z来说,其中zi∈R,我们使用指数函数变换可以将元素的取值范围变换到(0,+∞),之后我们再所有元素求和将结果缩放到[0,1],形成概率分布。

常见的其他归一化方法,如max-min、z-score方法并不能保证各个元素为正,且和为1。

Softmax性质

输入向量x加上一个常数c后求softmax结算结果不变,即:

Softmax函数原理及Python实现过程解析

我们使用softmax(x)的第i个元素的计算来进行证明:

Softmax函数原理及Python实现过程解析

函数实现

由于指数函数的放大作用过于明显,如果直接使用softmax计算公式

Softmax函数原理及Python实现过程解析

进行函数实现,容易导致数据溢出(上溢)。所以我们在函数实现时利用其性质:先对输入数据进行处理,之后再利用计算公式计算。具体使得实现步骤为:

  • 查找每个向量x的最大值c;
  • 每个向量减去其最大值c, 得到向量y = x-c;
  • 利用公式进行计算,softmax(x) = softmax(x-c) = softmax(y)

代码如下:

import numpy as np

def softmax(x):
  """
  softmax函数实现
  参数:
  x --- 一个二维矩阵, m * n,其中m表示向量个数,n表示向量维度
  返回:
  softmax计算结果
  """
  assert(len(X.shape) == 2)
  row_max = np.max(X, axis=axis).reshape(-1, 1)
  X -= row_max
  X_exp = np.exp(X)
  s = X_exp / np.sum(X_exp, axis=axis, keepdims=True)

  return s

测试一下:

a = [[1,2,3],[-1,-2,-3]]
b = [[1,2,3]]
c = [1,2,3]
a = np.array(a)
b = np.array(b)
c = np.array(c)

print(softmax(a))
print(softmax(b))
print(softmax(c)) # error

输出结果为:

[[ 0.09003057 0.24472847 0.66524096]
[ 0.66524096 0.24472847 0.09003057]]
[[ 0.09003057 0.24472847 0.66524096]]
Traceback (most recent call last):
assert(len(X.shape) == 2)
AssertionError

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用cookielib库示例分享
Mar 03 Python
python基础教程之数字处理(math)模块详解
Mar 25 Python
用Python制作检测Linux运行信息的工具的教程
Apr 01 Python
使用python3构建文件传输的方法
Feb 13 Python
centos 安装Python3 及对应的pip教程详解
Jun 28 Python
基于python3抓取pinpoint应用信息入库
Jan 08 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
May 29 Python
Python字典取键、值对的方法步骤
Sep 30 Python
python语言time库和datetime库基本使用详解
Dec 25 Python
基于pycharm 项目和项目文件命名规则的介绍
Jan 15 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 Python
Python接口测试文件上传实例解析
May 22 #Python
计算Python Numpy向量之间的欧氏距离实例
May 22 #Python
python numpy矩阵信息说明,shape,size,dtype
May 22 #Python
python查看矩阵的行列号以及维数方式
May 22 #Python
30行Python代码实现高分辨率图像导航的方法
May 22 #Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 #Python
Python pandas如何向excel添加数据
May 22 #Python
You might like
php MYSQL 数据备份类
2009/06/19 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
PHP重载基础知识回顾
2020/09/10 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
2016/12/19 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
python中日期和时间格式化输出的方法小结
2015/03/19 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
pyenv命令管理多个Python版本
2017/03/26 Python
Python断言assert的用法代码解析
2018/02/03 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
python 日期排序的实例代码
2019/07/11 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
研究生自荐信
2013/10/09 职场文书
人事行政主管岗位职责
2013/12/22 职场文书
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
献爱心倡议书
2014/04/14 职场文书
中学生学雷锋演讲稿
2014/04/26 职场文书
学校读书活动总结
2014/06/30 职场文书
德育标兵事迹材料
2014/08/24 职场文书
学术会议通知
2015/04/15 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
Python实现随机生成迷宫并自动寻路
2021/06/13 Python
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript