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错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
python生成验证码图片代码分享
Jan 28 Python
python日志记录模块实例及改进
Feb 12 Python
Python中的__slots__示例详解
Jul 06 Python
Django restframework 源码分析之认证详解
Feb 22 Python
Python的UTC时间转换讲解
Feb 26 Python
Python OpenCV之图片缩放的实现(cv2.resize)
Jun 28 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
python实现与redis交互操作详解
Apr 21 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
python爬虫之selenium库的安装及使用教程
May 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删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
JavaScript笛卡尔积超简单实现算法示例
2018/07/30 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
外贸销售员求职的自我评价
2013/11/23 职场文书
家居饰品店创业计划书
2014/01/31 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
庆国庆活动总结
2014/08/28 职场文书
人间正道是沧桑观后感
2015/06/15 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
护士医德医风心得体会
2016/01/25 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书
深入理解python多线程编程
2021/04/18 Python
使用CSS实现音波加载效果
2023/05/07 HTML / CSS