【感知器】神经网路

任务描述

本关任务:使用感知机算法建立一个模型,并根据感知机算法流程对模型进行训练,得到一个能够准确对西瓜好坏进行识别的模型。

相关知识

为了完成本关任务,你需要掌握:1.什么是感知机,2.感知机算法流程。

数据介绍

这里,我们利用西瓜书上的例子来构造数据,实例中包括特征和类别。帮助预测的特征一共有3个:色泽、根蒂、敲声。类别为是好瓜与不是好瓜。由于我们的模型只能对数字进行计算。所以,我们用x1​表示色泽,x2​表示根蒂,x3​表示敲声y表示类别。
其中,x1​=0,表示青绿,x2​=2,表示稍蜷y=-1,表示不是好瓜。具体如下图:

而我们的任务就是,用感知机算法建立一个模型,利用这份数据对模型进行训练,最后对一个特征值分别为青绿稍蜷沉闷的西瓜的好坏进行预测。

什么是感知机

我们知道神经网络是由一个个的神经元所组成的,我们知道了神经元的工作原理,就能帮助我们理解神经网络是如何工作的了。上个世纪六十年代,提出了最早的“人造神经元”模型,叫做“感知机”,直到今天还在用。感知机与逻辑回归一样,也是一个二分类模型,那么它又是如何进行预测的呢?

以西瓜数据为例,我们希望构建一个感知机模型,根据色泽、根蒂、敲声这三个特征来判断是好瓜还是坏瓜。

比如说,输入的特征值分别是青绿,蜷缩,浊响对应特征向量为(0,0,0)。感知机模型会将每一个特征值xi​乘以一个对应的权重wi​,再加上一个偏置b,所得到的值如果大于等于0,则判断为+1类别,即为好瓜,如果得到的值小于0,则判断为-1类别,即不是好瓜。数学模型如下:

f(x)=sign(w1​x1​+w2​x2​+..+wn​xn​+b)

sign={−1+1​x<0x≥0​

其中xi​为第i个特征值,wi​为第i个特征所对应的权重,b为偏置。

感知机算法流程

我们能否正确对西瓜好坏进行预测,完全取决于权重与偏置的值是否正确,那么如何找到正确的参数呢?方法与逻辑回归相似,这里就不重复叙述,唯一不同的就是感知机模型所用的损失函数。

那么,感知机使用的损失函数是怎么样的呢?
感知机采用的损失函数最初采用的是误分类点到决策边界的距离:

∣∣w∣∣∣w.x+b∣​

而对于误分类的数据(xi​,yi​)来说:

{yi​=+1yi​=−1​w.xi​+b<0w.xi​+b≥0​

所以,∣w.xi​+b∣=−yi​(w.xi​+b)
又因为:

  • 1/||w||不影响-y(w.x+b)正负的判断,我们只需要判断-y(wx+b)的正负来判断分类的正确与否。所以1/||w||对感知机学习算法的中间过程可有可无。

  • 1/||w||不影响感知机学习算法的最终结果。因为感知机学习算法最终的终止条件是所有的输入都被正确分类,即不存在误分类的点。则此时损失函数为0。对应于-y(wx+b)/||w||,即分子为0。则可以看出1/||w||对最终结果也无影响。所以最后采用的损失函数为:

    L(w,b)=−xi​∈M∑​yi​(w.xi​+b)

    其中M为误分类点的集合

感知机只针对误分类的点对参数进行更新,算法流程如下:

1.选取初始值 w0​,b0​;

2.在训练集中选取数据xi​,yi​;

3.如果yi​(w.xi​+b)≤0,即这个点为误分类点,则进行如下更新:
w=w−η∂w∂l(w,b)​=w+ηyi​xi​
b=b−η∂b∂l(w,b)​=b+ηyi​
4. 重复23直到训练集中没有误分类点。

编程要求

根据提示,在右侧编辑器补充 python 代码,构建一个感知机模型,底层代码会调用您实现的感知机模型进行训练,并对一个特征值分别为青绿稍蜷沉闷(即特征向量为[0,2,2])的西瓜的好坏进行预测,预测正确则通关。

测试说明

只需返回预测结果即可,程序内部会检测您的代码,预测结果正确则视为过关。

 #encoding=utf8

import numpy as np
#构建感知机算法
class Perceptron(object):
    def __init__(self, learning_rate = 0.01, max_iter = 200):
        self.lr = learning_rate
        self.max_iter = max_iter
    def fit(self, data, label):
        '''
        input:data(ndarray):训练数据特征
              label(ndarray):训练数据标签
        output:w(ndarray):训练好的权重
               b(ndarry):训练好的偏置
        '''
        #编写感知机训练方法,w为权重,b为偏置
        self.w = np.random.randn(data.shape[1])
        self.b = np.random.rand(1)
        #********* Begin *********#
        count = 0
        while count < self.max_iter:
            flag = True
            for i in range(len(label)):
                if label[i] * (np.inner(self.w, data[i]) + self.b) <= 0:
                    flag = False
                    self.w += self.lr * (label[i] * data[i])
                    self.b += self.lr * label[i]
            
            if flag: 
                break
            count+=1
        #********* End *********#
        return None
    def predict(self, data):
        '''
        input:data(ndarray):测试数据特征
        '''
        #编写感知机预测方法,若是正类返回1,负类返回-1
        #********* Begin *********#        
        y = np.inner(data, self.w) + self.b
        # np.inner(a,b) 两个数组的内积
        for each in range(len(y)): # range(0,6) 
            if y[each] >= 0:
                y[each] = 1
            else:
                y[each] = -1
        predict = y
        return predict
        #********* End *********#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值