2.2 补充梯度下降理解

from matplotlib import pyplot as plt
import numpy as np
from matplotlib.patches import Polygon

导数

引入

  • \(平均速度=\frac{位移}{时间}\)
plt.figure(figsize=(15,8),dpi=80)
x=np.linspace(0,10,num=100)
y=x**2
plt.plot(x,y)

plt.xlabel('t')
plt.ylabel('S')
x0=2
y0=4
plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5,color='y')
#plt.scatter([x0, ], [y0, ], s=50, color='r')

x1=8
y1=64
plt.plot([x1, x1,], [0, y1,], 'k--', linewidth=2,color='y')

xtick_labels = ['t','u']
plt.xticks([x0,x1],xtick_labels)
#plt.scatter([x0, ], [y0, ], s=50, color='r')
plt.annotate(s='(t,$f(t)$)',xy=(2,4) ,xycoords='data',xytext=(2,3), fontsize=12)
plt.annotate(s='(t,$f(t)$)',xy=(8,64) ,xycoords='data',xytext=(8,60), fontsize=12)
plt.text(3,40,r'$v=\frac{f(u)-f(t)}{u-t}$',fontdict={'size': 16, 'color': 'b'})
plt.show()

png

  • h=u-t
  • 当t与u无限接近时,h无限接近于0,即瞬时速度
plt.figure(figsize=(15,8),dpi=80)
x=np.arange(0,10,0.1)
y=x**2
plt.plot(x,y)



plt.xlabel('t')
plt.ylabel('S')
x0=2
y0=4
plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5,color='y')
#plt.scatter([x0, ], [y0, ], s=50, color='r')

x1=2.5
y1=2.5*2.5
plt.plot([x1, x1,], [0, y1,], 'k--', linewidth=2,color='y')

xtick_labels = ['x','x+h']
plt.xticks([x0,x1],xtick_labels)


x2=np.arange(0,10,0.1)
y2= 2*x
plt.plot(x2,y2,linestyle='--')

plt.text(3,40,r'$\lim_{x \to h}=\frac{f(x+h)-f(x)}{h}$',fontdict={'size': 16, 'color': 'b'})
plt.show()

png

\[f'(x)=\lim{\Delta x \to 0}\frac{f(x+\Delta x)-f(x)}{\Delta x}\]

  • \(\Delta x=x_新-x\)
  • \(\Delta y=y_新-y\)
    同理可得
    \[f'(x)=\lim{\Delta x \to 0}\frac{\Delta y}{\Delta x}\]

假设x小到以至于几乎注意不到,用\(dx\),表示x中十分微小得变化

偏导

一个多变量的函数的偏导数,就是它关于其中一个变量的导数而保持其他变量恒定(相对于全导数,在其中所有变量都允许变化)。偏导数在向量分析和微分几何中是很有用的。

例子
圆锥的体积\(V(r,h)=\frac{r^2\pi h }{3}\)

  • \(\frac{\partial V}{\partial r}=\frac{2 \pi r h }{3}\) 高度固定,体积变化率
  • \(\frac{\partial V}{\partial r}=\frac{\pi r ^2 }{3}\) 半径固定,体积变化率

微分

求和

plt.figure(figsize=(15,8),dpi=80)
x=np.arange(0,12,3)
y=x**2
plt.bar(x,y,width=4)

xtick_labels = ['t{}'.format(i) for i in x]
plt.xticks(x,xtick_labels)
plt.xlabel('t')
plt.ylabel('v')
plt.show()

png

\[总位移=\sum_{j=1}^{n}v_j(t_j-t{j-1})\]

积分

考虑v是t得连续函数时

plt.figure(figsize=(15,8),dpi=80)
x=np.arange(0,10,1)
y=x**2

plt.plot(x,y)
plt.bar(x,y,width=1,alpha=0.3,color='g')

xtick_labels = ['t{}'.format(i) for i in x]
plt.xticks(x,xtick_labels)
plt.xlabel('t')
plt.ylabel('v')


x0=4.5
y0=25
plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2,color='r')
#plt.scatter([x0, ], [y0, ], s=50, color='r')

x1=5.5
y1=25
plt.plot([x1, x1,], [0, y1,], 'k--', linewidth=2,color='r')

x2=5
y2=25
plt.plot([x2, x2,], [0, y2,], 'k--', linewidth=3,color='r')

plt.annotate(s='p',xy=(4.5,0) ,xycoords='data',xytext=(4.5,-3), fontsize=12,color='r')
plt.annotate(s='q',xy=(5.5,0) ,xycoords='data',xytext=(5.5,-3), fontsize=12,color='r')
plt.annotate(s='c',xy=(5,25) ,xycoords='data',xytext=(5,30), fontsize=12,color='r')


plt.text(3,40,r'$S\approx\sum_{j=1}^n{v(c_j)(t_j-t_{j-1})}$',fontdict={'size': 16, 'color': 'y'})
plt.show()

png

定义

\[\int_a^bf(x)\mathrm{d}x\]

  • 函数从a到b的积分
  • a,b为积分极限
  • \(dx\)说明水平轴的变量

\[\int_a^bf(x)\mathrm{d}x=\lim_{mesh \to 0}\sum_{j=1}^n{v(c_j)(t_j-t_{j-1})}\]

  • \(c_j\)为\(x_1,x_2\)区间内任意值
  • mesh表示\((x_1-x_0)\),\((x_2-x_1)\)间隔值

区分:

位移:\(\int_a^b v(t)\mathrm{d}x\)

路程:\(\int_a^b |v(t)|\mathrm{d}x\)

计算

def f(x):
    return np.exp(x*x)
x=np.linspace(0,3,num=100)
fig,ax=plt.subplots(figsize=(10,5))#绘制8*5的图形
plt.plot(x,f(x))
a,b=0,2#积分域0到1
ix=np.linspace(a,b)
iy=f(ix)
verts=[(a,0)]+list(zip(ix,iy))+[(b,0)]#表示积分的区域
#使用Polygon函数填充,表面颜色是0.7,边沿颜色是0.5
poly=Polygon(verts,facecolor='0.7',edgecolor='0.5')
ax.add_patch(poly)#将填充面积添加到图表里
plt.text(0.5*(a+b),1,r'$\int_'+str(a)+'^'+str(b)+' f(x)\mathrm{d}x$',horizontalalignment='center',fontsize=20)
#添加LaTex的标量名称需要用2个$符号包含在内才行,这标明是积分,水平居中对齐,坐标是(0.5,1),字体20
plt.xlabel('$x$')
plt.ylabel('$f(x)=x^2$')
ax.set_xticks((a,b))#x轴刻度位置
ax.set_xticklabels(('$'+str(a)+'$','$'+str(b)+'$'))#内容
plt.show()

png

  • 在[0,2]区间内等分成n份
    此时:
    \[[x_{j-1},x_j]=[\frac{2(j-1)}{n},\frac{2j}{n}]\]
    \[c_j=x_j=\frac{2j}{n}\]

\[\int_0^2 x^2\mathrm{d}x=\lim_{最大区间 \to 0}\sum_{j=1}^n f(j)(x_j-x_{j-1} )=\lim_{n \to \infty}\frac{4(n+1)(2n+1)}{3n^2} =\frac{8}{3}\]

梯度

(多变微分的一般化)

\[J(\Theta)=5\theta_1+2\theta_2-12\theta_3\]

\[\nabla J(\Theta)=<\frac{\partial J}{\partial \theta_1},\frac{\partial J}{\partial \theta_2},\frac{\partial J}{\partial \theta_3}>=<5,2,-12>\]

  • 单变量梯度:函数的微分,即斜率
  • 多变量梯度: 向量,指出函数给定点上升最快的方向
  • \[\nabla f(a)\]称点a的梯度,向量场

梯度下降法

\[\theta_1=\theta_0-\alpha \nabla J(\Theta)\]

  • J是关于\(\theta\)的函数
  • 初始位置为\(\theta_0\)
  • 从该点出发走到最低点(反梯度方向)
  • \(\alpha\)为步长,学习率

梯度下降法求解线性回归

代价函数
\[J(\Theta)=\frac{1}{2m}\sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2\]

  • $\frac{1}{2}\(用于抵消常量
    \)\(h_{\theta}(x^{(i)})=\theta_0+\theta_1 x^{(i)}\)$

得到代价函数:

\[J(\Theta)=\frac{1}{2m}\sum_{i=1}^m(\theta_0+\theta_1 x^{(i)}-y^{(i)})^2\]

\[\theta_0:\frac{\partial J}{\partial \theta_0}\frac{1}{m}\sum_{i=1}^m(\theta_0+\theta_1 x^{(i)}-y^{(i)})\]
\[\theta_1:\frac{\partial J}{\partial \theta_1}\frac{1}{m}\sum_{i=1}^m(\theta_0+\theta_1 x^{(i)}-y^{(i)})*x^{(i)}\]

x_train = np.array([[2.5], [3.5], [6.3], [9.9], [9.91], [8.02],
                    [4.5], [5.5], [6.23], [7.923], [2.941], [5.02],
                    [6.34], [7.543], [7.546], [8.744], [9.674], [9.643],
                    [5.33], [5.31], [6.78], [1.01], [9.68],
                    [9.99], [3.54], [6.89], [10.9]], dtype=np.float32)

y_train = np.array([[3.34], [3.86], [5.63], [7.78], [10.6453], [8.43],
                    [4.75], [5.345], [6.546], [7.5754], [2.35654], [5.43646],
                    [6.6443], [7.64534], [7.546], [8.7457], [9.6464], [9.74643],
                    [6.32], [6.42], [6.1243], [1.088], [10.342],
                    [9.24], [4.22], [5.44], [9.33]], dtype=np.float32)

y_data = np.array([[2.5], [3.5], [6.3], [9.9], [9.91], [8.02],
                    [4.5], [5.5], [6.23], [7.923], [2.941], [5.02],
                    [6.34], [7.543], [7.546], [8.744], [9.674], [9.643],
                    [5.33], [5.31], [6.78], [1.01], [9.68],
                    [9.99], [3.54], [6.89], [10.9]], dtype=np.float32)

plt.plot(x_train, y_train, 'bo',label='real')
plt.plot(x_train, y_data, 'r-',label='estimated')
plt.show()

png

2020/02/21 posted in  吴恩达_机器学习

1.1 机器学习

机器学习的应用

  • 数据库挖掘。机器学习被用于数据挖掘的原因之一是网络和自动化技术的增长,这意味着,我们有史上最大的数据集比如说,大量的硅谷公司正在收集web上的单击数据,也称为点击流数据,并尝试使用机器学习算法来分析数据,更好的了解用户,并为用户提供更好的服务。这在硅谷有巨大的市场。再比如,医疗记录。随着自动化的出现,我们现在有了电子医疗记录。如果我们可以把医疗记录变成医学知识,我们就可以更好地理解疾病。再如,
  • 计算生物学。还是因为自动化技术,生物学家们收集的大量基因数据序列、DNA序列和等等,机器运行算法让我们更好地了解人类基因组,大家都知道这对人类意味着什么。再比如,工程方面,在工程的所有领域,我们有越来越大、越来越大的数据集,我们试图使用学习算法,来理解这些数据。另外,
  • 机械应用。有些人不能直接操作。例如,我已经在无人直升机领域工作了许多年。我们不知道如何写一段程序让直升机自己飞。我们唯一能做的就是让计算机自己学习如何驾驶直升机。
  • 手写识别。现在我们能够非常便宜地把信寄到这个美国甚至全世界的原因之一就是当你写一个像这样的信封,一种学习算法已经学会如何读你信封,它可以自动选择路径,所以我们只需要花几个美分把这封信寄到数千英里外。

机器学习

在机器学习的历史上,一共出现了两种定义。

  • 1956 年,开发了西洋跳棋 AI 程序的 Arthur Samuel 在标志着人工智能学科诞生的达特茅斯会议上定义了 “机器学习” 这个词,定义为,“在没有明确设置的情况下,使计算机具有学习能力的研究领域”。

  • 1997 年,Tom Mitchell 提供了一个更现代的定义:“如果用 P 来测量程序在任务 T 中性能。若一个程序通过利用经验 E 在 T 任务中获得了性能改善,则我们就说关于任务 T 和 性能测量 P ,该程序对经验 E 进行了学习。”

例如:玩跳棋。

E = 玩很多盘跳棋游戏的经验

T = 玩跳棋的任务。

P = 程序将赢得下一场比赛的概率。

分类

一般来说,任何机器学习问题都可以分配到两大类中的一个:

有监督学习 supervised learning 和无监督学习 unsupervised learning。

简单的说,监督学习就是我们教计算机去做某件事情,无监督学习是我们让计算机自己学习。

img

监督学习

在监督式学习中,首先有一个数据集,并且已知正确的输出是什么,且输入和输出存在关联。 监督学习问题分为“回归 Regression”和“分类 Classification”问题。

在回归问题中,我们试图预测连续输出中的结果,这意味着我们试图将输入变量映射到某个连续函数。例如给定一个人的照片,根据照片预测年龄,这就是一个回归的问题。

img

在分类问题中,我们试图预测离散输出中的结果。换句话说,我们试图将输入变量映射到离散类别中。例如给予患有肿瘤的患者,我们必须预测肿瘤是恶性的还是良性的。

img

无监督学习

无监督学习使我们能够很少或根本不知道我们的结果应该是什么样子。我们可以从数据中得出结构,我们不一定知道变量的影响。 我们可以通过基于数据中变量之间的关系对数据进行聚类来推导出这种结构。 在无监督学习的情况下,没有基于预测结果的反馈。无监督学习可以分为“聚类”和“非聚类”。

聚类:获取1,000,000个不同基因的集合,并找到一种方法将这些基因自动分组成不同变量的相似或相关的组,例如寿命,位置,角色等。

img

非聚类:“鸡尾酒会算法”,允许您在混乱的环境中查找结果。 (即在鸡尾酒会上识别来自声音网格的个人声音和音乐)。

2020/02/21 posted in  吴恩达_机器学习

2.1 单变量线性回归(Linear Regression with One Variable)

在给定训练集的情况下,学习函数h:X→Y,使得h(x)是y的相应值的“好”预测器。由于历史原因,这个函数h被称为假设。

img

通过输入住房面积 x,通过学习好的函数,输出房子的估价。

代价函数

代价函数是线性回归中的一个应用,在线性回归中,要解决的一个问题就是最小化问题。

假设在一元线性回归中,在一个训练集中,我们需要找到一条直线能和该训练集中的点最接近。假设直线方程为

\[h_{\theta}(x) = \theta_{0} + \theta_{1}x\]

如何选择 \(\theta_{0}\)、\(\theta_{1}\),使得 \(h_{\theta}(x)\) 更接近于训练集 (x,y) ?

上述问题可以转换为求

\[ \rm{CostFunction} = \rm{F}({\theta_{0}},{\theta_{1}}) = \frac{1}{2m}\sum_{i = 1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})^2 \]

求最小值\[\min_{{\theta_{0}} {\theta_{1}}} \rm{F}({\theta_{0},{\theta_{1}})} \]

代价函数的直观理解I

令\(\theta_0\)=0时,求出不同\(\theta_1\)下代价函数的值

img

代价函数的直观理解II

img

梯度下降法补充知识

梯度下降

梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数\(J(\theta_0,\theta_1)\)的最小值。

have some function : \(J(\theta_0,\theta_1)\)

want : \(\min_{{\theta_{0}} {\theta_{1}}} J(\theta_0,\theta_1)\)

outline :

  • 初始化 \({\theta_{0}}\) 和 \({\theta_{1}}\) , \({\theta_{0}}\) = 0 , \({\theta_{1}}\) = 0
  • 不断的改变 \({\theta_{0}}\) 和 \({\theta_{1}}\) 值,不断减少 \(F({\theta_{0}},{\theta_{1}})\) 直至达到最小值(或者局部最小)。

img

想象成下山,如何下山的速度最快?这里涉及到了下山的速度,即步长。

repeat until convergence\[ \{\theta_j:=\theta_j-{\alpha}\frac{\partial }{\partial {\theta_{0}}}J(\theta_0,\theta_1) (for \quad j=o\quad and\quad j=1) \}\]

  • := 赋值
  • \(\alpha\) 被称作为学习速率,\(\alpha\)值大,下山的步伐大
  • 更新等式,需要同时更新\(\theta_0,\theta_1\)

更新实现方法:

\[ {\begin{align*}\rm{temp}0&:= {\theta_{0}}\alpha *\frac{\partial }{\partial {\theta_{0}\rm{F}({\theta_{0}},{\theta_{1}}) \\\rm{temp}1 &:= {\theta_{1}} \alpha *\frac{\partial }{\partial {\theta_{1}\rm{F}({\theta_{0}},{\theta_{1}}) \\{\theta_{0}} &:= \rm{temp}0 \\{\theta_{1}} &:= \rm{temp}1 \\\end{align*} }\]

直到收敛。注意 \({\theta_{0}}\) 和 \({\theta_{1}}\) 值要同时更新切记不要求一次导更新一次!

如果 \(\alpha\) 被设置的很小,需要很多次循环才能到底最低点。
如果 \(\alpha\) 被设置的很大,来来回回可能就会离最低点越来越远,会导致无法收敛,甚至发散

当快要到最低点的时候,梯度下降会越来越慢,因为 \( \frac{\partial }{\partial {\theta}}\) 越来越小。

梯度下降的直观理解

\[\theta_j:=\theta_j-\alpha{\frac{\partial}{\partial{\theta_j}}J(\theta_0,\theta_1)}\]

简化模型:

  • \(min_{\theta_0} J(\theta_1)\)
  • \(\theta_1 \in \R\)

img

  • 导数求切线斜率
  • 此时\(\theta_1\)减去一个大于0的斜率,\(\theta_1\)左移
  • 假设你将初始化\(\theta_1\)在局部最低点已经在一个局部的最优处或局部最低点。结果是局部最优点的导数将等于零,\(\theta_1\)不变

\(\alpha\)

  • 太小速度会很慢
  • 太大会超过最小值

IMG_2889

例:

img

::越接近最小值,下降的斜率越低,下降速度越慢::

2020/02/21 posted in  吴恩达_机器学习