tensorflow系列教程之七:数学知识-softmax

定义

在数学,尤其是概率论和相关领域中,Softmax函数,或称归一化指数函数,是逻辑函数的一种推广。 Softmax函数实际上是有限项离散概率分布的梯度对数归一化。

公式

$$\sigma(z)_{j}=\frac{e^{z_j}}{\sum_{k=1}^ke^{z_k}}$$

其中 j = 1, …, k
在多项逻辑回归和线性判别分析中,函数的输入是从K个不同的线性函数得到的结果,而样本向量 x 属于第 j 个分类的概率为: $$P(y=j|X)=\frac{e^{X^TW_j}}{\sum_{k=1}^ke^{X^TW_k}}$$
这可以被视作K个线性函数的复合

python实现

In [22]:
import numpy as np
import matplotlib.pyplot as plt
def softmax(x):
    #转换成numpy数组
    x=np.array(x)
    #求e的x次幂
    x=np.exp(x)
    print("e的x次幂是",x)
    print("x的维度是",x.ndim)
    if x.ndim==1:
        sumcol=sum(x)
        for i in range(x.size):
           x[i] = x[i]/float(sumcol)
    elif x.ndim>1:
        sumcol = x.sum(axis = 0)
        for row in x:
           for i in range(row.size):
            row[i] = row[i]/float(sumcol[i])
    return x

#测试数据
scores = [3.0,1.0, 0.2]
print("测试结果是",softmax(scores))

#图像化展示
softmax_inputs = np.arange(-10,10)
print("softmax函数输入是{}".format(softmax_inputs))

softmax_outputs=softmax(softmax_inputs)
print("softmax函数输出是{}".format(softmax_outputs))

#将输入和输出绘制出来

plt.plot(softmax_inputs,softmax_outputs)
plt.xlabel("softmax_inputs")
plt.ylabel("softmax_outputs")
plt.show()
e的x次幂是 [20.08553692  2.71828183  1.22140276]
x的维度是 1
测试结果是 [0.8360188  0.11314284 0.05083836]
softmax函数输入是[-10  -9  -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   5   6   7
   8   9]
e的x次幂是 [4.53999298e-05 1.23409804e-04 3.35462628e-04 9.11881966e-04
 2.47875218e-03 6.73794700e-03 1.83156389e-02 4.97870684e-02
 1.35335283e-01 3.67879441e-01 1.00000000e+00 2.71828183e+00
 7.38905610e+00 2.00855369e+01 5.45981500e+01 1.48413159e+02
 4.03428793e+02 1.09663316e+03 2.98095799e+03 8.10308393e+03]
x的维度是 1
softmax函数输出是[3.54164282e-09 9.62718333e-09 2.61693975e-08 7.11357977e-08
 1.93367146e-07 5.25626400e-07 1.42880069e-06 3.88388295e-06
 1.05574885e-05 2.86982290e-05 7.80098745e-05 2.12052824e-04
 5.76419339e-04 1.56687021e-03 4.25919483e-03 1.15776919e-02
 3.14714295e-02 8.55482150e-02 2.32544158e-01 6.32120560e-01]
In [24]:
#实现方式2
import numpy as np
def softmax(x):
 return np.exp(x)/np.sum(np.exp(x),axis=0)
 
#测试结果
scores = [3.0,1.0, 0.2]
print(softmax(scores))
[0.8360188  0.11314284 0.05083836]