machine_learning
最优化理论试图解决多元化、非线性的问题。最早的优化方法是线性规划。
最优化理论三个重要基础:
解决最优化问题需要三种能力:
最优化:在给定约束条件下寻求某些量,使得某些量达到最优。
凸集定义
设,是凸集,当且仅当:
如果一个集合是凸集,那么任意两个点连线上任意一点也位于该集合中。
超平面定义
c为系数向量,z是标量,集合X为超平面。
超平面能把凸集分为两部分和
支撑超平面:过凸集的一个边界点,使得凸集所有点都位于超平面的一侧
凸集分离定理
设,如果存在非零向量以及,使得
分离定理为机器学习的分类问题提供理论依据。带有不同标签的训练集是凸集,分隔它们的平面就是线性分类器。
若定义某个向量空间的凸子集上的函数,对于任意两点以及,都有
凸函数的判定:
1. 若是凸函数,则也是凸函数。
2. 若是凸集上的凸函数,则和也是上的凸函数。
3. 设在凸集上可微,则为凸函数的充要条件是,对任意的都有
常用凸函数:
凸函数的性质:
机器学习使用最优化方法的目标函数几乎都是凸函数。无法转化为凸函数的优化问题用穷举法或者一些随机优化方法解决。
自动机常指基于状态变化进行迭代的算法。
确定性:根据输入和当前状态,自动机的状态转移是唯一确定的。
程序下一步的结果是唯一的,返回的结果是唯一的。
非确定性:在每一时刻有多种状态可供选择,并尝试执行每个可选择状态。
运行时每个执行路径是并行的,所有路径都可能返回结果;只要有一个路径返回结果,算法就结束。
在求解最优化问题时,非确定性算法可能陷入局部最优,不一定是全局最优。
P类问题:能够以多项式时间的确定性算法对问题进行判定或求解。
NP类问题:用多项式时间的非确定性算法来判定或求解
NP-complete问题:至今没有找到多项式时间的算法
典型的NP类问题:
针对大型稀疏矩阵方程组
将原方程化为等价形式
从泰勒公式推导出牛顿迭代法(牛顿切线法):
定理:设在[a,b]中有二阶连续导数,且满足条件
(1)
(2) 在(a,b)保号
(3) 在(a,b)保号
取(a,b)中满足的一点, 以它为初值的牛顿迭代过程产生的序列单调收敛于方程在[a,b]中的唯一解。
对于矩阵方程,使用迭代法
迭代法收敛的条件是,存在
def iteration_solve(B0,f):
# assert(column of B0==row of f)
error = 1.0e-6
steps = 100
r,n = shape(B0)
xk = np.zeros([n,1])
errorlist = []
for k in range(steps):
xk1 = xk
xk = B0 * xk + f
errorlist.append(np.linalg.norm(xk-xk1))
if errorlist[-1] < error:
print(k+1)
break
return xk, errorlist
问题: 如果目标函数是非线性的,误差往哪个方向下降最快?
函数导数的方向,多元微积分中的梯度。
求解无约束多元函数值极值的数值方法
沿梯度方向向量值函数变化速率最快
为了求取的极小值,任取一个点,设为第k次迭代时的步长
把代表训练集的两个互不相交的凸集的子集分开的支撑超平面,如果是一个n维的线性方程,就称为线性分类器。
也是最早得到神经网络模型,叫感知器模型。
感知器 = 算法框架 + 激活函数
Logistic函数:
若输出标签Y为{0,1},令,那么,
假设样本集之间互相独立,它们的联合分布可以表示为各边际分布的乘积。用似然函数表示
对w求偏导
输入:自带分类标签的样本矩阵
预处理:提取classLabel,归一化,插入第一列(?)
调参数:迭代次数steps,梯度下降的步长
初始化:权重向量全0
训练分类器:当前结果与分类标签比对,生成误差向量: error = classLabel - logistic,通过迭代修正误差
weights = np.ones([n,1])
for k in range(steps):
gradient = dataMatrix * mat(weights)
output = logistic(gradient)
errors = classLabels - output
weights = weights + alpha * dataMatrix.T * errors
权重向量代表分隔空间的超平面。超平面的方程由权重向量决定。
其实这只是一种回归???
算法分析:
考察超平面的各参数或者权重向量的各分量是否达到“平稳”,若否,需要增加迭代次数。(或优化模型)
问题:步长取值如何平衡收敛速度和精度的矛盾?
引入随即样本抽取方式,提供动态步长取值,平衡精度和收敛速度
i是迭代次数,j是抽取次数,2与样本均值相关。
改矢量编程为标量编程,用效率的降低换取迭代次数的显著下降
for j in range(steps):
index = range(rowsNum)
for i in range(rowNum):
# step length is changed with i and j
alpha = 2/(1.0+i+j)+0.0001
# select an index randomly
randIndex = int(random.uniform(0,len(index)))
vecSum = sum(dataMatrix[randIndex]*weights.T)
grad = logistic(vecSum)
errors = classLabel[randIndex] - grad
weights = weights + alpha * errors * dataMatrix[randIndex]
del(index[randIndex])
怎样选择alpha?靠经验
算法评估:
超平面的参数、权重向量各分量可能经历震荡,然后平稳。迭代次数相比原来较小。
输入层、隐含层、输出层
输入向量、连接权值、输出向量、激活函数
正向传播过程
误差反向传播
修正各层权值
神经网络设计
1. 误差容限与最大迭代次数:实际分类与期望分类的误差平方和小于某个数时或超出最大迭代次数时,收敛。
2. 学习率:权值调整的步长
3. 动量因子:分配t时刻与t-1时刻的梯度值,帮助滑过局部最小值
设计复杂,难以调优,收敛慢
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)
Self-Organizing Feature Map
解决模式识别问题,无监督学习算法,类似不提供聚类数量的KMeans
基本思想:距离小的划分一类,距离大的划分为不同类。
构成:
输入层网络、输出层网络(线阵、平面阵或者栅格阵)、权重节点
学习率(随迭代次数增加而收敛)、聚类半径(动态收缩)
算法流程:
1. 计算本次迭代的学习率和聚类半径,从训练集中随机挑选一个样本
2. 找出训练集中与此样本距离最小的其他样本
3. 根据两个样本点计算出聚类的邻域,找出邻域内所有节点
4. 调整权重
5. 循环迭代
借鉴模拟退火思想,在神经网络中引入随机机制,能够跳出局部最小值,使用玻尔兹曼分布作为激活函数。
是系统各种可能的状态的一种概率分布或粒子频度分布
F(state)正比于e^{-\frac E {kT}}
玻尔兹曼因子:系统两种状态间的玻尔兹曼分布的比率
{F(state1)\over F(state2)} = e^{-{{E_1-E_2}\over {kT}}}
八、预测
线性回归、最小二乘法
矩阵形式求解Y = XA得到
A = (X^TX)^{-1}X^TY
非线性、曲面拟合
泰勒展开式说明任意形状的非线性曲线可以用多项式来拟合。
径向基函数法:Radical Basic Function 高斯函数
用于任意维度的离散或连续变量的插值和拟合
RBF神经网络使用径向基函数作为激活函数
在隐含层根据欧式距离进行曲线拟合?
y_j = \sum_{i=1}^nw_{ij}e^{-\frac 1 {2M} |x_p-c_i|^2}
岭回归
如果矩阵的随机变量之间存在多重共线性,那么X^TX的行列式约等于0,无法用最小二乘法
给X^TX加一个参数矩阵kI,I是单位阵
定义A(k) = (X^TX+kI)^{-1}X^TY
混沌