0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实例:如何建立一个线性分类器并进行优化

zhKF_jqr_AI 来源:未知 作者:易水寒 2017-12-22 11:44 次阅读

之前,论智曾在TOP 10:初学者需要掌握的10大机器学习(ML)算法介绍了一些基础算法及其思路,为了与该帖联动,我们特从机器学习热门课程HSE的Introduction to Deep Learning和吴恩达的Neural Networks and Deep Learning中挑选了一些题目,演示PythonTensorFlow和Keras在深度学习中的实战应用.

如何建立一个线性分类器并进行优化.

在这个任务中,我们将实现一个线性分类器,并用numpy和随机梯度下降算法对它进行训练。

二元分类

为了更直观,我们用人造数据(synthetic data)解决二元分类问题。

上图中有红、蓝两类数据,从分布上看它们不是线性可分的。所以为了分类,我们应该在里面添加特征或使用非线性模型。请注意,图中两类数据的决策边缘都呈圆形,这意味着我们能通过建立二元特征来使它们线性分离,具体思路如下图所示:

用expand函数添加二次函数后,我们得到了这样的测试结果:

  1. # 简单的随机数测试

  2. dummy_X = np.array([

  3. [0,0],

  4. [1,0],

  5. [2.61,-1.28],

  6. [-0.59,2.1]

  7. ])

  8. # 调用expand函数

  9. dummy_expanded = expand(dummy_X)

  10. # 它应该返回这些值: x0 x1 x0^2 x1^2 x0*x1 1

  11. dummy_expanded_ans = np.array([[0. , 0. , 0. , 0. , 0. , 1. ],

  12. [1. , 0. , 1. , 0. , 0. , 1. ],

  13. [2.61, -1.28, 6.8121, 1.6384, -3.3408, 1. ],

  14. [-0.59, 2.1 , 0.3481, 4.41, -1.239, 1. ]])

logistic回归

曾经我们提到过,logistic回归非常适合二元分类问题。为了分类对象,我们需要预测对象表示为1(默认类)的概率,这就需要用到线性模型和逻辑函数的输出:

  1. defprobability(X, w):

  2. """

  3. 对输入赋值特征和权值

  4. 根据上式,返回输入x后y==1的预测概率,P(y=1|x)

  5. :参数 X: feature matrix X of shape [n_samples,6] (expanded) →特征矩阵X

  6. :参数 w: weight vector w of shape [6] for each of the expanded features →权值向量w

  7. :返回值: 范围在 [0,1] 之间的一系列概率.

  8. """

  9. return1./ (1+ np.exp(-np.dot(X, w)))

在logistic回归中,我们能通过最小化交叉熵发现最优参数w:

实例:如何建立一个线性分类器并进行优化
  1. defcompute_loss(X, y, w):

  2. """

  3. 将特征矩阵X [n_samples,6], 目标向量 [n_samples] of 1/0,

  4. 以及权值向量 w [6]代入上述公式, 计算标量的损失函数.

  5. """

  6. return-np.mean(y*np.log(probability(X, w)) + (1-y)*np.log(1-probability(X, w)))

由于用了梯度下降算法训练模型,我们还需要计算梯度,具体来说,就是要对每个权值的损失函数求导:

以下是具体的数学计算过程(也可点击https://math.stackexchange.com/questions/477207/derivative-of-cost-function-for-logistic-regression/2539508#2539508查看):

实例:如何建立一个线性分类器并进行优化
  1. defcompute_grad(X, y, w):

  2. """

  3. 将特征矩阵X [n_samples,6], 目标向量 [n_samples] of 1/0,

  4. 以及权值向量 w [6]代入上述公式, 计算每个权值的导数vector [6].

  5. """

  6. returnnp.dot((probability(X, w) - y), X) / X.shape[0]

训练

现在我们已经建立了函数,接下来就该用随机梯度下降训练分类器了。我们将试着调试超参数,如batch size、学习率等,来获得最佳设置。

Mini-batch SGD

不同于满梯度下降,随机梯度下降在每次迭代中只需要一个随机样本来计算其损失的梯度,并进入下一个步骤:

  1. w = np.array([0,0,0,0,0,1])# 初始化

  2. eta =0.05# 学习率

  3. n_iter =100

  4. batch_size =4

  5. loss = np.zeros(n_iter)

  6. foriinrange(n_iter):

  7. ind = np.random.choice(X_expanded.shape[0], batch_size)

  8. loss[i] = compute_loss(X_expanded, y, w)

  9. dw = compute_grad(X_expanded[ind, :], y[ind], w)

  10. w = w - eta*dw

下图展示了当batch size=4时,决策面(decision surface)和交叉熵损失函数如何随着不同batch的SGD发生变化。

实例:如何建立一个线性分类器并进行优化

左:决策面;右:损失函数

用Momentum优化SGD

Momentum是模拟物理里动量的概念,如下图所示,它能在相关方向加速SGD,抑制振荡,从而加快收敛。从计算角度说,就是对上一步骤更新向量和当前更新向量做加权平均,将其用于当前计算。

实例:如何建立一个线性分类器并进行优化

  1. eta =0.05# 学习率

  2. alpha =0.9# momentum

  3. nu = np.zeros_like(w)

  4. n_iter =100

  5. batch_size =4

  6. loss = np.zeros(n_iter)

  7. foriinrange(n_iter):

  8. ind = np.random.choice(X_expanded.shape[0], batch_size)

  9. loss[i] = compute_loss(X_expanded, y, w)

  10. dw = compute_grad(X_expanded[ind, :], y[ind], w)

  11. nu = alpha*nu + eta*dw

  12. w = w - nu

下图展示了引入Momentum后,当batch size=4时相应决策面和交叉熵损失函数随不同batch SGD+momentum发生的变化。可以看出,损失函数下降速度明显加快,更快收敛。

实例:如何建立一个线性分类器并进行优化

左:决策面;右:损失函数

RMSprop

加快收敛速度后,之后我们要做的是调整超参数学习率,这里我们介绍Hinton老爷子的RMSprop。这是一种十分高效的算法,利用梯度的平方来调整学习率:

  1. eta =0.05# 学习率

  2. alpha =0.9# momentum

  3. G = np.zeros_like(w)

  4. eps =1e-8

  5. n_iter =100

  6. batch_size =4

  7. loss = np.zeros(n_iter)

  8. foriinrange(n_iter):

  9. ind = np.random.choice(X_expanded.shape[0], batch_size)

  10. loss[i] = compute_loss(X_expanded, y, w)

  11. dw = compute_grad(X_expanded[ind, :], y[ind], w)

  12. G = alpha*G + (1-alpha)*dw**2

  13. w = w - eta*dw / np.sqrt(G + eps)

下图是使用了SGD + RMSProp后决策面和损失函数的变化情况,较之之前,函数下降更快,收敛也更快。

实例:如何建立一个线性分类器并进行优化


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ML
    ML
    +关注

    关注

    0

    文章

    140

    浏览量

    34340
  • 线性分类器
    +关注

    关注

    0

    文章

    3

    浏览量

    1418

原文标题:课后作业(一):如何建立一个线性分类器并进行优化

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问MDF如何建立线性连接?

    线性的应用,可能需要上百节点组成
    发表于 06-28 06:40

    基于神经网络的呼吸音分类算法

    )×Y相乘,其中Xi是预测噪声标签(对于噪声帧,X=1),Y是帧。异常分类称为ARNN的堆叠RNN,它为一个样本(所有帧)预测
    发表于 05-31 12:05

    连接两TC397 EVK并进行SPI试验时,无法测量主SCLKO波形,为什么?

    使用 AURIX TC397 示例代码(SPI_CPU_1_KIT_TC397_TFT) ADS 版本:1.9.20 平台:kit_a2g_tc397_5v_tft 连接两 TC397 EVK 并进行 SPI 试验时,无法测量主 SCLKO 波形。
    发表于 05-29 06:33

    如何将STM32L476RG的信息传输给X-NUCLEO-nfc并进行手机读取?

    如何将STM32L476RG的信息传输给X-NUCLEO-nfc并进行手机读取
    发表于 03-20 07:02

    FSLP建立接口,如何降低ADC-DMA的速度?

    我正在为 FSLP(力感线性电位计)建立接口,以检测用户的触摸滑动。 我正在使用比较 ISR 来检测用户触摸 FSLP 的情况,然后从
    发表于 03-06 06:31

    线性稳压器的分类及特点

    线性稳压器是电源管理中的关键组件,它们通过连续调整其内部通过元件(如晶体管)的电流来输出恒定电压。线性稳压器可以按照不同的标准进行分类,以下是一些常见的
    的头像 发表于 02-04 10:37 401次阅读

    FPGA分类

    :适用于各种不同的应用,如通信、工业控制、视频处理等。 专用FPGA :针对特定的应用领域进行优化,如高速接口、网络处理、AI加速等。 上述分类并非互斥,某些FPGA可能同时属于多个类别。
    发表于 01-26 10:09

    【技术干货】PID算法原理分析及优化

    目标值,这样被控对象运行平稳,避免了因突变带来的超调。 这种方法并未改变PID算法结构本身,而是对设定值进行步进处理,使其不产生突变。步进处理方法有很多种,最为常见的是建立
    发表于 12-22 15:38

    LabVIEW进行癌症预测模型研究

    进行线性数据分类。主成分分析(PCA)和线性判别分析(LDA)PCA和LDA用于降维,减少噪声,并保留数据的重要特征。在并行PCA-LDA-SVM模型中,先对原始数据同时
    发表于 12-13 19:04

    在multisim中利用双运放ADA4096-2构建了低通滤波进行仿真,引脚如何分配?

    我在multisim中利用双运放ADA4096-2构建了低通滤波并进行了仿真,之后感觉ADA4096的带宽只有500KHZ,因此想换成ADA4084-2试
    发表于 11-27 06:44

    Python函数形参的分类

    形参的分类 形参的分类可以分为六种: 带有默认值的位置形参 不带默认值的位置形参 带有默认值的关键字形参 不带默认值的关键字形参 可变长度的位置形参 可变长度的关键字形参 实例: def fn
    的头像 发表于 11-14 11:19 467次阅读

    MATLAB编程在优化中的应用介绍

    用途的优化软件包可以放松编程知识。为了有效地使用它们,仍有两方面需要解决。 有几本关于优化主题的优秀书籍,其中有几本是最近发行的。它们中的大多数都深入地涵盖了这主题,这是必要的,因
    发表于 09-21 07:07

    如何使用UART将M480从电源下降模式中唤醒并进行频率补偿

    应用:本样本代码使用UART将M480从电源下降模式中唤醒,并进行频率补偿。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-M487 VER
    发表于 08-23 06:20

    keras内置的7常用的优化介绍

    编译模型时需要如下两参数: “损失函数”(loss function),用来衡量网络的预测有多好。
    发表于 08-18 06:32

    如何使用rt thread studio建立TI launchpad的工程?

    想使用rt thread studio建立TI launchpad的工程,打开建立项目界面后选择添加厂商: 然后进入SDK管理
    发表于 08-04 16:04