优达学城《DeepLearning》1-1:神经网络概论
本次目标
使用逻辑回归分类器,实现一个线性二分类器。
问题的分析
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:逻辑回归
查阅了很多资料,目前难以从头到尾的讲清楚逻辑回归的所有内容和前因后果,大概是知道了,但疑问很多,第二轮时再来看这个问题。
- 机器学习算法之逻辑回归https://www.biaodianfu.com/logistic-regression.html
技术介绍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
总结
学习如何编码实现梯度下降算法,并且在一个小数据集上应用。
即:使用梯度下降算法,找到一条直线,使之能最大程度的分隔两类数据点。
参考:
- 梯度下降法和反向传播算法是什么关系?https://www.zhihu.com/question/311616761/answer/608618557
- ★★深入浅出--梯度下降法及其实现https://www.jianshu.com/p/c7e642877b0e
★多元函数的偏导数、方向导数、梯度以及微分之间的关系思考https://zhuanlan.zhihu.com/p/31942912
逻辑回归和神经网络之间有什么关系?https://blog.csdn.net/tz_zs/article/details/79069499
优达学城《DeepLearning》1-1:神经网络概论相关推荐
- 优达学城《DeepLearning》大纲和学习愿景
目的: 查漏补缺深度学习体系,精益求精的深刻理解体系中各种核心的技术原理,感受技术思想背后的精髓魅力,做到能够脱口而出. 计划: 2021年5月.6月,完成课程中所有核心知识的深刻理解(通过撰写博客, ...
- 优达学城-神经网络之预测共享单车使用情况 代码分析
优达学城-神经网络之预测共享单车使用情况 代码分析 标签(): 机器学习 代码来自于优达学城深度学习纳米学位课程的第一个项目 https://cn.udacity.com/course/deep-le ...
- 优达学城-深度学习笔记(一)
优达学城-深度学习笔记(一) 标签: 机器学习 优达学城-深度学习笔记一 一 神经网络简介 最大似然概率 交叉熵Cross entropy 1交叉熵代码实现 2多类别交叉熵 对数几率回归的误差函数co ...
- 优达学城 深度学习 任务1
这几天刚好有环境,打算学习一下深度学习 看了一圈介绍,发现优达学城的深度学习课程作为入门课程还是不错的 今天看了第一章节的视频,顺便做了任务1 任务1难度不大,按照网站上的说明可以完成下载.打包等工作 ...
- 优达学城计算机视觉pkl,优达学城机器学习工程师纳米学位项目介绍
本文由 meelo 原创,请务必以链接形式注明 本文地址,简书同步更新地址 一对一的项目辅导是优达学城纳米学位的一大亮点.本文将简要介绍优达学城机器学习工程师纳米学位的6个项目.项目覆盖了机器学习的主 ...
- 无人驾驶8: 粒子滤波定位(优达学城项目)
优达学城无人车定位的项目实现: 粒子滤波算法流程图 粒子滤波的伪代码: step1:初始化 理论上说,当粒子数量足够多时,能准确地呈现贝叶斯后验分布,如果粒子太少,可能漏掉准确位置,粒子数量太多,会拖 ...
- 优达学城《无人驾驶入门》学习笔记——卡尔曼滤波器实现详解
优达学城<无人驾驶入门>的第二个项目是实现矩阵类,要求通过python编写一个用来计算矩阵的类Matrix.编写这个类并不难,涉及到的线性代数方面的知识也不多,比如矩阵的加法.减法.乘法, ...
- 优达学城无人驾驶工程师——P5车辆检测功能
这次讲的是优达学城无人驾驶工程师第一期的最后一个项目,车辆检测功能,代码如下. 导包 import cv2 import numpy as np import matplotlib.pyplot as ...
- 优达学城无人驾驶工程师——P4车道线检测功能
这次讲的是优达学城的无人驾驶工程师的P4项目,利用车前方的摄像头检测车道线,下面开始我们的代码部分. import numpy as np import cv2 import glob import ...
- 【多传感融合】优达学城多传感融合学习笔记(二)——将激光雷达点云俯视图映射到二维图像
将激光雷达点云俯视图映射到二维图像 目录 将激光雷达点云俯视图映射到二维图像 简介 实现方法 参考代码 简介 本节讲解如何将激光雷达点云俯视图(仅考虑水平坐标)映射到二维图像中,其中涉及到激光雷达点云 ...
最新文章
- android studio 顶部导航栏_Android10 手势导航开发与处理:边到边(I)
- 6426C Lab6 部署和配置RMS
- 一文解读苹果 M1 芯片电脑上的开源软件
- Apache Hook机制解析(中)——细节讨论
- 面试的时候的要注意的case应该怎么分析
- Ubuntu16安装anaconda没有这个文件或者目录
- linux下安装编译网卡驱动
- W ndoWs文件夹窗口,如何在本地网络中访问-Synology-NAS-上的文件-(Wndows).pdf
- redhat虚拟机安装
- 点工转自动化速成指南
- Party(HDU-3062)
- Ant—使用Ant构建简单Java项目(三)
- GitBash和GitGui右键失效解决方法
- 磁力mysql搜索_求一份磁力链接搜索网站的源码,最好能来个大神讲一下这个搜索的原理...
- 降级降薪去 Amazon ——左耳朵
- 前端工程师的前途与价值体现
- ILOM escalation mode下的管理命令用法几输出
- 青年同辈应该有大器晚成的心理准备,共勉
- 夜神模拟器无法连接网络的解决办法
- 大数据框架hadoop之JobTracker主要功能分析
热门文章
- SharePoint2010 -- 管理配置文件同步
- IntelliJ IDEA下自动生成Hibernate映射文件以及实体类
- PyTorch 笔记(05)— Tensor 基本运算(torch.abs、torch.add、torch.clamp、torch.div、torch.mul、torch.pow等)
- javascript小数相减会出现一长串的小数位数的原因
- 关于Adodb.Stream的使用说明
- OpenCV+python:霍夫变换与直线检测
- 刷题:递归问题与动态规划
- g2o入门——g2o的基本使用方法
- 二元关系在计算机中的应用(数据库为主),数据库技术复习题答案 选择题
- 安装凤凰os_这些系统帮助我们实现了在PC上安装安卓系统!