日更挑战-神经网络之感知器


越不懂的越爱装
大家都同等:IT世界没有难不难,只有是否了解过

挑战目录

问题1: 什么是感知器?

解 答:

首先可以先说一下线性函数 y=wx+b:
对于传入x=x1的时候会输出y1。
这时候线上面点用y1+n =wx1+b(n为大于0的数), 同理y1-n =wx1+b是线下面的点。
那么假设一个随机数a: wx1+b=a,这时 (y-a) 大于或小于0表示(x1,a)在这个线的上面还是下面。
那么 a=wx1+(b-y) 的结果a是否大于0表示在线的上面还是下面。
即:通过一根线将一个平面上的点划分成了两部分。
对上面的函数来说,x是自变量,y是因变量。w和b是用来确定这根线位置的。
其中wx相乘可以看做输入x加上权重w的结果。
上面的扩展到对于多个x的函数, y=w1x1+w2x2+...+wixi+b。
同理可以看做对输入x1,x2 ... xi分别加权后的结果

综上: 先初步理解感知器是把一个问题的多种情况(x)对结果影响的权重(w)的结果(wx+b)的值在我们的期待结果(那条线)的上面还是下面。

感知器问题举例: 是否能毕业取决于,平时成绩、平时表现、和期末考试分别占不同比重来决定。其中平时成绩占比20%,平时表现占比20%,期末考试占比60%。最后的出来的如果大于60就代表可以毕业。

那么最好的线就是: y=平时成绩*0.2+平时表现*0.2+期末考试*0.6-60
其[0.2,0.2,0.6,-60]为这个问题最好的模型:>0 及格,<0 不及格

x1,x2,x3 => f(n)  => 上面提到的a值

由上引发问题1: 如何得到这根线?

由上引发问题2: 如何理解w1...wi?

解 答1:

如何得到这根线?
机器学习就代表需要机器自己来找到这根线。即找到上面的[0.2,0.2,0.6,-60]这组相似模型。

假设在平面坐标中有一堆正负点,还有一个我们预期的直线方程(机器学习问题都是没有直接的目标直线方程,而是有一些训练数据的问题)上的点(即训练数据),然后我们随机画一条线(即随机取w和b的值来确定一条直线):
现在这根线很容易是错的离谱的。我们使用这根随机取的直线算出来的a,a=wx+b 。通过算y-a(y是正确的直线的输出)就可以知道当前的x在标准y的上面还是下面了。然后通过激活函数将y-a进行格式化输出(有多种激活函数,这里用大于0是输出1,小于0时输出0的激活函数)

通过上面得到的y-a激活后的误差,代收正负号通过自己定义的更新速度相乘(y-a越接近0则更新值越小,会越接近需要的w和b)来更新这根线的w和b。

经过训练数据的多次的训练更新到最后的w和b后,随机取的直线会近乎移动到目标直线.这时平面的点就被分开了。这时候的w和b在输入测试数据x?得到的y?,判断是来的在线的上面还是下面的结果。就会和训练数据的"结果规则"一样。


本以为今天能写完感知器,但是写下去引发的问题会越来越多
使用几个小时写这个太浪费时间了。
以后每天最多只能花费一个小时来写
今天写完不太现实。所以下面的之后接着写吧。。。

解 答2: 如何理解w1...wi?


由上,解 答1引发问题1: 感知器的用途和局限性?

由上,解 答1引发问题1: 什么是激活函数?

由上,解 答1引发问题2: 为什么要套一层激活函数来更新?

由上,解 答1引发问题3: 有哪些激活函数?

由上,解 答1引发问题4: 如何选用激活函数?

由上,解 答1引发问题5: 为什么w和b一起更新不会导致越过真正需要的w和b?


下面使用Python实现一个上面是否毕业的感知器

# 造数据:生成一个训练数据
def aData():
    #随机获得一个长度为3的0-100的整数数组,用来表示3次成绩
    dataArray=np.random.randint(0,100,3)
    #对上面生成的一次数据生成训练的结果数据(即按照标准得到y)
    if (dataArray[0]*0.2+dataArray[1]*0.2+dataArray[2]*0.6)>=60:
        return data,1
    else:
        return data,0

# 造数据:调用上面的方法生成n个训练数据
def gainDataArray(n):
    dataset=[] # 存放训练数据的输入
    labelset=[] # 存放训练数据的输出
    for i in range(n):  #循环n次调用上面的方法获取训练数据
        data,label=aData()
        dataset.append(data)
        labelset.append(label)
    return dataset,labelset

# 感知器封装类
class Sensor(object):
    # eta:可控的学习速度(改变梯度下降时斜率对w的改变量的影响)
    # max_train_count: 训练次数,即最大更新w,b的次数
    def __init__(self, eta=0.1, max_train_count=100):
        self.eta = eta
        self.max_train_count = max_train_count

    # 训练方法
    def train(self,X , X):
        # 随机画一根线,随机赋值w和b
        self.w=np.random.random((1, len(X[0])))[0]
        self.b = 0
        # 根据梯度下降更新w和b
        for i in range(self.max_train_count):
            for x, y in zip(X, Y):
                # 在线的上面还是下面,并通过自定义的学习速度获取更新w和b的值
                detalw = self.eta * (y - self.predict(x)) #(y - self.predict(x)) 越小更新越接近0
                self.w += detalw * xi # 更新w
                self.b += update # 更新b

    def getYByX(self, X):
        return np.dot(X, self.w) + self.b

    def predict(self, X):
        return np.where(self.getYByX(X) >= 0.0, 1, 0)

if __name__=='__main__':
   #初始化随机种子
   np.random.seed(1)
   #构造训练数据
   dataset, labelset =gainDataArray(1000)
   sensor = Sensor()
   sensor.train(dataset, labelset)
  
  #测试训练结果
  #构造测试数据
  testset,testlabel=gainDataArray(1)
  #获取当前的预测结果
  testResult=sensor.predict(testset[0])

你可能感兴趣的:(日更挑战-神经网络之感知器)