机器学习课程笔记【三】广义线性模型(2)-构建广义线性模型

本节为吴恩达教授机器学习课程笔记第三部分,广义线性模型(2)构建广义线性模型,包括最小均方算法、逻辑回归,着重介绍softmax的推导,并给出softmax的核心代码以及pytorch实现。

2. 构建GLMS广义线性模型

  考虑一个分类或者回归问题,我们希望得到一个x的函数,来计算随机变量y的值。为了推导出一个广义线性模型,我们给出这样三个假设:

  • 给定x和 θ \theta θ,我们假定y的分布服从参数为 η \eta η的某个指数族分布
  • 给定x,目标是预测 T ( y ) T(y) T(y)的期望值,在绝大多数例子中, T ( y ) = y T(y)=y T(y)=y,因此,我们想要预测 h ( x ) h(x) h(x)的值使得 h ( x ) = E [ y ∣ x ] h(x)=E[y|x] h(x)=E[yx]
  • 自然参数和x是线性相关的,即 η = θ T x \eta=\theta^Tx η=θTx,对于向量来说,即 η i = θ i T x \eta_i=\theta_i^Tx ηi=θiTx
2.1 典型的最小均方算法

  典型的最小均方算法也是广义线性模型族中的一个,在之前高斯分布写为指数族形式中有 μ = η \mu=\eta μ=η,于是有下面的式子:
在这里插入图片描述

2.2 逻辑回归

  对于二分类问题,有:
在这里插入图片描述

2.3 Softmax回归

  考虑一个多分类问题,即模型有多个可能的输出对应多个不同的类别,我们可以用多项式分布来对该问题进行建模。
  首先,我们可以将多项式分布表达为指数族的形式。定义:
在这里插入图片描述
  即:
在这里插入图片描述
  这里, T ( y ) T(y) T(y)是一个 k − 1 k-1 k1维向量,用 ( T ( y ) ) i (T(y))_i (T(y))i表示向量 T ( y ) T(y) T(y)的第i个分量。
  此外引入一种特殊的定义,即1{ ⋅ \cdot },如果它接受的参数为True,则输出1,参数为False,输出0。这样我们可将把y和新的 T ( y ) T(y) T(y)的关系写为:
在这里插入图片描述
  更进一步地,有:
在这里插入图片描述
  接下来证明多项式分布确实属于指数族分布,我们有:
在这里插入图片描述
  对应地:
在这里插入图片描述
  于是有:
在这里插入图片描述
在这里插入图片描述
  这表明:
在这里插入图片描述
  从而得到:
在这里插入图片描述
  这个将 η ′ s \eta's ηs映射为 φ ′ s \varphi's φs的函数成为softmax函数,根据之前给出的假设3,有:
在这里插入图片描述
  这个多分类模型即softmax回归,是逻辑回归的推广,所以 h θ ( x ) h_{\theta}(x) hθ(x)会输出:
在这里插入图片描述
  换句话说, h θ ( x ) h_{\theta}(x) hθ(x)将输出属于每一类的概率。
  最后我们来探讨参数拟合的问题,给出如下对数似然函数:
在这里插入图片描述
  之后我们就可以用牛顿法或者梯度下降来最大化对数似然函数已得到参数值了。


softmax回归的核心代码

# softmax函数,将线性回归值转化为概率的激活函数。输入s要是行向量
def softmax(s):
    return np.exp(s) / np.sum(np.exp(s), axis=1)

# 逻辑回归中使用梯度下降法求回归系数。逻辑回归和线性回归中原理相同,只不过逻辑回归使用sigmoid作为迭代进化函数。因为逻辑回归是为了分类而生。线性回归为了预测而生
def gradAscent(dataMat, labelPMat):
    alpha = 0.2                                                        #移动步长,也就是学习速率,控制更新的幅度。
    maxCycles = 1000                                                      #最大迭代次数
    weights = np.ones((dataMat.shape[1],labelPMat.shape[1]))             #初始化权回归系数矩阵  系数矩阵的行数为特征矩阵的列数,系数矩阵的列数为分类数目
    for k in range(maxCycles):
        h =  softmax(dataMat*weights)                                #梯度上升矢量化公式,计算预测值(行向量)。每一个样本产生一个概率行向量
        error = h-labelPMat                                            #计算每一个样本预测值误差
        weights = weights - alpha * dataMat.T * error                   # 根据所有的样本产生的误差调整回归系数
    return weights                                                     # 将矩阵转换为数组,返回回归系数数组

pytorch实现

EPOCH = 5000
BATCH_SIZE = 100
LR = 0.01

train_set = Data.TensorDataset(x_train,y_train)
train_loader = Data.DataLoader(
            dataset=train_set,
            batch_size=BATCH_SIZE,
            shuffle=True
            )
            
net = nn.Sequential(
            nn.Linear(8,50),
            nn.ReLU(),
            nn.Linear(50,4)
            )
LOSS_FUNC = nn.CrossEntropyLoss() # 损失函数torch.nn.CrossEntropyLoss()中已经包含了Softmax函数
OPTIMIZER = torch.optim.SGD(net.parameters(), lr=LR)  

for epoch in range(1,EPOCH+1):
    loss_sum = 0.0
    for step,(x,y) in enumerate(train_loader):
        y_pred = net(x)
        y = y.squeeze() #修正标签格式
        loss = LOSS_FUNC(y_pred,y)
        loss_sum += loss
        OPTIMIZER.zero_grad()
        loss.backward()
        OPTIMIZER.step()
    print("epoch: %d, loss: %f" %(epoch,loss_sum/BATCH_SIZE))

欢迎扫描二维码关注微信公众号 深度学习与数学   [每天获取免费的大数据、AI等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值