本次目标

使用逻辑回归分类器,实现一个线性二分类器。

问题的分析

data.csv文件形式如下,共80个点,0和1两类。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pddata = pd.read_csv('data.csv', header=None)
X = np.array(data[[0,1]])
y = np.array(data[2])
plot_points(X,y)
plt.show()

结果:

技术介绍1:逻辑回归

查阅了很多资料,目前难以从头到尾的讲清楚逻辑回归的所有内容和前因后果,大概是知道了,但疑问很多,第二轮时再来看这个问题。

  1. 机器学习算法之逻辑回归https://www.biaodianfu.com/logistic-regression.html

技术介绍2:梯度下降算法

“梯度”概述

梯度(矢量)是微积分中的一个概念:

  • 在单变量的函数中,梯度其实就是函数的导数(带方向),代表着函数在某个给定点的切线的斜率
  • 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向。梯度是偏导数(标量)的矢量和。

看待微分的意义,可以有不同的角度:

  1. 函数某点切线的斜率
  2. 函数的变化率

单变量微分例子:

多变量微分例子:

求多变量梯度的例子:

我们可以看到,梯度就是分别对每个变量进行微分,然后用逗号分割开,梯度是用<>包括起来,说明梯度其实一个向量。

梯度下降法简述

梯度下降它的主要目的和实现方法是:沿着目标函数梯度的方向更新参数值,通过迭代以期望达到到目标函数的最小值(或最大值)。

在机器学习中,常见的有:随机梯度下降法和批量梯度下降法。

梯度下降算法的数学表达

下面我们就开始从数学上解释梯度下降算法的计算过程和思想!

此公式的意义是:J是关于Θ的一个函数,我们当前位置在Θ0点,要从这个点走到J的最小值点,也就是山底。首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是α,走完这个段步长,就到达了Θ1这个点!

下面就这个公式的几个常见的疑问:

  • α的含义:

    • 学习率或者步长。α不能太大也不能太小,太小导致迟迟走不到最低点,太大导致无法收敛或错过最低点!
  • 为什么用减法而不是加法?
    • 梯度前加一个负号,就意味着朝着梯度相反的方向前进!我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号。

单变量函数的梯度下降

假设有如下单变量函数,我们利用梯度下降法,试图找到一个参数θ的最佳值,使得损失函数J(θ)的值最小

函数的微分:

初始化,起点为:

   (注意这里0不是次方,而是序号意思。即先设定单变量θ的初始值为2,至于函数值为多少需要去计算。

学习率为:

根据梯度下降的计算公式:

我们开始进行梯度下降的迭代计算过程:

可视化收敛过程如下:

局部放大图:

从可视化中可看出,梯度下降法在趋近函数最小值(1, -1)点,那个点位的单变量值为1。

首先本案例函数是我自己设计并可视化后选定的,我在动手计算时,发现学习率对梯度下降太敏感了,本来设定的学习率为0.4,但一下就跑到左边曲线很远地方去了,0.1也会跑到左边去,最终发现0.05对于这个函数而言是比较好的学习率。所以说,花点时间亲自动手,对算法的理解还是会生动的多。

多变量函数的梯度下降

我们假设有一个损失函数:

现在要通过梯度下降法计算这个函数的最小值。我们通过观察就能发现最小值其实就是 (0,0)点。但是接下来,我们会从梯度下降算法开始一步步计算到这个最小值!

我们假设初始的起点为:

初始的学习率为:

函数的梯度为:

进行多次迭代:

我们发现,已经基本靠近函数的最小值点:

从上面能看出,多变量的函数梯度下降和单变量没有本质区别,计算的时候各变量基本是隔离的,有点像矩阵计算。

逻辑回归+梯度下降法在本项目中应用

1 sigmoid激励函数

2 输出公式

3 损失函数

其中 y 是真值标签值,y^是预测标签值。

4 更新权值的函数

代码和输出

import matplotlib.pyplot as plt
import numpy as np
import pandas as pddef plot_points(X, y):admitted = X[np.argwhere(y==1)]rejected = X[np.argwhere(y==0)]plt.scatter([s[0][0] for s in rejected], [s[0][1] for s in rejected], s = 25, color = 'blue', edgecolor = 'k')plt.scatter([s[0][0] for s in admitted], [s[0][1] for s in admitted], s = 25, color = 'red', edgecolor = 'k')def display(m, b, color='g--'):plt.xlim(-0.05,1.05)plt.ylim(-0.05,1.05)x = np.arange(-10, 10, 0.1)plt.plot(x, m*x+b, color)# Activation (sigmoid) function
def sigmoid(x):return 1 / (1 + np.exp(-x))# Output (prediction) formula
def output_formula(features, weights, bias):return sigmoid(np.dot(features, weights) + bias)# Error (log-loss) formula
def error_formula(y, output):return - y*np.log(output) - (1 - y) * np.log(1-output)# Gradient descent step
def update_weights(x, y, weights, bias, learnrate):output = output_formula(x, weights, bias)d_error = y - outputweights += learnrate * d_error * xbias += learnrate * d_errorreturn weights, biasdef train(features, targets, epochs, learnrate, graph_lines=False):# 初始化errors = []n_records, n_features = features.shapelast_loss = Noneweights = np.random.normal(scale=1 / n_features**.5, size=n_features)bias = 0for e in range(epochs):del_w = np.zeros(weights.shape)#开始一个epoch的梯度下降计算for x, y in zip(features, targets): #zip:逐个元素打包成元组。weights, bias = update_weights(x, y, weights, bias, learnrate)# Printing out the log-loss error on the training setout = output_formula(features, weights, bias)loss = np.mean(error_formula(targets, out))errors.append(loss)if e % (epochs / 10) == 0: #无论多少epoch,都只打印10次结果print("\n========== Epoch", e,"==========")if last_loss and last_loss < loss:print("Train loss: ", loss, "  WARNING - Loss Increasing")else:print("Train loss: ", loss)last_loss = loss# e.g. 0.95 --> True (= 1), 0.31 --> False (= 0)predictions = out > 0.5# print(out)# print(targets)accuracy = np.mean(predictions == targets)#相等为1,不相等为0,均值就是精度。print("Accuracy: ", accuracy)if graph_lines and e % (epochs / 100) == 0: #每个epoch绘制一次‘分割线’display(-weights[0]/weights[1], -bias/weights[1])# 绘制预测效果图plt.title("Solution boundary")display(-weights[0]/weights[1], -bias/weights[1], 'black') # 绘制最终的分割线plot_points(features, targets)# 绘制所有样本点plt.show()# 绘制loss曲线plt.title("Error Plot")plt.xlabel('Number of epochs')plt.ylabel('Error')plt.plot(errors)plt.show()"""
X:point坐标集
y:标签集(0或1)
"""
data = pd.read_csv('data.csv', header=None)
X = np.array(data[[0,1]])
y = np.array(data[2])np.random.seed(44)
epochs = 100
learnrate = 0.01
train(X, y, epochs, learnrate, True)
========== Epoch 0 ==========
Train loss:  0.7135845195381634
Accuracy:  0.4========== Epoch 10 ==========
Train loss:  0.6225835210454962
Accuracy:  0.59========== Epoch 20 ==========
Train loss:  0.5548744083669508
Accuracy:  0.74========== Epoch 30 ==========
Train loss:  0.501606141872473
Accuracy:  0.84========== Epoch 40 ==========
Train loss:  0.4593334641861401
Accuracy:  0.86========== Epoch 50 ==========
Train loss:  0.42525543433469976
Accuracy:  0.93========== Epoch 60 ==========
Train loss:  0.3973461571671399
Accuracy:  0.93========== Epoch 70 ==========
Train loss:  0.3741469765239074
Accuracy:  0.93========== Epoch 80 ==========
Train loss:  0.35459973368161973
Accuracy:  0.94========== Epoch 90 ==========
Train loss:  0.3379273658879921
Accuracy:  0.94

总结

学习如何编码实现梯度下降算法,并且在一个小数据集上应用。

即:使用梯度下降算法,找到一条直线,使之能最大程度的分隔两类数据点。

参考:

  1. 梯度下降法和反向传播算法是什么关系?https://www.zhihu.com/question/311616761/answer/608618557
  2. ★★深入浅出--梯度下降法及其实现https://www.jianshu.com/p/c7e642877b0e
  3. ★多元函数的偏导数、方向导数、梯度以及微分之间的关系思考https://zhuanlan.zhihu.com/p/31942912

  4. 逻辑回归和神经网络之间有什么关系?https://blog.csdn.net/tz_zs/article/details/79069499

优达学城《DeepLearning》1-1:神经网络概论相关推荐

  1. 优达学城《DeepLearning》大纲和学习愿景

    目的: 查漏补缺深度学习体系,精益求精的深刻理解体系中各种核心的技术原理,感受技术思想背后的精髓魅力,做到能够脱口而出. 计划: 2021年5月.6月,完成课程中所有核心知识的深刻理解(通过撰写博客, ...

  2. 优达学城-神经网络之预测共享单车使用情况 代码分析

    优达学城-神经网络之预测共享单车使用情况 代码分析 标签(): 机器学习 代码来自于优达学城深度学习纳米学位课程的第一个项目 https://cn.udacity.com/course/deep-le ...

  3. 优达学城-深度学习笔记(一)

    优达学城-深度学习笔记(一) 标签: 机器学习 优达学城-深度学习笔记一 一 神经网络简介 最大似然概率 交叉熵Cross entropy 1交叉熵代码实现 2多类别交叉熵 对数几率回归的误差函数co ...

  4. 优达学城 深度学习 任务1

    这几天刚好有环境,打算学习一下深度学习 看了一圈介绍,发现优达学城的深度学习课程作为入门课程还是不错的 今天看了第一章节的视频,顺便做了任务1 任务1难度不大,按照网站上的说明可以完成下载.打包等工作 ...

  5. 优达学城计算机视觉pkl,优达学城机器学习工程师纳米学位项目介绍

    本文由 meelo 原创,请务必以链接形式注明 本文地址,简书同步更新地址 一对一的项目辅导是优达学城纳米学位的一大亮点.本文将简要介绍优达学城机器学习工程师纳米学位的6个项目.项目覆盖了机器学习的主 ...

  6. 无人驾驶8: 粒子滤波定位(优达学城项目)

    优达学城无人车定位的项目实现: 粒子滤波算法流程图 粒子滤波的伪代码: step1:初始化 理论上说,当粒子数量足够多时,能准确地呈现贝叶斯后验分布,如果粒子太少,可能漏掉准确位置,粒子数量太多,会拖 ...

  7. 优达学城《无人驾驶入门》学习笔记——卡尔曼滤波器实现详解

    优达学城<无人驾驶入门>的第二个项目是实现矩阵类,要求通过python编写一个用来计算矩阵的类Matrix.编写这个类并不难,涉及到的线性代数方面的知识也不多,比如矩阵的加法.减法.乘法, ...

  8. 优达学城无人驾驶工程师——P5车辆检测功能

    这次讲的是优达学城无人驾驶工程师第一期的最后一个项目,车辆检测功能,代码如下. 导包 import cv2 import numpy as np import matplotlib.pyplot as ...

  9. 优达学城无人驾驶工程师——P4车道线检测功能

    这次讲的是优达学城的无人驾驶工程师的P4项目,利用车前方的摄像头检测车道线,下面开始我们的代码部分. import numpy as np import cv2 import glob import ...

  10. 【多传感融合】优达学城多传感融合学习笔记(二)——将激光雷达点云俯视图映射到二维图像

    将激光雷达点云俯视图映射到二维图像 目录 将激光雷达点云俯视图映射到二维图像 简介 实现方法 参考代码 简介 本节讲解如何将激光雷达点云俯视图(仅考虑水平坐标)映射到二维图像中,其中涉及到激光雷达点云 ...

最新文章

  1. android studio 顶部导航栏_Android10 手势导航开发与处理:边到边(I)
  2. 6426C Lab6 部署和配置RMS
  3. 一文解读苹果 M1 芯片电脑上的开源软件
  4. Apache Hook机制解析(中)——细节讨论
  5. 面试的时候的要注意的case应该怎么分析
  6. Ubuntu16安装anaconda没有这个文件或者目录
  7. linux下安装编译网卡驱动
  8. W ndoWs文件夹窗口,如何在本地网络中访问-Synology-NAS-上的文件-(Wndows).pdf
  9. redhat虚拟机安装
  10. 点工转自动化速成指南
  11. Party(HDU-3062)
  12. Ant—使用Ant构建简单Java项目(三)
  13. GitBash和GitGui右键失效解决方法
  14. 磁力mysql搜索_求一份磁力链接搜索网站的源码,最好能来个大神讲一下这个搜索的原理...
  15. 降级降薪去 Amazon ——左耳朵
  16. 前端工程师的前途与价值体现
  17. ILOM escalation mode下的管理命令用法几输出
  18. 青年同辈应该有大器晚成的心理准备,共勉
  19. 夜神模拟器无法连接网络的解决办法
  20. 大数据框架hadoop之JobTracker主要功能分析

热门文章

  1. SharePoint2010 -- 管理配置文件同步
  2. IntelliJ IDEA下自动生成Hibernate映射文件以及实体类
  3. PyTorch 笔记(05)— Tensor 基本运算(torch.abs、torch.add、torch.clamp、torch.div、torch.mul、torch.pow等)
  4. javascript小数相减会出现一长串的小数位数的原因
  5. 关于Adodb.Stream的使用说明
  6. OpenCV+python:霍夫变换与直线检测
  7. 刷题:递归问题与动态规划
  8. g2o入门——g2o的基本使用方法
  9. 二元关系在计算机中的应用(数据库为主),数据库技术复习题答案 选择题
  10. 安装凤凰os_这些系统帮助我们实现了在PC上安装安卓系统!