深度学习-第三周

梯度下降法多变量求线性回归

实际情况下很多时候所需求的目标不止一个因素影响会有多个,因此更多情况下多个变量会更加贴近生活现实

下面以俩个因素变量为例:

初始化:

lr = 0.0002
num = 100000
w = np.array([[0.5214, 0.5215]])

定义模型(也是预测值):

yy = np.matmul(w, x.T)#
 x.T对张量x进行转置--11*2变为2*11

之后进行迭代

loss = 1 / 2.0 * np.sum((np.matmul(w, x.T) - y) ** 2)
w_list = []
loss_list = []
loss_list.append(loss)
for i in range(num):
    w_gra = np.mean(np.matmul((yy - y), x))
    w = w - lr * w_gra
    loss = 1 / 2.0 * np.sum((np.matmul(w, x.T) - y) ** 2)
    if loss > loss_list[-1]:
        break
    w_list.append(w)
    loss_list.append(loss)
    print(f"迭代第{i}次,梯度为{w_gra:10f},权重为:{w},损失:{loss:10f}")

之后进行预测值和真实值的对比

证明误差几乎可以忽略不记,对于这个数据来说w的值接近为1

完整代码:

import numpy as np
import torch

x = np.array([[0.180, 0.001 * 1], [0.100, 0.001 * 2],
              [0.160, 0.001 * 3], [0.080, 0.001 * 4],
              [0.090, 0.001 * 5], [0.110, 0.001 * 6],
              [0.120, 0.001 * 7], [0.170, 0.001 * 8],
              [0.150, 0.001 * 9], [0.140, 0.001 * 10],
              [0.130, 0.001 * 11]
              ])  # 11*2
y = np.array([[0.180 + 0.001 * 1, 0.100 + 0.001 * 2,
               0.160 + 0.001 * 3, 0.080 + 0.001 * 4,
               0.090 + 0.001 * 5, 0.110 + 0.001 * 6,
               0.120 + 0.001 * 7, 0.170 + 0.001 * 8,
               0.150 + 0.001 * 9, 0.140 + 0.001 * 10,
               0.130 + 0.001 * 11]
              ])  # 真实值

# 初始化
lr = 0.0002
num = 100000
w = np.array([[0.5214, 0.5215]])
# 定义模型
yy = np.matmul(w, x.T)  # x.T对张量x进行转置--11*2变为2*11
# 定义目标函数:
loss = 1 / 2.0 * np.sum((np.matmul(w, x.T) - y) ** 2)
w_list = []
loss_list = []
loss_list.append(loss)
for i in range(num):
    w_gra = np.mean(np.matmul((yy - y), x))
    w = w - lr * w_gra
    loss = 1 / 2.0 * np.sum((np.matmul(w, x.T) - y) ** 2)
    if loss > loss_list[-1]:
        break
    w_list.append(w)
    loss_list.append(loss)
    print(f"迭代第{i}次,梯度为{w_gra:10f},权重为:{w},损失:{loss:10f}")
print(w)
yy = np.matmul(w, x.T)
print("预测值:", yy)
print("真实值:", y)

结果:

 梯度下降法进行多变量进行二分类

数据的准备和初始化

以y=150为界限,把个体分为两类

 迭代:

for i in range(num):
    mis_flag = False
    for i in range(n_samples):
        y_fre = np.dot(weights, x[i])+bias
        #判断是不是wu'fen
        if y_fre * y[i] <= 0 :
            weights +=lr * y[i] * x[i]
            bias +=lr *y[i]
            mis_flag =True
        if not mis_flag:
            break
print(weights)
print(bias)

迭代完之后,确定了w和bias的值

对每个样本的y值进行区分

y的计算公式为:

pre = np.dot(weights , x[i])+bias

 具体代码为:

y_fre = []
for i in range(n_samples):
    pre = np.dot(weights , x[i])+bias
    if(pre >= 0):
        y_fre.append(1)
    else:
        y_fre.append(-1)
print(y)
print(y_fre)

 完整代码:

import numpy as np
import matplotlib.pyplot as plt

#数据
x = np.array([[0.180, 0.001 * 1], [0.100, 0.001 * 2],
              [0.160, 0.001 * 3], [0.080, 0.001 * 4],
              [0.090, 0.001 * 5], [0.110, 0.001 * 6],
              [0.120, 0.001 * 7], [0.170, 0.001 * 8],
              [0.150, 0.001 * 9], [0.140, 0.001 * 10],
              [0.130, 0.001 * 11]
              ])  # 11*2
#分类标签
y = np.array([+1,-1,+1,-1,-1,-1,-1,+1,+1,+1,-1])
n_samples , n_features = x.shape
#初始化
weights  =  np.zeros(n_features)
bias = 0.0
lr = 0.0001
num = 100000
for i in range(num):
    mis_flag = False
    for i in range(n_samples):
        y_fre = np.dot(weights, x[i])+bias
        #判断是不是wu'fen
        if y_fre * y[i] <= 0 :
            weights +=lr * y[i] * x[i]
            bias +=lr *y[i]
            mis_flag =True
        if not mis_flag:
            break
print(weights)
print(bias)
y_fre = []
for i in range(n_samples):
    pre = np.dot(weights , x[i])+bias
    if(pre >= 0):
        y_fre.append(1)
    else:
        y_fre.append(-1)
print(y)
print(y_fre)

运行结果:

y已经被区分好了

感知机的概念:

 模型:

作用:

分类:loss = (y_pre-y)^2还需要分段函数 

回归:loss = (y_pre-y)^2(梯度下降法)

两个都需要求导:loss对权重(w)求导,

loss对偏置(bias)求导

激活函数

1,什么是激活(映射)函数作用是什么?:

        激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。类似于人类大脑中基于神经元的模型,激活函数最终决定了要发射给下一个神经元的内容。

        作用:不使用激活函数的话,神经网络的每层都只是做线性变换,多层输入叠加后也还是线性变换。因为线性模型的表达能力通常不够,所以这时候就体现了激活函数的作用了,激活函数可以引入非线性因素。 

2,常用激活函数:

        (1)Sigmoid函数:

        公式:

                

        导数:

                

        图像(左:原函数,右:导数):

        特点:它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.因为这个特点sigmoid函数特别适用于将预测概率作为输出的模型

        优点:便于求导的平滑函数,函数是可微的

        缺点: 容易出现gradient vanishing--梯度消失,函数输出并不是zero-centered(中心化),幂运算相对来讲比较耗时

        (2)ReLu函数

        公式:

                

        图像:

        

         优点:在x>0的情况下不会出现梯度饱和,梯度消失的问题,收敛速度快,运算速度也快

         缺点:输出值都是非0,存在神经元死亡在x<0时,梯度为零。这个时候神经元及之后的神经元永远梯度为0 ,不再对任何数据有影响,导致参数不再更新

        (3)Tanh函数

                公式:

                          

                图像: 

                

它和sigmoid很像,但是还是有区别的:

        优点 :输出均值是0,收敛速度要比sigmo快,可减少迭代次数

        缺点:需要幂运算,计算成本高,也存在梯度消失

        (4)Softmax函数

                公式 :

                        

                图像:

                        

         Softmax 是用于多类分类问题的激活函数,在多类分类问题中,超过两个类标签则需要类成员关系。对于长度为 K 的任意实向量,Softmax 可以将其压缩为长度为 K,值在(0,1)范 围内,并且向量中元素的总和为 1 的实向量。只能用在输出层神经上  。      

                主要缺点:

                        在0 时不可微。负输入的梯度为零,这意味着对于该区域的激活,权重不会在反向传播期间更新,因此会产生永不激活的死亡神经元。

多层感知机:

多层感知机分为输入层,隐藏层,输出层。除了输入层没有激活函数,其他都有。

 多层感知机思路就是将一次不能完成学习的东西分多次进行学习。针对XOR问题就是先学一个x,再学一个y,然后再将这两次学习的结果组合起来。

最后的出来的y是嵌套复合函数

      隐藏层可以有多个:

        

BP神经网络:

bp神经网络全称为Back Propagation Neural Network,简称为BPNN

BP神经网络的原理就像下面的图一样,模仿人的大脑的原理,把看到的东西作为输入,然后经过大脑,最后作为输出。

他的数学公式:

 

这是一个只有一个隐层的BP神经网络(加上输入层、输出层,称为三层BP神经网络),

BP神经网络也可以有多个隐层,多层的BP神经网络结构图如下:

多个隐层的BP神经网络的数学表达式进行套娃就可以了,

学习时先用三层的进行理解,因为三层的使用得较多。

 

BP使用均方差函数来评估网络的误差,它的公式如下:

                         

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值