ML algorithm and practice(Advanced)

machine_learning

六、梯度寻优

6.1 最优化与计算复杂性

最优化理论试图解决多元化、非线性的问题。最早的优化方法是线性规划。
最优化理论三个重要基础:

解决最优化问题需要三种能力:

最优化:在给定约束条件下寻求某些量,使得某些量达到最优。


x为决策变量,为目标函数或cost function。
最优化问题分为:
线性规划(都是线性函数)
非线性规划(至少有一个是非线性函数)
二次规划(目标函数为二次,约束函数为线性)
多目标规划(目标函数是向量函数)等等

6.2 凸集与分离定理

  1. 凸集定义
    是凸集,当且仅当:

    如果一个集合是凸集,那么任意两个点连线上任意一点也位于该集合中。

  2. 超平面定义

    c为系数向量,z是标量,集合X为超平面。
    超平面能把凸集分为两部分
    支撑超平面:过凸集的一个边界点,使得凸集所有点都位于超平面的一侧

  3. 凸集分离定理
    ,如果存在非零向量以及,使得


    则称超平面分离了集合.

分离定理为机器学习的分类问题提供理论依据。带有不同标签的训练集是凸集,分隔它们的平面就是线性分类器。

6.3 凸函数

若定义某个向量空间的凸子集上的函数,对于任意两点以及,都有


则函数是凸函数。
任意两点的线性组合的函数值小于任意两点函数值的线性组合。
因为凸集元素可以是离散的,所以凸函数不要求连续。

凸函数的判定:
1. 若是凸函数,则也是凸函数
2. 若是凸集上的凸函数,则也是上的凸函数。
3. 设在凸集上可微,则为凸函数的充要条件是,对任意的都有

其中
4. 设在开凸集内,二阶可微,则的凸函数的充要条件是,对任意的的hesse矩阵半正定。

常用凸函数:

凸函数的性质:

机器学习使用最优化方法的目标函数几乎都是凸函数。无法转化为凸函数的优化问题用穷举法或者一些随机优化方法解决。

6.4 计算复杂性

自动机常指基于状态变化进行迭代的算法。

确定性:根据输入和当前状态,自动机的状态转移是唯一确定的。
程序下一步的结果是唯一的,返回的结果是唯一的。

非确定性:在每一时刻有多种状态可供选择,并尝试执行每个可选择状态。
运行时每个执行路径是并行的,所有路径都可能返回结果;只要有一个路径返回结果,算法就结束。
在求解最优化问题时,非确定性算法可能陷入局部最优,不一定是全局最优。

P类问题:能够以多项式时间的确定性算法对问题进行判定或求解。
NP类问题:用多项式时间的非确定性算法来判定或求解
NP-complete问题:至今没有找到多项式时间的算法

典型的NP类问题:

6.5 迭代法解方程组

针对大型稀疏矩阵方程组

将原方程化为等价形式

取一个初值,按照产生序列。这样的计算过程成为迭代。
迭代过程中,根据相邻两次迭代值是否满足精度要求,决定迭代是否继续。

从泰勒公式推导出牛顿迭代法(牛顿切线法):

切线法收敛速度为平方。
如果求导不容易,可以考虑割线法,收敛速度为黄金1.618。用代替

定理:设在[a,b]中有二阶连续导数,且满足条件
(1)
(2) 在(a,b)保号
(3) 在(a,b)保号
取(a,b)中满足的一点, 以它为初值的牛顿迭代过程产生的序列单调收敛于方程在[a,b]中的唯一解。

对于矩阵方程,使用迭代法
迭代法收敛的条件是,存在

  1. def iteration_solve(B0,f):
  2. # assert(column of B0==row of f)
  3. error = 1.0e-6
  4. steps = 100
  5. r,n = shape(B0)
  6. xk = np.zeros([n,1])
  7. errorlist = []
  8. for k in range(steps):
  9. xk1 = xk
  10. xk = B0 * xk + f
  11. errorlist.append(np.linalg.norm(xk-xk1))
  12. if errorlist[-1] < error:
  13. print(k+1)
  14. break
  15. return xk, errorlist

问题: 如果目标函数是非线性的,误差往哪个方向下降最快?
函数导数的方向,多元微积分中的梯度。

6.6 Logistic梯度下降法

1. 梯度下降法

求解无约束多元函数值极值的数值方法
沿梯度方向向量值函数变化速率最快
为了求取的极小值,任取一个点,设为第k次迭代时的步长


产生序列,收敛于极小值。
的选择影响算法收敛速度。过小会很慢,过大会发散。

2. 线性分类器

把代表训练集的两个互不相交的凸集的子集分开的支撑超平面,如果是一个n维的线性方程,就称为线性分类器
也是最早得到神经网络模型,叫感知器模型。
感知器 = 算法框架 + 激活函数

Logistic函数:


是凸函数,局部最优就是全局最优。

若输出标签Y为{0,1},令,那么,


为什么权重乘样本矩阵是梯度???

假设样本集之间互相独立,它们的联合分布可以表示为各边际分布的乘积。用似然函数表示


取对数似然函数

这是线性分类器的目标函数,以权重向量w为自变量

对w求偏导


就是误差函数error = classLabel - logistic

3. 算法流程

输入:自带分类标签的样本矩阵
预处理:提取classLabel,归一化,插入第一列(?)
调参数:迭代次数steps,梯度下降的步长
初始化:权重向量全0
训练分类器:当前结果与分类标签比对,生成误差向量: error = classLabel - logistic,通过迭代修正误差


输出:权重向量,作为分类器的参数

  1. weights = np.ones([n,1])
  2. for k in range(steps):
  3. gradient = dataMatrix * mat(weights)
  4. output = logistic(gradient)
  5. errors = classLabels - output
  6. weights = weights + alpha * dataMatrix.T * errors

权重向量代表分隔空间的超平面。超平面的方程由权重向量决定。

其实这只是一种回归???

算法分析:
考察超平面的各参数或者权重向量的各分量是否达到“平稳”,若否,需要增加迭代次数。(或优化模型)

问题:步长取值如何平衡收敛速度和精度的矛盾?

6.7 随机梯度下降法

引入随即样本抽取方式,提供动态步长取值,平衡精度和收敛速度

i是迭代次数,j是抽取次数,2与样本均值相关。
改矢量编程为标量编程,用效率的降低换取迭代次数的显著下降

  1. for j in range(steps):
  2. index = range(rowsNum)
  3. for i in range(rowNum):
  4. # step length is changed with i and j
  5. alpha = 2/(1.0+i+j)+0.0001
  6. # select an index randomly
  7. randIndex = int(random.uniform(0,len(index)))
  8. vecSum = sum(dataMatrix[randIndex]*weights.T)
  9. grad = logistic(vecSum)
  10. errors = classLabel[randIndex] - grad
  11. weights = weights + alpha * errors * dataMatrix[randIndex]
  12. del(index[randIndex])

怎样选择alpha?靠经验

算法评估:
超平面的参数、权重向量各分量可能经历震荡,然后平稳。迭代次数相比原来较小。

七、神经网络

BP神经网络理论

输入层、隐含层、输出层
输入向量、连接权值、输出向量、激活函数

神经网络设计
1. 误差容限与最大迭代次数:实际分类与期望分类的误差平方和小于某个数时或超出最大迭代次数时,收敛。
2. 学习率:权值调整的步长
3. 动量因子:分配t时刻与t-1时刻的梯度值,帮助滑过局部最小值


4. 隐含层设计:

评估

设计复杂,难以调优,收敛慢

A neural network is like asking a crowd for their answer. Each person's answer to the question is like the theta_ij parameter. (single hidden layer). With more hidden layers, each hidden layer of the crowd gets more sophisticated in how they answer the question.
After you ask the question, you review the question and reweigh everyone's response based on how close they are to the right answer. The more right they are, the more you trust that person. (Cost function for each Theta_ij)
You make adjustments to how you listen to the crowd by going from the answer you get from the last person in line (the nth hidden layer) and slowly working your way backwards to a simplier response, all the while critiquing the answer you get from each person. (Backwards propagation).
Finally, actual implementation of how you do this means you need to juggle a lot of information. You need to make sure you are critiquing the right people and not just going around aimlessly (gradient checking). As well, you need to optimize how quickly you are processing information because you are asking a lot of questions (training set) and need to be able to rely on people in real time (optimization algorithms and disabling gradient checking)

自组织特征映射神经网络SOM

Self-Organizing Feature Map
解决模式识别问题,无监督学习算法,类似不提供聚类数量的KMeans
基本思想:距离小的划分一类,距离大的划分为不同类。
构成:
输入层网络、输出层网络(线阵、平面阵或者栅格阵)、权重节点
学习率(随迭代次数增加而收敛)、聚类半径(动态收缩)

算法流程:
1. 计算本次迭代的学习率和聚类半径,从训练集中随机挑选一个样本
2. 找出训练集中与此样本距离最小的其他样本
3. 根据两个样本点计算出聚类的邻域,找出邻域内所有节点
4. 调整权重
5. 循环迭代

Boltzmann机算法

借鉴模拟退火思想,在神经网络中引入随机机制,能够跳出局部最小值,使用玻尔兹曼分布作为激活函数。

玻尔兹曼分布

是系统各种可能的状态的一种概率分布或粒子频度分布
F(state)正比于e^{-\frac E {kT}}


E是状态能量,k是玻尔兹曼常数,T是热力学温度。

玻尔兹曼因子:系统两种状态间的玻尔兹曼分布的比率
{F(state1)\over F(state2)} = e^{-{{E_1-E_2}\over {kT}}}


基于逻辑斯特的概率分布
{P(Y=1|X)\over P(Y=0|X) }= e^{\frac {w^TX} t}

两者形式相似
t是类似温度的控制参数,t越大逻辑斯特曲线越平缓,t越小曲线越陡峭。
初始温度选得足够高,保证存在所有可能解。
降温策略有两种:

八、预测