我的GitHub地址:https://github.com/taw19960426/DeepLearning存放与之对应的python代码

1.Regression

1.1 Introduction

  • Machine Learning: define a set of function, goodness of function, pick the best function
  • 选不同的function 其实就是选不同的model,model里面最简单的就是linear model;此外还有很多nonlinear model,如deep learning, SVM, decision tree, kNN… 以上都是supervised learning - 需要搜集很多training data
  • 回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。回归问题通常是用来预测一个值,如预测房价、未来的天气情况等等。

1.2 Step

  • Step1:
    Model: y=b+wxcpy=b+w x_{c p}y=b+wxcp​
    -w和b是参数,w:权重,b:偏差
    线性模型:y=b+∑wixiy=b+\sum w_{i} x_{i}y=b+∑wi​xi​

  • Step2:Goodness of Function
    Goodness of Function - -损失函数L:input is a function, output is how bad it is (损失函数)。
    损失函数的第一版:L(w,b)=∑(y^n−(b+wxcpn))2L(w, b)=\sum\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2} L(w,b)=∑(y^​n−(b+wxcpn​))2

  • Step3: Best Function
    w∗b∗=arg⁡min⁡w,bL(w,b)=arg⁡min⁡w,b∑(y^n−(b+wxcpn))2w^{*} b^{*}=\arg \min _{w, b} L(w, b)=\arg \min _{w, b} \sum\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2} w∗b∗=argw,bmin​L(w,b)=argw,bmin​∑(y^​n−(b+wxcpn​))2

1.3 Regularization (正则化)

  • y=b+∑wixiy=b+\sum w_{i} x_{i}y=b+∑wi​xi​

  • L=∑n(y^n−(b+∑wixi))2+λ(wi)2L=\sum_{n}\left(\hat{y}^{n}-\left(b+\sum w_{i} x_{i}\right)\right)^{2}+\lambda\left(w_{i}\right)^{2}L=∑n​(y^​n−(b+∑wi​xi​))2+λ(wi​)2

  • 不但要选择一个loss小的function,还要选择一个平滑的function(正则化使函数更平滑, 因为w比较小)

  • λ\lambdaλ大,找出来的function就比较smooth。反之,找出来的则不太smooth. 在由小到大变化的过程中,函数不止要考虑loss最小化还要考虑weights最小化,所以对training error最小化的考虑就会相对(于没有正则化的时候)减小,因此training error会随着增大而增大。test error则先减小再增大。

2.Gradient Descent (梯度下降法)

梯度下降法 - 只要loss func对与它的参数是可微分的就可以用,不需要一定是线性方程

2.1 总体思想

  • 选择一个初始值w0w^{0}w0 ;-计算dLdw∣w=w0\left.\frac{d L}{d w}\right|_{w=w^{0}}dwdL​∣∣​w=w0​ ,w1←w0−ηdLdw∣w=w0w 1 \leftarrow w^{0}-\left.\eta \frac{d L}{d w}\right|_{w=w^{0}}w1←w0−ηdwdL​∣∣​w=w0​和 η\etaη学习率 。继续此步骤,直到找到等于零的梯度。
  • 对于两个参数:w∗,b∗w^{*}, b^{*}w∗,b∗; -选择初始值:w0,b0w_{0}, b_{0}w0​,b0​ ;
  • 计算
    ∂L∂w∣w=w0,b=b0,∂L∂b∣w=w0,b=b0\left.\frac{\partial L}{\partial w}\right|_{w=w_{0}, b=b_{0}},\left.\frac{\partial L}{\partial b}\right|_{w=w_{0}, b=b_{0}}∂w∂L​∣∣∣∣​w=w0​,b=b0​​,∂b∂L​∣∣∣∣​w=w0​,b=b0​​
    w1←w0−η∂L∂w∣w=w0,b=b0w^{1} \leftarrow w^{0}-\left.\eta \frac{\partial L}{\partial w}\right|_{w=w^{0}, b=b^{0}}w1←w0−η∂w∂L​∣∣∣∣​w=w0,b=b0​
    b1←b0−η∂L∂b∣w=w0,b=b0b^{1} \leftarrow b^{0}-\left.\eta \frac{\partial L}{\partial b}\right|_{w=w^{0}, b=b^{0}}b1←b0−η∂b∂L​∣∣∣∣​w=w0,b=b0​
    继续此步骤,直到找到等于零的坡度。
  • 以上方法得出来的结果满足:
    θ∗=arg⁡min⁡θL(θ)\theta^{*}=\arg \min _{\theta} L(\theta) θ∗=argθmin​L(θ)

2.2 线性回归-梯度下降公式摘要:

L(w,b)=∑n=110(y^n−(b+wxcpn))2∂L∂w=∑n=1102(y^n−(b+wxcpn))(−xcpn)∂L∂b=∑n=1102(y^n−(b+wxcpn))(−1)\begin{array}{l}{L(w, b)=\sum_{n=1}^{10}\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2}} \\\\ {\frac{\partial L}{\partial w}=\sum_{n=1}^{10} 2\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)\left(-x_{c p}^{n}\right)} \\ \\{\frac{\partial L}{\partial b}=\sum_{n=1}^{10} 2\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)(-1)}\end{array} L(w,b)=∑n=110​(y^​n−(b+wxcpn​))2∂w∂L​=∑n=110​2(y^​n−(b+wxcpn​))(−xcpn​)∂b∂L​=∑n=110​2(y^​n−(b+wxcpn​))(−1)​

2.3 设置learning rate:

  • 假设θ\thetaθ有两个变量θ1,θ2\theta_{1}, \theta_{2}θ1​,θ2​ , 则:
    θ0=[θ10θ20],θ1=θ0−η∇L(θ0)\theta^{0}=\left[\begin{array}{l}{\theta_{1}^{0}} \\ {\theta_{2}^{0}}\end{array}\right], \quad \theta^{1}=\theta^{0}-\eta \nabla L\left(\theta^{0}\right)θ0=[θ10​θ20​​],θ1=θ0−η∇L(θ0)
    [θ11θ21]=[θ10θ20]−η[∂L(θ10)/∂θ1∂L(θ20)/∂θ2]\left[\begin{array}{c}{\theta_{1}^{1}} \\ {\theta_{2}^{1}}\end{array}\right]=\left[\begin{array}{c}{\theta_{1}^{0}} \\ {\theta_{2}^{0}}\end{array}\right]-\eta\left[\begin{array}{c}{\partial L\left(\theta_{1}^{0}\right) / \partial \theta_{1}} \\ {\partial L\left(\theta_{2}^{0}\right) / \partial \theta_{2}}\end{array}\right][θ11​θ21​​]=[θ10​θ20​​]−η[∂L(θ10​)/∂θ1​∂L(θ20​)/∂θ2​​]
    这里:
    ∇L(θ)=[∂L(θ1)/∂θ1∂L(θ2)/∂θ2]\nabla L(\theta)=\left[\begin{array}{l}{\partial L\left(\theta_{1}\right) / \partial \theta_{1}} \\ {\partial L\left(\theta_{2}\right) / \partial \theta_{2}}\end{array}\right]∇L(θ)=[∂L(θ1​)/∂θ1​∂L(θ2​)/∂θ2​​]

  • 可以绘制loss vs. No. of parameters updates(同一个循环的参数迭代次数)的曲线,观察变化趋势;

  • 每隔几个时期将学习率降低一些因子,例如:ηt=η/t+1\eta^{t}=\eta / \sqrt{t+1}ηt=η/t+1​

  • 为不同的参数提供不同的学习率-Adagrad-将每个参数的学习率除以其先前导数的均方根
    w1←w0−η0σ0g0σ0=(g0)2w2←w1−η1σ1g1σ1=12[(g0)2+(g1)2]w3←w2−η2σ2g2σ2=13[(g0)2+(g1)2+(g2)2]wt+1←wt−ηtσtgtσt=1t+1∑i=0t(gi)2\begin{aligned} w^{1} \leftarrow w^{0}-\frac{\eta^{0}}{\sigma^{0}} g^{0} &   \sigma^{0}=\sqrt{\left(g^{0}\right)^{2}} \\ w^{2} \leftarrow w^{1}-\frac{\eta^{1}}{\sigma^{1}} g^{1} &   \sigma^{1}=\sqrt{\frac{1}{2}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}\right]} \\ w^{3} \leftarrow w^{2}-\frac{\eta^{2}}{\sigma^{2}} g^{2} &   \sigma^{2}=\sqrt{\frac{1}{3}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}+\left(g^{2}\right)^{2}\right]} \\ & \quad \quad \quad \quad \quad \\ w^{t+1} \leftarrow w^{t}-\frac{\eta^{t}}{\sigma^{t}} g^{t} &   \sigma^{t}=\sqrt{\frac{1}{t+1} \sum_{i=0}^{t}\left(g^{i}\right)^{2}} \end{aligned} w1←w0−σ0η0​g0w2←w1−σ1η1​g1w3←w2−σ2η2​g2wt+1←wt−σtηt​gt​  σ0=(g0)2​  σ1=21​[(g0)2+(g1)2]​  σ2=31​[(g0)2+(g1)2+(g2)2]​  σt=t+11​i=0∑t​(gi)2​​
    ηt/σt\eta^{t} / \sigma^{t}ηt/σt可以消除…然后涉及以下形式:
    wt+1←wt−η∑i=0t(gi)2gtw^{t+1} \leftarrow w^{t}-\frac{\eta}{\sqrt{\sum_{i=0}^{t}\left(g^{i}\right)^{2}}} g^{t} wt+1←wt−∑i=0t​(gi)2​η​gt
    gt=∂L(θt)∂wg^{t}=\frac{\partial L\left(\theta^{t}\right)}{\partial w}gt=∂w∂L(θt)​为当下的梯度值(偏微分) - 造成反差效果

3 python代码实现

我的GitHub地址:https://github.com/taw19960426/DeepLearning

3.1 GradientDescent01.py

import numpy as np
import matplotlib.pyplot as plt  # plt#相当于x^n和y^n所对应的cp值
x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
y_data = [640, 633, 619, 393, 428, 27, 193, 66, 226, 1591]#准备三维函数及待投影平面的网格坐标
x = np.arange(-200, -100, 1)  # bias
y = np.arange(-5, 5, 0.1)  # weight
Z = np.zeros((len(x), len(y)))
X, Y = np.meshgrid(x, y)
#[X,Y] = meshgrid(x,y) 将向量x和y定义的区域转换成矩阵X和Y,
# 其中矩阵X的行向量是向量x的简单复制,而矩阵Y的列向量是向量y的简单复制
for i in range(len(x)):for j in range(len(y)):b = x[i]w = y[j]Z[j][i] = 0for n in range(len(x_data)):Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2Z[j][i] = Z[j][i] / len(x_data)# yadata = b + w*xdata
b = -120  # intial b
w = -4  # intial w
lr = 0.0000001  # 学习率
iteration = 100000#迭代次数#存储绘图的初始值
b_history = [b]
w_history = [w]# iterations
for i in range(iteration):b_grad = 0.0w_grad = 0.0#L(w,b)对b,w分别求导for n in range(len(x_data)):b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n]#更新参数相当于第一代版本的W^(t+1)=W^t-(lr)^t*g^tb = b - lr * b_gradw = w - lr * w_grad# 存储绘图参数b_history.append(b)w_history.append(w)# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))
''' contourf() 函数为等高线图填充颜色.
x:指定 X 轴数据。
y:指定 Y 轴数据。
z:指定 X、Y 坐标对应点的高度数据。
colors:指定不同高度的等高线的颜色。
alpha:指定等高线的透明度。
cmap:指定等高线的颜色映射,即自动使用不同的颜色来区分不同的高度区域。
linewidths:指定等高线的宽度。
linestyles:指定等高线的样式'''
plt.plot([-188.4], [2.67], 'x', ms=6, markeredgewidth=3, color='orange')
# ms和marker分别代表指定点的长度和宽度。
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16)
plt.ylabel(r'$w$', fontsize=16)
plt.show()

结果显示:

3.2 GradientDescent02.py

对 b 和 w 给予克制化的Learning Rate:

学习率 lr 改为 1,lr_b = 0 / lr_w = 0 ;
对b、w定制化的学习率lr,采用Adagard

b = b - lr / np.sqrt(lr_b) * b_grad ; w = w - lr / np.sqrt(lr_w) * w_grad

import numpy as np
import matplotlib.pyplot as plt  # plt#相当于x^n和y^n所对应的cp值
x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
y_data = [640, 633, 619, 393, 428, 27, 193, 66, 226, 1591]#准备三维函数及待投影平面的网格坐标
x = np.arange(-200, -100, 1)  # bias
y = np.arange(-5, 5, 0.1)  # weight
Z = np.zeros((len(x), len(y)))
X, Y = np.meshgrid(x, y)
#[X,Y] = meshgrid(x,y) 将向量x和y定义的区域转换成矩阵X和Y,
# 其中矩阵X的行向量是向量x的简单复制,而矩阵Y的列向量是向量y的简单复制
for i in range(len(x)):for j in range(len(y)):b = x[i]w = y[j]Z[j][i] = 0for n in range(len(x_data)):Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2Z[j][i] = Z[j][i] / len(x_data)# yadata = b + w*xdata
b = -120  # intial b
w = -4  # intial w
lr = 1  # 学习率
iteration = 100000#迭代次数#存储绘图的初始值
b_history = [b]
w_history = [w]#对w,b分别定义学习率,初始化
lr_b=0
lr_w=0# iterations
for i in range(iteration):b_grad = 0.0w_grad = 0.0#L(w,b)对b,w分别求导for n in range(len(x_data)):b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n]''' #更新参数相当于第一代版本的W^(t+1)=W^t-(lr)^t*g^tb = b - lr * b_gradw = w - lr * w_grad'''# 对w,b分别赋予不同的学习率lr# 更新参数相当于第二代版本,加入反差效果,反映二次微分lr_b=lr_b+b_grad**2lr_w=lr_w+w_grad**2#对b、w定制化的学习率lr,采用Adagardb=b-lr/np.sqrt(lr_b)*b_gradw=w-lr/np.sqrt(lr_w)*w_grad# 存储绘图参数b_history.append(b)w_history.append(w)# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))
''' contourf() 函数为等高线图填充颜色.
x:指定 X 轴数据。
y:指定 Y 轴数据。
z:指定 X、Y 坐标对应点的高度数据。
colors:指定不同高度的等高线的颜色。
alpha:指定等高线的透明度。
cmap:指定等高线的颜色映射,即自动使用不同的颜色来区分不同的高度区域。
linewidths:指定等高线的宽度。
linestyles:指定等高线的样式'''
plt.plot([-188.4], [2.67], 'x', ms=6, markeredgewidth=3, color='orange')
# ms和marker分别代表指定点的长度和宽度。
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16)
plt.ylabel(r'$w$', fontsize=16)
plt.show()

结果显示:

参考文章:

  1. https://blog.csdn.net/xzy_thu/article/details/67640512
  2. https://blog.csdn.net/u013541048/article/details/81335256
  3. https://blog.csdn.net/wills798/article/details/80401771
  4. https://www.jianshu.com/p/994dec1bb90c

【ML】 李宏毅机器学习一:Regression、Gradient Descent(python实现)相关推荐

  1. 李宏毅机器学习笔记六——Gradient Descent

    视频来源: 李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av10590361/?p=6 使用GD的注意 ...

  2. 【吴恩达 机器学习】ex1 gradient descend —— python

    单变量线性回归 Python代码: import numpy as np import matplotlib.pyplot as plt import pandas as pd# cost funct ...

  3. 李宏毅机器学习笔记(三)——Regression: output a scalar amp;amp; Gradient Descent

    视频来源: 李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av10590361/?p=3 机器学习的目的 ...

  4. 【李宏毅机器学习】04:梯度下降Gradient Descent

    李宏毅机器学习04:梯度下降Gradient Descent 文章目录 李宏毅机器学习04:梯度下降Gradient Descent 一.梯度下降方法 二.梯度下降的改进方法 Tip 1: Tunin ...

  5. 201-3-19李宏毅机器学习视频笔记七(游戏解释Gradient Descent)

    视频部分: 视频7:使用帝国时代游戏解释Gradient Descent 李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.co ...

  6. [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)

    本文转自:https://blog.csdn.net/walilk/article/details/50978864 引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记, ...

  7. 【李宏毅2020 ML/DL】补充:Meta Learning - Gradient Descent as LSTM

    我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的.自己不知道的东西. 本次笔记补充视频 BV1JE411g7XF 的缺失部分.上节课李老师讲了元学习中的参数初始化方法:MAML 与 ...

  8. [李宏毅 机器学习笔记] Gradient Descent

    文章目录 前言 1 Gradient Descent 总结 前言   学习李宏毅老师的课程,所作的笔记,文中使用的PPT均来自李宏毅老师讲演PPT. 1 Gradient Descent   我们为了 ...

  9. 李宏毅 机器学习 2016 秋:3、Gradient Descent

    文章目录 三.Gradient Descent 3.1 Tuning your learning rates 3.2 Stochastic Gradient Descent 3.3 Feature S ...

最新文章

  1. 计算机表格大小怎么调整,excel表格如何调整表格大小
  2. 阿里重金投数梦工场 布局PaaS动了谁的奶酪
  3. 冒泡链表排序java_链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)...
  4. 麦咭早教机器人_号外|「2019第一站」麦咭亮相香港国际授权展!
  5. C++:构造函数2——拷贝构造函数
  6. 通用shellcode代码
  7. Python 提取数据库(Postgresql)并邮件发送
  8. android photopicker怎么修改状态栏,有没有办法阻止UIImagePickerController更改状态栏样式?...
  9. vue 分模块打包 脚手架_Vue面试官最爱的底层源码问题,你可以这样回答!
  10. android 图片转字符串,图片转字符文字怎么转?安卓字符图App
  11. Python中__init__和__new__的区别详解
  12. VB 详细枚举指定目录、文件夹文件列表
  13. cas3 自定义页面
  14. 实现四台服务器的负载均衡
  15. 12.Memcached 与 Redis 区别
  16. Unity3D脚本语言的类型系统
  17. 2022新版彩虹易支付系统源码支持当面付通道轮询第三方支付免签约
  18. 第四届CCF计算机职业资格认证考试题解(C++)
  19. 微信小程序初级——快递查询(利用聚合数据接口开发)
  20. python可以excel_python能处理excel吗

热门文章

  1. uitextfield 键盘类型_UITextField 键盘弹出问题
  2. 《Java编程的逻辑》第三部分 泛型与容器
  3. hello1源码解析
  4. 通过 Java 线程堆栈进行性能瓶颈分析
  5. grid布局合并单元格
  6. Struts2 Convention Plugin ( struts2 零配置 )
  7. Swoole源代码学习记录(十五)——Timer模块分析
  8. 第一百二十九天 how can I坚持
  9. 《Effective C++》item25:考虑写出一个不抛异常的swap函数
  10. 数据库毗连过多的错误,年夜概的启事分解及措置惩罚行动