Sooftmax regression 的多分类python源代码

softmax regression 多分类代码

  1. 导入要使用的包
import numpy as np
  1. 导入数据
def load_data(file_name):
    '''
        导入数据函数
    '''
    returnMat=np.loadtxt(file_name)
    returnMat=np.mat(returnMat)
    feature_data=np.delete(returnMat,-1,axis=1)
    a=np.ones((feature_data.shape[0],1))
    feature_data=np.c_[feature_data,a]
    label_data=returnMat[:,-1]
    return feature_data,label_data
  1. 定义softmax的函数
def softmax_function(w,Xi,k,j):
    '''
        softmax的单个样本的所属类别的概率
        input:w(mat)是权重矩阵k*(n+1)
               Xi是第i个样本,是行向量
               k是第k个类别
               j是第i个样本属于第类
        output:s(float)表示sofmax函数值
    '''
    d=0
    for i in range(0,k):
        d=d+np.exp(w[i,:]*Xi.T)
    m=np.exp(w[j,:]*Xi.T)
    s=m/d
    s=s[0,0]
    return s 
  1. 定义指示I(.)函数
def I_function(j,label):
    '''
       指示函数I(.)的函数设计
       input: j(int)表示的是第j类别
               label(int)表示的是第i类样本的标签值
       output: 0或者1
    '''
    if label==j:
        return 1
    else:
        return 0
  1. 利用梯度下降法训练SF模型
def sf_train(feature_data,label_data,maxCycle,alpha,k):
     ''' 利用梯度下降法训练SF模型
         input: feature_data(mat)样例数据
                 label_data(mat)标签数据
                 maxCyxle(int)最大迭代次数
                 alpha(float)学习率
                 k分类的数量
     '''
     m=np.shape(feature_data)[0]  #共有m个训练样本
     n=np.shape(feature_data)[1]  #共有n个特征
     w=np.mat(np.ones((k,n)))
     for j in range(0,k):
         c=0
         while c

6,最终的生成训练模型,生成预测值

def model(train_data,k):
    '''
        生成最终的训练模型,并且返回预测的值
        input:train_data(mat):输入数据的特征
               k(int):输入预测的类别数量
        otput::b:列向量,最终的预测结果
    '''
    m=np.shape(feature_data)[0]  #共有m个训练样本
    c=np.mat(np.ones((m,k)))
    b=np.mat(np.ones((m,1)))
    for j in range(0,m):
        for i in range(0,k):
            c[j,i]=softmax_function(w,train_data[j,:],k,i)
    for i in range(0,m):
        s=list(np.array(c[i,:]))
        b[i,0]=np.argmax(s)
    return b
  1. 利用简单的方法输出正确率
def error(label_data,b):
    '''简单的计算错误率
     input:label_data:标签值,
             b:预测值
     output:正确率
    '''
    m=np.shape(label_data)[0]
    T=0
    for i in range(0,m):
        if b[i]==label_data[i]:
           T=T+1
    return T/m
            
  1. 主函数入口
if __name__ =="__main__":
    print("-------1.导入数据-----------")
    feature_data,label_data=load_data("manytest_data.txt")
    print("-------2.梯度下降法训练模型---")
    w=sf_train(feature_data,label_data,1000,0.001,4)
    print("--------3.预测模型--------")
    b=model(feature_data,4)
    print("---------4.输出错误率------")
    erro=error(label_data,b)
    print(erro)

这是简单的softmax 多分类的编程代码,适合初学者进行学习,代码中的很多公式都是经过推导的公式。我会在后期,针对softmax 回归进行一个详细的推导,结合该源代码,我想对初学者,是一个很好的学习素材,代码中的数据集,可以在网上自己下载,多分类数据集,也可以在我的csdn的博客上下载多分类的数据集。

你可能感兴趣的:(机器学习算法)