一、初步认识和了解机器学习
-
机器学习的定义:为了解决任务T(task),设计一段程序,从经验E(experience)中学习,达到性能度量值P(prediction),当且仅当有了经验E后,经过P评判,程序在处理T时性能得到提升。
-
机器学习的分类:
-
机器学习的三要素:
I、模型:就是一个概率分布或者决策函数,所有可能的条件概率分布或者决策函数构成的集合就是假设空间(hypothesis space)。
II、策略:从假设空间中学习最优模型的方法,称为策略;衡量模型的好与坏需要一些指标,这时候引入损失函数和风险函数来衡量。由于预测值和真实值通常是不相等的,我们用损失函数(loss function)或者代价函数(cost function)来度量预测错误的程度。记作L(Y, f(x)).
R = 1 N ∑ i = 0 n L ( y i , f ( x i ) + λ J ( f ) R = \frac{1}{N} \sum_{i=0}^n L(y_{i}, f(x_{i}) + \lambda J(f) R=N1∑i=0nL(yi,f(xi)+λJ(f) (L为经验风险,J为结构风险)
III、算法:是指学习模型时具体计算方法,求解最优模型归结为一个最优化问题,统计学习的算法等价于求解最优化问题的算法,也就是求解或者数值解。
二、有监督学习(supervised learning)
定义:根据已有的数据集,知道输入和输出结果之间的关系。根据这种已知的关系,训练得到一个最优的模型。也就是说,在监督学习中训练数据既有特征(feature)又有标签(label),通过训练,让机器可以自己找到特征和标签之间的联系,在面对只有特征没有标签的数据时,可以判断出标签。
- 分类(Classification)------针对离散型变量,输出结果有限
生成模型(概率模型)
联合概率分布:假设有随机变量X、Y,此时
P
(
X
=
a
∩
X
=
b
)
P_{(X=a \cap X=b)}
P(X=a∩X=b)用于表示X=a且X=b的概率;
边际概率分布:
P
(
X
=
a
∪
X
=
b
)
P_{(X=a \cup X=b)}
P(X=a∪X=b)这类仅与单个随机变量有关的概率称为边缘概率。
特点
I、生成方法可以还原出联合概率分布
II、生成方法学习收敛速度快
III、可以适用存在隐变量的情形。
判别模型(非概率模型)
直接学习条件概率
P
(
Y
∣
X
)
P_{(Y|X)}
P(Y∣X),直接预测,准确率更高
公式补充
条件概率:事件A在事件B发生的条件下发生的概率,条件太累一般表示为
P
(
A
∣
B
)
P_{(A|B)}
P(A∣B),读作A给定B。
公式一:
P
(
A
∣
B
)
=
P
(
A
∩
B
)
P
(
B
)
或
P
(
B
∣
A
)
=
P
(
A
∩
B
)
P
(
A
)
P(A|B) = \frac{P(A \cap B)}{P(B)} 或P(B|A) = \frac{P(A \cap B)}{P(A)}
P(A∣B)=P(B)P(A∩B)或P(B∣A)=P(A)P(A∩B)
公式二:
P
(
A
∩
B
)
=
P
(
A
∣
B
)
P
(
B
)
=
P
(
B
∣
A
)
P
(
A
)
P(A \cap B) = P(A|B)P(B) = P(B|A)P(A)
P(A∩B)=P(A∣B)P(B)=P(B∣A)P(A)
贝叶斯公式:
P
(
A
∣
B
)
=
P
(
B
∣
A
)
P
(
A
)
P
(
B
)
或
P
(
A
∣
B
)
=
P
(
A
∣
B
)
P
(
B
)
P
(
A
)
P(A|B) = \frac{P(B|A)P(A)}{P(B)}或P(A|B) = \frac{P(A|B)P(B)}{P(A)}
P(A∣B)=P(B)P(B∣A)P(A)或P(A∣B)=P(A)P(A∣B)P(B)
以天冷感冒作为例子解释贝叶斯公式:
P(A|B)(先验概率):就是常识、经验所透露出的“因”的概率,这里就是天气冷的概率,当然先验还有伤、上火等等的概率。
P(A)(后验概率):就是在知道“果”之后,去推测“因”的概率,这里就是已知感冒了,推测是因为天气冷而导致的概率。
P(B|A)(似然函数):已知天冷,感冒的可能性有多大,当然也可以是已知伤风,感冒的可能性。
P(B)(证据):感冒发生的概率。
公式表示:
P
(
天
冷
∣
已
知
感
冒
)
=
P
(
感
冒
∣
天
冷
)
P
(
天
冷
)
P
(
感
冒
)
P(天冷|已知感冒) = \frac{P(感冒|天冷)P(天冷)}{P(感冒)}
P(天冷∣已知感冒)=P(感冒)P(感冒∣天冷)P(天冷)
- 回归(Regression)------针对的是连续型变量
理解:回归通俗一点就是,对已经存在的点(训练数据 )进行分析,拟合出适当的函数模型y=f(x),这里y就是数据的标签,而对于一个新的自变量x,通过这个函数模型得到标签y。
- 线性回归(Linear Regression)
h θ ( x ) = θ 0 + θ 1 x h_\theta(x) = \theta_0 +\theta_1x hθ(x)=θ0+θ1x
上图中,蓝色的直线是我们的假设函数,红色的点代表真实数据点;假设函数和红色点之间的绿线就是误差。
损失函数(代价函数)—
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
2
J(\theta_0, \theta_1) = \frac{1}{2m}\sum_{i=1}^m (h_\theta(x_i) - y_i)^2
J(θ0,θ1)=2m1∑i=1m(hθ(xi)−yi)2
为了让线性回归模型的预测更加准确,我们要让损失函数的值尽可能的小,这样假设函数就能更好的拟合实际数据,这时候就转化为一个求最小值的问题,我们引入一个算法,这是一个用来求函数最小值的算法:
梯度下降(Gradient Descent)算法
梯度下降背后的思路:
e
- 随机选择一个参数的组合( θ 0 , θ 1 , … , θ n \theta_0, \theta_1 ,…, \theta_n θ0,θ1,…,θn),计算代价函数
- 然后我们寻找下一个能让代价函数值最低的参数组合
- 持续这么做直到一个局部最小值(local minimum)
因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否是全局最小值(global minimum)
下降的
θ
1
=
θ
1
−
α
∂
J
(
θ
)
∂
θ
1
\theta_1 = \theta_1 - \alpha\frac{\partial J(\theta)}{\partial \theta_1}
θ1=θ1−α∂θ1∂J(θ)
- 对于 θ \theta θ赋值,使得 J ( θ ) J(\theta) J(θ)按梯度下降的方向进行,已知迭代下去,最终得到局部最小值。
- 其中 α \alpha α是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向下迈出的步子有多大。
利用python实现上述想法:
# 梯度下降求函数极值点的方法
# 梯度下降y = (x-2)^2的极值点
# 原理:因为位于极值点附近的时候导数(梯度)趋近于0,自变量的变化速度也会变小当自变量的更新前后的差值达到设定阈值的时候,停止迭代。
import numpy as np
# 原函数
def f(x):
return x**2-4*x+4
# 导数
def h(x):
return 2*x-4
a = 16
step = 0.1
count = 0
deta_a = 16
error_rate = 1e-10
# 设置循环
while deta_a > error_rate:
a = a-step*h(a)
deta_a = np.abs(deta_a-a)
count += 1
print("梯度下降迭代{}次,原始值为{},极值点为{}".format(count, a, f(a)))
print("迭代次数%d"%count)
运用梯度下降算法关键在于求出代价函数的导数,即:
∂
∂
θ
j
J
(
θ
0
,
θ
1
)
=
∂
∂
θ
j
1
2
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
2
\frac{\partial}{\partial \theta_j}J(\theta_0, \theta_1) = \frac{\partial}{\partial \theta_j} \frac{1}{2m}\sum_{i=1}^m(h_\theta(x_i)-y_i)^2
∂θj∂J(θ0,θ1)=∂θj∂2m1i=1∑m(hθ(xi)−yi)2
j
=
0
时
:
j=0时:
j=0时:
∂
∂
θ
j
J
(
θ
0
,
θ
1
)
=
1
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
\frac{\partial}{\partial \theta_j}J(\theta_0, \theta_1) =\frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i)
∂θj∂J(θ0,θ1)=m1i=1∑m(hθ(xi)−yi)
j
=
1
时
:
j=1时:
j=1时:
∂
∂
θ
j
J
(
θ
0
,
θ
1
)
=
1
m
∑
i
=
1
m
(
(
h
θ
(
x
i
)
−
y
i
)
⋅
x
i
)
\frac{\partial}{\partial \theta_j}J(\theta_0, \theta_1) =\frac{1}{m}\sum_{i=1}^m((h_\theta(x_i)-y_i)·x_i)
∂θj∂J(θ0,θ1)=m1i=1∑m((hθ(xi)−yi)⋅xi)
多变量时
类似于单变量,多变量回归分析也用一样的方法构建一个代价函数
J
(
θ
0
,
θ
1
,
…
,
θ
n
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
2
J(\theta_0, \theta_1,…,\theta_n) = \frac{1}{2m}\sum_{i=1}^m(h_\theta(x_i)-y_i)^2
J(θ0,θ1,…,θn)=2m1i=1∑m(hθ(xi)−yi)2
其中:
h
θ
(
x
)
=
θ
T
X
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
…
+
θ
n
x
n
h_\theta(x) = \theta^TX = \theta_0+\theta_1x_1+\theta_2x_2+…+\theta_nx_n
hθ(x)=θTX=θ0+θ1x1+θ2x2+…+θnxn
θ
1
=
θ
1
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
x
1
i
\theta_1 = \theta_1-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i)x_{1i}
θ1=θ1−αm1i=1∑m(hθ(xi)−yi)x1i
θ
2
=
θ
2
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
x
2
i
\theta_2 = \theta_2-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i)x_{2i}
θ2=θ2−αm1i=1∑m(hθ(xi)−yi)x2i
python代码
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))
梯度下降算法
1. 批量梯度下降(Batch Gradient Descent)
θ
0
=
θ
0
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
\theta_0 = \theta_0-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i)
θ0=θ0−αm1i=1∑m(hθ(xi)−yi)
θ
1
=
θ
1
−
α
1
m
∑
i
=
1
m
(
(
h
θ
(
x
i
)
−
y
i
)
⋅
x
i
)
\theta_1 = \theta_1-\alpha\frac{1}{m}\sum_{i=1}^m((h_\theta(x_i)-y_i)·x_i)
θ1=θ1−αm1i=1∑m((hθ(xi)−yi)⋅xi)
指的是在梯度下降的每一步,我们都用到了所有的训练样本,在梯度下降中,在计算微分时,我们需要进行求和运算,因此得名。
2. 随机梯度下降(Stochastic Gradient Descent)
θ
i
=
θ
i
−
α
(
(
h
θ
(
x
i
)
−
y
i
)
⋅
x
i
)
\theta_i = \theta_i - \alpha((h_\theta(x_i) - y_i)·x_i)
θi=θi−α((hθ(xi)−yi)⋅xi)
随机梯度下降法和批量梯度下降法是两个极端,批量梯度下降每次采用所有的数据集来梯度下降,而随机梯度下降每次用一个样本来梯度下降。
- 对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。
- 对于准确度来说,随机梯度下降法每次训练仅仅采用一个样本来决定梯度的方向,可能得到局部最小值而非全局最小值。
- 对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛道局部最优解。
3. 小批量梯度下降(Mini Batch Gradient Descent)
θ
1
=
θ
1
−
α
1
t
∑
i
=
1
t
(
(
h
θ
(
x
i
)
−
y
i
)
⋅
x
i
)
\theta_1 = \theta_1 - \alpha\frac{1}{t}\sum_{i=1}^t((h_\theta(x_i) - y_i)·x_i)
θ1=θ1−αt1i=1∑t((hθ(xi)−yi)⋅xi)
MBGD称为小批量梯度下降,每次迭代使用一个以上又不是全部的样本
- MBGD的有点:使用多个样本相比SGD提高了梯度估计的精度,小批量的估计,相当于在学习过程中加入了噪声,会有一些正则化的效果
- MBGD的缺点:同SGD一样,每次梯度估计的方向不确定,可能需要很长时间接近最小值点,不会收敛通常在使用MBGD之前先将数据集随机打乱,然后再划分Mini-batch,所以MBGD有时候也称为SGD.
- Mini-batch大小的选择通常使用2的幂数,可以获得更少的运行时间。
- .遍历完成所有数据,称为一个epoch,通常需要遍历几次epoch才行。
梯度下降算法调优
在使用梯度下降求极值时,涉及到的几个部分:
- 算法的步长(学习率)选择。可以多取一些值,从大到小,风别运行算法,看看迭代效果。
- 如果损失函数变小,说明取值有效,否则要增大步长;
- 步长太大,会导致迭代过快,甚至可能错过最优解;
- 步长太小,迭代速度太慢,很长时间算法都不能结束。
- 算法参数的初始值选择
- 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;
- 当然如果损失函数是凸函数则一定是最优解;
- 由于有局部最优解的风险,需要多次用不同的初始值运行算法
- 选择损失函数最小化的初值。
- 归一化,由于样本不同的特征的取值范围不一样,可能导致迭代很慢;为了减少特征取值的影响,可以对特征数据标准化或归一化:
x − x ‾ s t d ( x ) ( 标 准 化 ) 或 x − m i n m a x − m i n ( 归 一 化 ) \frac{x-\overline{x}}{std(x)}(标准化)或\frac{x-min}{max-min}(归一化) std(x)x−x(标准化)或max−minx−min(归一化)
这样特征的新期望为0,新方差为1,所有特征梯度下降幅度相近,不会造成震荡。
补充知识:
1. 凹函数
定义 设
f
(
x
)
f(x)
f(x)在区间
I
I
I上连续,如果对
I
I
I上任意两点
x
1
,
x
2
x_1, x_2
x1,x2恒有
f
(
x
1
+
x
2
2
)
<
f
(
x
1
)
+
f
(
x
2
)
2
f(\frac{x_1+x_2}{2}) < \frac{f(x_1)+f(x_2)}{2}
f(2x1+x2)<2f(x1)+f(x2)
那么称
f
(
x
)
f(x)
f(x)在
I
I
I上的图形是(向上)凹的(或凹弧);
2. 凸函数
定义 设
f
(
x
)
f(x)
f(x)在区间
I
I
I上连续,如果对
I
I
I上任意两点
x
1
,
x
2
x_1, x_2
x1,x2恒有
f
(
x
1
+
x
2
2
)
>
f
(
x
1
)
+
f
(
x
2
)
2
f(\frac{x_1+x_2}{2}) > \frac{f(x_1)+f(x_2)}{2}
f(2x1+x2)>2f(x1)+f(x2)
那么称
f
(
x
)
f(x)
f(x)在
I
I
I上的图形是(向上)凸的(或凸弧)。
定理
设
f
(
x
)
f(x)
f(x)在
[
a
,
b
]
[a, b]
[a,b]上连续,在
(
a
,
b
)
(a, b)
(a,b)内具有一阶和二阶导数,那么
(1) 若在
(
a
,
b
)
(a, b)
(a,b)内
f
′
′
(
x
)
>
0
f^{''}(x) > 0
f′′(x)>0,则
f
(
x
)
f(x)
f(x)在
[
a
,
b
]
[a, b]
[a,b]上的图形是凹的;
(2) 若在
(
a
,
b
)
(a, b)
(a,b)内
f
′
′
(
x
)
<
0
f^{''}(x) < 0
f′′(x)<0,则
f
(
x
)
f(x)
f(x)在
[
a
,
b
]
[a, b]
[a,b]上的图形是凸的.
性质
凹函数的任何极小值也是最小值,严格凹函数最多有一个最小值。
注意:中国大陆数学界某些机构关于函数凹凸性定义和国外的定义是相反的。Convex Function在某些中国大陆的数学书中指凹函数。Concave Function指凸函数。但在中国大陆涉及经济学的很多书中,凹凸性的提法和其他国家的提法是一致的,也就是和数学教材是反的。举个例子,同济大学高等数学教材对函数的凹凸性定义与本条目相反,本条目的凹凸性是指其上方图是凹集或凸集,而同济大学高等数学教材则是指其下方图是凹集或凸集,两者定义正好相反。 另外,也有些教材会把凸定义为上凸,凹定义为下凸。碰到的时候应该以教材中的那些定义为准。