前言 https://github.com/Aron00123/Statistical-Learning-Methods-Codes.git 
感知机 感知机的学习算法 
输入 :训练数据集
输出 :w,b;感知机模型
(1)选取初值
(2)在训练集中选取数据
(3)若
(4)转至(2),直至训练机中没有误分类点。
输入 :训练数据集
输出 :
(1)
(2)在训练集中选取数据
(3)如果
(4)转至(2)直到没有误分类数据。
K邻近算法 算法内容 
输入 :训练数据集
输出 :实例x所属的类y。
(1)根据给定的距离度量,在训练集T中找出与x最邻近的k个点,涵盖这k个点的x的邻域记作
(2)在
其中I为指示函数,当
kd树 
输入 :k维空间数据集
输出 :kd树;
(1)构造根结点,根结点对应于包含T的k维空间的超矩形区域。选择
(2)对深度为j的点,选择
(3)直到两个字区域没有实例存在时停止,从而形成kd树划分。
输入 :已构造的kd树,目标点x;
输出 :x的最近邻。
(1)在kd树中找出包含目标点x的叶结点:从根结点出发,递归地向下访问kd树。若目标点x当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点。直到子结点为叶结点为止;
(2)以此叶结点为“当前最近点”;
(3)递归地向上回退,在每个结点进行以下操作:
(a)若该结点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”;
(b)当前最近点一定存在于该结点的一个子结点对应的区域。检查该子结点的父结点的另一子结点对应的区域是否有更近的点。具体地,检查另一子结点对应的区域是否与以目标点为球心,以目标点与“但前最近点”的距离为半径的超球体相交。若相交,则移动到另一个子结点递归地进行最近邻搜索;若不相交,则向上回退;
(4)回退至根结点时,搜索结束。最后的“当前最近点”即为x的最近邻点。
朴素贝叶斯法 
输入 :训练数据
输出 :实例x的分类;
(1)计算先验概率及条件概率
(2)对于给定的实例
(3)确定实例x的类
决策树 
特征选择 
输入 :训练数据集D和特征A;
输出 :特征A对训练数据集D的信息增益
(1)计算数据集D的经验熵
(2)计算特征A对数据集D的经验条件熵
(3)计算信息增益
通常根据信息增益准则选择最佳特征,即选择信息增益最大的特征。
其中,
生成决策树 
输入 :训练数据集D,特征集A阈值
输出 :决策树T;
(1)若D中所有实例属于同一类
(2)若
(3)否则,计算A中各特征对D的信息增益,选择信息增益最大的特征
(4)如果
(5)否则,对
(6)对第i个子结点,以
输入 :训练数据集D,特征集A阈值
输出 :决策树T;
(1)若D中所有实例属于同一类
(2)若
(3)否则,计算A中各特征对D的信息增益比,选择信息增益比最大的特征
(4)如果
(5)否则,对
(6)对第i个子结点,以
决策树的剪枝 
输入 :生成算法产生的整个树T;
输出 :修剪后的子树
(1)计算每个结点的经验熵;
(2)递归地从树的叶结点向上回缩。设一组叶结点回缩到其父结点之前的整体树的损失函数值大于之后的整体树的损失函数值,则进行剪枝,即将父结点变为新的叶结点;
(3)返回(2),直至不能继续为止,得到损失函数最小的子树
设树T的业绩点个数为
式中经验熵为
可以将等式右侧第一项记为
CART算法 
对于二类分类问题,若样本点属于第1个类的概率是p,则概率分布的基尼指数为
对于给定的样本集合D,其基尼指数为
其中
输入 :训练数据集D,停止计算的条件(结点中的样本个数小于预定阈值或样本集的基尼指数小于预定阈值或没有更多的特征);
输出 :CART决策树;
(1)设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。对每一个特征A,对其可能取的每个值
(2)选取基尼指数最小的特征A及其对应的切分点
(3)对两个子结点递归调用(1)和(2),直至满足停止条件;
(4)生成CART决策树。
输入 :CART算法生成的决策树
输出 :最优决策树
(1)设
(2)设
(3)自下而上地对各内部结点t计算
其中
(4)对
(5)设
(6)如果
(7)采用交叉验证法在子树序列
支持向量机 
线性可分支持向量机 
输入 :线性可分训练数据集
输出 :最大间隔分离超平面和分类决策函数。
(1)构造并求解约束最优化问题:
(2)由此得到分离超平面:
分类决策函数
输入 :线性可分训练数据集
输出 :分离超平面和分类决策函数。
(1)构造并求解约束最优化问题:
求得最优解
(2)计算
并选择
(3)求得分离超平面
分类决策函数:
线性支持向量机 
输入 :线性可分训练数据集
输出 :分离超平面和分类决策函数。
(1)选择惩罚参数
求得最优解
(2)计算
并选择
(3)求得分离超平面
分类决策函数:
非线性支持向量机与核函数 
使得对所有的
则称
一些常用的核函数如下:
(1)多项式和函数
(2)高斯核函数
(3)字符串核函数
设
其中
直观上来看,两个字符串相同的子串越多,它们就越相似,字符串核函数的值就越大。字符串核函数可以由动态规划快速计算
关于核函数的通俗理解可以看https://zhuanlan.zhihu.com/p/47541349 
称为非线性支持向量,
输入 :线性可分训练数据集
输出 :分类决策函数。
(1)选取适当的核函数
求得最优解
(2)选择
(3)构造决策函数:
当K是正定核函数时,算法中的问题是凸二次规划问题,解释存在的。
序列最小最优化算法 
变量是拉格朗日乘子,一个变量
输入 :线性可分训练数据集
输出 :近似解
(1)取初值
(2)选取优化变量
(3)若在精度
其中,
则转(4);否则令
(4)取
scikit-learn库中的SVM 
用于分类问题的支持向量机。适用于非线性分类任务。
常用参数 :
C: 正则化参数,默认为1.0
kernel: 核函数类型,如 ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’
degree: 多项式核函数的次数(’poly’时有效),默认为3
gamma: 核函数系数,’scale’ (默认) 或 ‘auto’
适用于线性可分的分类任务,使用线性核。
常用参数 :
C: 正则化参数,默认为1.0
与svm.SVC类似,但使用不同的正则化参数nu,控制支持向量的比例。
常用参数 :
nu: 支持向量的比例(0到1之间),默认为0.5
kernel: 核函数类型
用于回归问题的支持向量机。
常用参数 :
C: 正则化参数
kernel: 核函数类型
degree: 多项式核函数的次数(’poly’时有效)
gamma: 核函数系数
。。。
提升方法 AdaBoost算法 
输入 :训练数据集
输出 :最终分类器G(x);
(1)初始化训练数据的权值分布
(2)对
(a)使用具有权值分布
(b)计算
(c)计算
(d)更新训练数据记得权值分布
其中,
(3)构建基本分类器的线性组合
Adaboost算法可以简述为三个步骤: 
训练误差分析 
AdaBoost算法最终分类器的训练误差界为
Proof : When 
then
So the left part can be done. The right part needs
The entire proof then proceeds as follows
这里
Proof : According to the definition of 
And when it comes to the enquality
it can be prooved by the Taylor Expand of 
EM算法 算法的引入 https://www.zhihu.com/question/27976634/answer/3449882660  可以作为参考。
输入 :观测变量数据Y,隐变量数据Z,联合分布
输出 :模型参数
(1)选择参数的初值
(2)E步 :记
(3)M步 :求使
(4)重复第(2)步和第(3)步,直到收敛。
算法中的Q函数尤为重要,是EM算法的核心。Q函数是完全数据的对数似然函数
下面是一个简单的EM算法例子,用来估计投硬币正面朝上的概率:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ''' EM/EM_simple.py ''' import  numpy as  npdef  expectation (data, bias ):    heads_prob = bias     tails_prob = 1  - bias     return  data * heads_prob / (data * heads_prob + (1  - data) * tails_prob) def  maximization (data, responsibilities ):    return  np.sum (responsibilities) / len (data) def  EM (data, initial_bias, num_iterations ):    bias = initial_bias     for  i in  range (num_iterations):         responsibilities = expectation(data, bias)         bias = maximization(data, responsibilities)     return  bias np.random.seed(0 ) data = np.random.randint(0 , 2 , size=100 ) initial_bias = 0.5  estimated_bias = EM(data, initial_bias, num_iterations=100 ) print ("Estimated bias:" , estimated_bias)
在高斯混合模型学习中的应用 
首先可以明确对于每个观测数据 
 
式中
 接着需要计算
接着确定EM算法的M步,用 
 
重复以上计算直到对数似然函数值无明显变化为止。
下面展示一个简单的高斯混合模型应用EM算法的代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 ''' EM/EM.py ''' import  numpy as  npfrom  scipy.stats import  normdef  expectation (data, means, covariances, weights ):    num_components = len (means)     num_points = len (data)     responsibilities = np.zeros((num_points, num_components))     for  i in  range (num_points):         for  j in  range (num_components):             responsibilities[i, j] = weights[j] * norm.pdf(data[i], loc=means[j], scale=np.sqrt(covariances[j]))     responsibilities /= np.sum (responsibilities, axis=1 , keepdims=True )     return  responsibilities def  maximization (data, responsibilities ):    num_components = responsibilities.shape[1 ]     num_points = len (data)     total_weight = np.sum (responsibilities, axis=0 )     weights = total_weight / num_points     means = np.sum (data[:, np.newaxis] * responsibilities, axis=0 ) / total_weight     covariances = np.zeros(num_components)     for  j in  range (num_components):         diff = data - means[j]         covariances[j] = np.sum (responsibilities[:, j] * diff ** 2 ) / total_weight[j]     return  means, covariances, weights def  EM (data, initial_means, initial_covariances, initial_weights, num_iterations ):    means = initial_means     covariances = initial_covariances     weights = initial_weights     for  i in  range (num_iterations):         responsibilities = expectation(data, means, covariances, weights)         means, covariances, weights = maximization(data, responsibilities)     return  means, covariances, weights np.random.seed(0 ) data = np.concatenate([np.random.normal(-10 , 1 , 1000 ), np.random.normal(10 , 1 , 1000 )]) initial_means = [-8 , 8 ] initial_covariances = [1 , 1 ] initial_weights = [0.4 , 0.6 ] estimated_means, estimated_covariances, estimated_weights = EM(data, initial_means, initial_covariances,                                                                initial_weights, num_iterations=100 ) print ("Estimated means:" , estimated_means)print ("Estimated covariances:" , estimated_covariances)print ("Estimated weights:" , estimated_weights)
EM算法推广 
F函数的极大-极大算法 
对于固定的 
若 
 
由上,可以得到关于EM算法用F函数的极大-极大算法的解释:
设
EM算法的一次迭代可由F函数的极大-极大算法实现:
设
(1)对固定的
(2)对固定的使 
证明略。
GEM算法 
输入 :观测数据,F函数
输出 :模型参数
(1)选择参数的初值
(2)第i+1次迭代,第1步:求
(3)第2步:求
(4)重复第(2)步和第(3)步,直到收敛。
输入 :观测数据,F函数
输出 :模型参数
(1)选择参数的初值
(2)第i+1次迭代,第1步:计算
(3)第2步:求
(4)重复第(2)步和第(3)步,直到收敛。
输入 :观测数据,F函数
输出 :模型参数
(1)选择参数的初值
(2)第i+1次迭代,第1步:计算
(3)第2步:进行d次条件极大化:
在
(4)重复第(2)步和第(3)步,直到收敛。
隐马尔可夫模型 基本概念 , 
状态转移概率矩阵 
观测概率矩阵 
初始状态概率向量 
 
状态转移概率矩阵A与初始状态概率向量
概率计算问题。给定模型 
学习问题。已知观测序列 
预测问题,即解码(decoding)问题。已知模型 
 
概率计算算法 直接计算法 
状态序列
对固定的状态序列
forward-backward algorithm(前向-后向算法) 
输入 :隐马尔可夫模型
输出 :观测序列概率
(1)初值
(2)对
(3)
前向算法的计算复杂度为
输入 :隐马尔可夫模型
输出 :观测序列概率
(1)初值
(2)对
(3)
利用前向概率和后向概率可以得到:
一些概率与期望值 
给定模型 
 
在观测O下状态i出现的期望值: 
在观测O下状态i转移的期望值: 
在观测O下由状态i转移到状态j的期望值: 
 
 
学习算法 
监督学习方法 
转移概率
观测概率
初始状态概率 
 
Baum-Welch算法(无监督学习) 输入 :观测数据
输出 :隐马尔可夫模型参数。
(1)初始化。对n=0,选取
(2)递推,对
(3)终止。得到模型参数
预测算法 近似算法 
维特比算法 
输入 :模型
输出 :最优路径
(1)初始化
(2)递推,对t=2,…,T,
(3)终止,
(4)最优路径回溯,对t=T-1,T-2,…,1,
条件随机场 https://www.zhihu.com/question/35866596/answer/139485548  可以参考一下。还有一篇比较啰嗦的https://www.zhihu.com/question/35866596/answer/236886066  也可以参考。
概率无向图模型 
设u和v是无向图G中任意两个没有边连接的结点,结点u和v分别对应随机变量
设
设结点集合A,B是在无向图G中被结点集合C分开的任意结点集合,“分开”指删除结点集合C后A与B不连通。则给定随机变量组
概率无向图模型的因子分解 将概率无向图模型的联合概率分布表示为其最大团上的随机变量的函数的乘积形式的操作,成为概率无向图模型的因子分解,即
条件随机场的定义与形式 
条件随机场的参数化形式 
其中
条件随机场的简化形式 
然后,对转移特征与状态特征在各个位置i求和,记作
从而
若令
条件随机场的矩阵形式 
这样,给定观测序列x,标记序列y的非规范化概率可以通过n+1个矩阵的乘积
其中,
概率计算问题 前向-后向算法 
对每个指标
递推公式为:
又可表示为
类似地,定义后向向量
递推公式为:
又可表示为
由前向-后向向量定义不难得到:
概率计算以及期望值计算 
其中,
其中,
学习算法 
输入 :特征函数
输出 :参数估计值
(1)对所有
(2)对每一
(a)当
当
其中,
(b)更新
(3)如果不是所有
上式中,
S是一个常数,选择足够大的S使得对训练数据集的所有(x,y),
其中,
对于状态特征
其中,
以上算法称作算法S。此算法中需要使S取足够大,这样一来每步迭代的增量向量会变大,算法收敛会变慢。下面的算法T可以解决这个问题。算法T对每个观测序列x计算其特征总数的最大值
式中
输入 :特征函数
输出 :最优参数值
(1)选定初始点
(2)计算
(3)由
(4)一维搜索:求
(5)置
(6)计算
其中,
(7)k=k+1,转(3)。
预测算法 
输入 :模型特征向量
输出 :最优路径
(1)初始化
(2)递推,对
(3)终止
(4)返回路径
一个简单的线性CRF例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import  sklearn_crfsuitefrom  sklearn import  metricsX_train = [     [{'token' : 'I' , 'pos' : 'PRON' }, {'token' : 'am' , 'pos' : 'VERB' }, {'token' : 'fine' , 'pos' : 'ADJ' }],     [{'token' : 'How' , 'pos' : 'ADV' }, {'token' : 'are' , 'pos' : 'VERB' }, {'token' : 'you' , 'pos' : 'PRON' }] ] y_train = [['PRON' , 'VERB' , 'ADJ' ], ['ADV' , 'VERB' , 'PRON' ]] crf = sklearn_crfsuite.CRF(algorithm='lbfgs' , max_iterations=100 , all_possible_transitions=True ) crf.fit(X_train, y_train) X_test = [[{'token' : 'You' , 'pos' : 'PRON' }, {'token' : 'are' , 'pos' : 'VERB' }, {'token' : 'great' , 'pos' : 'ADJ' }]] y_test = [['PRON' , 'VERB' , 'ADJ' ]] y_pred = crf.predict(X_test) print ("Predicted labels:" , y_pred[0 ])print (metrics.classification_report(y_test[0 ], y_pred[0 ]))