Numpy手撸softmax regression

算法介绍

Softmax 回归(或多项逻辑回归)是将逻辑回归推广到我们想要处理多个类的情况。 在逻辑回归中,我们假设标签是二元的: y ( i ) ∈ { 0 , 1 } y^{(i)} \in \{0,1\} y(i){0,1},我们使用这样的分类器来区分两种手写数字。 Softmax 回归允许我们处理 y ( i ) ∈ { 0 , 1 , . . . , C } y^{(i)} \in \{0,1,...,C\} y(i){0,1,...,C}其中 C C C是类的数量。

数据集格式

在这里插入图片描述

模型

多组回归配合Softmax函数

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

Softmax 函数定义

def softmax(z):
    hat_z = [0]*len(z)
    for i in range(len(z)):
        hat_z[i] = np.exp(z[i])/np.sum(np.exp(z))
    return hat_z

y 函数计算

z = np.dot(W[:,1:],x[1:]) + np.dot(W[:,0],x[0])
hat_y = softmax(z)

Loss 和 Cost 函数

Loss Function(Cross Entropy):
在这里插入图片描述

Cost Function
在这里插入图片描述

在这里插入图片描述

Cost 代码部分

j = j - np.dot(Y[i],np.log(hat_y).T)

梯度

W矩阵梯度计算:
在这里插入图片描述
在这里插入图片描述
常数项梯度计算:
在这里插入图片描述

梯度代码部分

G 初始为 [C,D+1]的0矩阵,包含W和b的所有参数:

G[:,1:] = G[:,1:] + np.array(hat_y - Y[i]).reshape((3,1)).dot(np.array(x[1:]).reshape((1,3))) ###### Gradient
G[:,0] = G[:,0] + (hat_y - Y[i])

代码汇总

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt


def softmax(z):
    hat_z = [0]*len(z)
    for i in range(len(z)):
        hat_z[i] = np.exp(z[i])/np.sum(np.exp(z))
    return hat_z

def cost_gradient(W, X, Y, n):
    G = np.zeros(W.shape)
    j = 0
    for i in range(n):
        x = X[i]
        z = np.dot(W[:,1:],x[1:]) + np.dot(W[:,0],x[0])
        hat_y = softmax(z)

        G[:,1:] = G[:,1:] + np.array(hat_y - Y[i]).reshape((3,1)).dot(np.array(x[1:]).reshape((1,3))) ###### Gradient
        G[:,0] = G[:,0] + (hat_y - Y[i])
        j = j - np.dot(Y[i],np.log(hat_y).T)###### cost with respect to current W

    G = G/n
    j = j/n
    return (j, G)

def train(W, X, Y, n, lr, iterations):
    J = np.zeros([iterations, 1])

    for i in range(iterations):
        (J[i], G) = cost_gradient(W, X, Y, n)
        W = W - lr*G
        print("epoch:",i,"error:",error(W, X, Y))
    return (W,J)

def error(W, X, Y):
    Y_hat = []
    for i in range(n):
        x = X[i]
        z = np.dot(W[:, 1:],x[1:]) + np.dot(W[:, 0], x[0])
        Y_hat.append(softmax(z))###### Output Y_hat by the trained model
    pred = np.argmax(Y_hat, axis=1)


    label = np.argmax(Y, axis=1)

    return (1-np.mean(np.equal(pred, label)))

iterations = 500###### Training loops

lr = 1e-1###### Learning rate

data = np.loadtxt('SR.txt', delimiter=',')

n = data.shape[0]
X = np.concatenate([np.ones([n, 1]),
                    np.expand_dims(data[:,0], axis=1),
                    np.expand_dims(data[:,1], axis=1),
                    np.expand_dims(data[:,2], axis=1)],
                   axis=1)
Y = data[:, 3].astype(np.int32)
c = np.max(Y)+1
Y = np.eye(c)[Y]

W = np.random.random([c,X.shape[1]])
b = np.random.random(X.shape[1])
(W,J) = train(W, X, Y, n, lr, iterations)

plt.figure()
plt.plot(range(iterations), J)
plt.show()
print(error(W,X,Y))

需要数据集的同学私我

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ACxz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值