多个逻辑回归二分类器实现minist手写数字识别(Python 仅使用numpy实现)

        多分类问题可以转换为多个二分类问题,例如,需要完成对手写数字的十分类时,可以采用依次对每个数字(0-9)进行二分类的方式,最终对每次分类中计算出的正样本概率值进行排序,选择概率最高的数字作为分类的结果。

      整个过程需要训练10个分类模型(0-9这十个数字每个数字训练一个分类模型),若模型的输入为数字x,则分别使用这10个模型对x进行分类,对每次分类的逻辑回归输出值(即正样本的概率)进行排序,取最大的值所对应的标签作为最终的分类结果。

        首先,采用Sigmoid函数作为逻辑回归的激活函数:

       

        代码实现如下:

def logistic(X):
    if(X>=0):
        return 1.0 / (1.0 + np.exp(-X))
    else:
        return np.exp(X)/(1.0 + np.exp(X))

       采用交叉熵作为损失函数,在二分类下,交叉熵损失函数如下:

        

         代码实现如下:

def cross_entropy(Y, P):
    Y = np.float_(Y)
    P = np.float_(P)
    return -np.sum(Y * np.log(P + 1e-10) + (1 - Y) * np.log(1 - P + 1e-10))

         L对权重w的偏导数为:(logistic -  y)* x , 其中logistic为前向传播经过Sigmoid函数激活后的值,其范围在0到1之间。

         L对偏置b的偏导数为:(logistic -  y)

         故在反向传播中,参数w和b的更新如下:

def backward(w,b,data,y,logistic,l_rate):
    for i in range(len(w)):
        w[i] -= l_rate * (logistic - y)*data[i]
    b -= l_rate * (logistic - y)
    return (w,b)

         其中l_rate为学习率

         模型的训练过程如下(每个训练样本更新一次权重,每个epoch执行一次评估):

def train(epoch,l_rate,num):
    training_data, validation_data, test_data = get_binary_classification_data(num)
    w,b = init_weight()
    
  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值