统计学习--01感知机

感知机属于线性分类模型,1957年由Rosenblatt提出,可以看成单层的神经网络。
感知机虽然简单,但是其工作原理、模型选择方式,仍然适用于后来复杂的神经网络如CNN,RNN等身上。从进化角度说,感知机可能相当于草履虫,但是我们如今地球上复杂的高等生物不也是从低等生物上慢慢进化来的么。
在这里插入图片描述

模型结构

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

学习方法

损失函数 L 为误分类点到超平面的距离

L ( w , b ) = − Σ y i ( w ∗ x i + b ) L(w, b) = -\Sigma{y_{i}(w*x_{i} + b)} L(w,b)=Σyi(wxi+b)

l >=0时,更新参数
l<0 不更新
属于误分类驱动
更新算法采用随机梯度下降

代码实现

初级

定义模型

class Perceptron: 
    def __init__(self):
        self.w = torch.zeros_like(w0,requires_grad=True)
        self.b = torch.zeros_like(b0,requires_grad=True)

    #正向传播
    def forward(self,x):
        return x@self.w + self.b
    
    def _sign(self, value):
        # 分类预测函数
        if value< 0:
            return -1
        return 1

    # 损失函数
    def loss_func(self,y_pred,y_true):  
        return -y_true * y_pred

model = Perceptron()
# 训练模型

def train_step(model, features, labels):

    predictions = model.forward(features)
    loss = model.loss_func(predictions,labels)
    print(f'loss:{loss}')
    if loss>=0:
        print('更新梯度')
        print(f'更新前 w:{model.w}')
        print(f'更新前 b:{model.b}')
    
        # 反向传播求梯度
        loss.backward()

        # 使用torch.no_grad()避免梯度记录,也可以通过操作 model.w.data 实现避免梯度记录 
        with torch.no_grad():
            # 梯度下降法更新参数
            model.w -= 1*model.w.grad
            model.b -= 1*model.b.grad

            # 梯度清零
            model.w.grad.zero_()
            model.b.grad.zero_()
    return loss

参考 p40 例2.1, 最终得到的分类曲线如下 ::

API 调用

class ToyModel(nn.Module):
    def __init__(self):
        super(ToyModel, self).__init__()
        self.fc1 = nn.Linear(2,1)
        self._init_parameters()

    # 正向传播
    def forward(self,x):
        y = self.fc1(x)
        return y

    # 损失函数
    def loss_func(self,y_pred,y_true):
        return -y_true * y_pred

    # 优化器
    @property
    def optimizer(self):
        return torch.optim.SGD(self.parameters(),lr = 1)
    
    def _init_parameters(self):
        # 自定义参数初始化
        for m in self.modules():
            if isinstance(m, nn.Linear):
                nn.init.zeros_(m.weight.data)
                nn.init.constant_(m.bias.data, 0)

model = ToyModel()



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
感知机(Perceptron)和支持向量机(Support Vector Machine,SVM)都是用于分类和回归任务的机器学习模型,但它们在基本原理、实现方式和性能优化方面存在一些差异。 1. 基本原理:感知机是一种线性模型,用于二元分类。它基于感知器算法,通过连续调整权重和偏置项,使得神经元的输出始终为1(对于正类)或0(对于负类)。支持向量机是一种统计学习模型,主要用于高维数据的分类和回归任务。它通过最大化间隔(即支持向量与分类线之间的距离)来避免过拟合,并捕捉到数据的全局结构信息。 2. 实现方式:感知机通常通过迭代调整权重和偏置项来实现学习。训练数据集被分成训练集和测试集,通过反向传播算法不断优化模型参数。支持向量机通常使用核函数将原始数据映射到高维特征空间,然后在特征空间中计算间隔最大化。在实践中,有许多不同的核函数可供选择,如线性核、多项式核和高斯核等。 3. 性能优化:感知机的性能受到其学习算法的限制,通常只能处理线性可分的数据集。支持向量机通过使用间隔最大化作为目标函数,能够更好地处理非线性可分的数据集。此外,支持向量机还具有对噪声和异常值的鲁棒性,并且对参数的选择不太敏感。 4. 应用场景:感知机在二元分类和二元回归任务中得到了广泛应用,如手写数字识别、垃圾邮件过滤等。支持向量机则更广泛地应用于各种分类和回归任务,如文本分类、时间序列预测、生物信息学等。 总之,感知机和支持向量机在基本原理、实现方式、性能优化和应用场景方面存在差异。感知机是一种简单的线性模型,适用于二元分类任务;而支持向量机则能够处理更复杂的数据结构,并在高维数据中表现良好。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值