当前位置:   article > 正文

softmax回归梯度公式推导及实现_softmax 的梯度

softmax 的梯度

最近在看小象学院的机器学习视频,里面只稍微提了下softmax回归,并没给推导过程和代码,于是就自己尝试了一下。

推导如下:

代码实现使用的是鸢尾花数据集,该数据集有3种鸢尾花,数据集刚开始长下面这个样子:

data=pd.read_csv('iris.data',header=None) #一共有150个样本

对数据进行预处理,首先把3种鸢尾花名称编码成0,1,2,然后还要插入一列,使数据x变成(1,x),方便算theta*(1,x)

  1. sort=data[4]
  2. data[4]=pd.Categorical(data[4]).codes #将种类编码成0,1,2
  3. data.insert(0,'常数项',1) #将x扩展成(1,x),以便计算theta*(1,x)

变换完成后,数据变成下面的样子

然后就可以选出训练集和测试集了

  1. x=data.iloc[:,0:5].as_matrix()
  2. y=data[4].as_matrix()
  3. x,x_test,y,y_test=train_test_split(x,y,test_size=0.3) #用105个样本训练
  4. theta=softMax(x,y,0.02) #学习因子不能取太大,否则最后计算出的theta无穷大

softmax回归参数训练的程序如下

  1. #采用随机梯度下降法,每次只挑选一个样本做优化
  2. def softMax(x,y,alpha):  
  3.     theta=np.zeros((3,5))  #初始theta矩阵  
  4.     for i in range(10000): #迭代10000次  
  5.         k=np.random.randint(0,105) #从105个样本中随机挑选一个做优化
  6.         x_=x[k].reshape(5,1)
  7.         theta_T_x=np.dot(theta,x_)  #计算所有的theta*x  
  8.         e_theta_T_x=np.exp(theta_T_x)   #计算所有指数函数  
  9.         denominator=e_theta_T_x.sum()  #计算分母  
  10.         numerator=e_theta_T_x   #分子  
  11.         fraction=numerator/denominator  #计算所有分数  
  12.         y_vector=np.where(np.arange(3).reshape(3,1)==y[k],1,0) #计算y向量
  13.         gradient=(fraction-y_vector)*x[k]
  14.         theta-=alpha*gradient   #更新theta矩阵  
  15.     return theta  

训练完theta后,就可以在测试集上验证了

  1. predict=np.dot(theta,x_test.T)
  2. predict_sort=predict.argmax(axis=0)
  3. num_of_wrong=(predict_sort!=y_test).sum()
  4. print("预测错误的个数: ",num_of_wrong)
  5. print("正确率为: {0}%".format((45-num_of_wrong)/45*100))

结果如下:

  1. 预测错误的个数: 1
  2. 正确率为: 97.77777777777777%

完整的代码实现如下所示:

  1. import numpy as np  
  2. import pandas as pd  
  3. from sklearn.model_selection import train_test_split  
  4.   
  5. #采用随机梯度下降法,每次只挑选一个样本做优化
  6. def softMax(x,y,alpha):  
  7.     theta=np.zeros((3,5))  #初始theta矩阵  
  8.     for i in range(10000): #迭代10000次  
  9.         k=np.random.randint(0,105) #从105个样本中随机挑选一个做优化
  10.         x_=x[k].reshape(5,1)
  11.         theta_T_x=np.dot(theta,x_)  #计算所有的theta*x  
  12.         e_theta_T_x=np.exp(theta_T_x)   #计算所有指数函数  
  13.         denominator=e_theta_T_x.sum()  #计算分母  
  14.         numerator=e_theta_T_x   #分子  
  15.         fraction=numerator/denominator  #计算所有分数  
  16.         y_vector=np.where(np.arange(3).reshape(3,1)==y[k],1,0) #计算y向量
  17.         gradient=(fraction-y_vector)*x[k]
  18.         theta-=alpha*gradient   #更新theta矩阵  
  19.     return theta  
  20.           
  21.           
  22.           
  23.           
  24. if __name__=="__main__":  
  25.     data=pd.read_csv('iris.data',header=None#一共有150个样本  
  26.     sort=data[4]     
  27.     data[4]=pd.Categorical(data[4]).codes   #将种类编码成0,1,2  
  28.     data.insert(0,'常数项',1)   #将x扩展成(1,x),以便计算theta*x  
  29.     x=data.iloc[:,0:5].as_matrix()  
  30.     y=data[4].as_matrix()  
  31.     x,x_test,y,y_test=train_test_split(x,y,test_size=0.3#用105个样本训练  
  32.     theta=softMax(x,y,0.01)   #学习因子不能取太大,否则最后计算出的theta无穷大  
  33.     predict=np.dot(theta,x_test.T)  
  34.     predict_sort=predict.argmax(axis=0)  
  35.     num_of_wrong=(predict_sort!=y_test).sum()  
  36.     print("预测错误的个数: ",num_of_wrong)  
  37.     print("正确率为: {0}%".format((45-num_of_wrong)/45*100))  

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

闽ICP备14008679号