Softmax回归

来源:互联网 发布:软件著作权评估方法 编辑:程序博客网 时间:2024/06/15 16:22

Softmax回归是Logistic回归的多分类推广。

对于k分类,第k类的参数为θk,组成二维矩阵θk×nθk是一个长度为n的向量,n表示特征个数。

当给定一个样本x,对于k个分类,我们都可以得到一个预测值θTkx,我们可以以θTkxkθTkx作为样本属于各个类别的概率,即对于k个分类的预测值越大则判定样本属于该类,即通过max函数分类,max函数非连续可导,我们可以使用log(keθTkx)近似max函数,如图(右侧为max函数,代码见附录),左图类似max函数的柔软化,根据柔软化的思想,引入自然底数,得到分类概率:

p(c=k|x;θ)=eθTkxekθTkx

softmax与max

k=2,公式如下,即为Logistic回归

p(c=k|x;θ)=eθT1xeθT1x+eθT2x=11+e(θT1θT2)x

同Logistic回归计算方法,得到随机梯度:

J(θ)θk=(ykp(yk|x;θ))x

代码实现

def soft_max(data, k, alpha, lamda):    n = len(data[0]) - 1  #样本维度    w = np.zeros((k, n)) #权值初始化    wNew = np.zeros((k, n)) #临时权值    for times in range(1000):        for d in date:            x = d[:-1] # 输入向量            for k in range(k): # k类别                y = 0 #期望输出标量                if int(d[-1] + 0.5) == k:                    y = 1                p = predict(w, x, k)                g = (y - p)*x #梯度 n维列向量                wNew[k] = w[k] + (alpha * g + lamda * w[k])            w = wNew.copy()    return w

附录

import numpy as npimport matplotlib.pyplot as pltfig = plt.figure()plt.figure(figsize=(1, 1))u = np.linspace(0,4,500)x,y = np.meshgrid(u,u)ax1 = fig.add_subplot(1,2,1) # softmaxz = np.log(np.exp(x) + np.exp(y))ax1.contour(x,y,z,20)ax2 = fig.add_subplot(1,2,2) # maxz = [0 for i in range(len(u))]for i in range(len(u)):    z[i] = [0 for k in range(len(u))]    for j in range(len(u)):        z[i][j] = max(x[i][j] ,y[i][j])ax2.contour(x,y,z,20)plt.show()