算法笔记

算法

零 NLP(Natural Language Processing)

1 自然语言处理之文本相似度

1.1余弦相似度

  1. 文本相似度计算流程

    1.2.1 单独使用TF-IDF算法

    1.2.2 avg-word2vec+TF-IDF

    word2vec计算出词向量,文本向量=sum(词向量*TF-IDF)/文本中的词数

    文本相似度=文本向量之间求余弦相似度

    TF-IDF计算

    2 中文分词

    2.1 马尔可夫模型(MM:Markov Model)

    马尔可夫模型认为一个系统中,当前状态依赖于之前的有限个状态。

    天气实例

    假设初始概率晴天,雨天,多云分别为 0.6,0.3,0.1,如果观测到前几天的天气情况:晴天,晴天,雨天,多云。状态转移概率为:

     

    预测接下来三天都是晴天的可能性:0.45*0.7*0.7

    2.2 隐马尔可夫模型(HMM:Hidden Markov Model)

    HMM参数

    初始隐藏概率πk:

    所有初始状态中k状态的样本数/所有初始状态的样本数,如中文分词中,sum(每篇文章第一个字为k状态的频次) / sum(每篇文章第一个字的状态的频次)

    状态转移概率:

    k状态到l状态的概率a(k,l)=所有k状态下到l的频次/所有k状态的频次,如中文分词中,sum(每篇文章k状态到l状态的频次) / sum(每篇文章k状态的频次)

    发射概率:

    由k状态发射到u观测值的概率=k状态下观测值u的频次/k状态的频次,如中文分词中,sum(每篇文章k状态下某观测值Ot的频次) / sum(每篇文章k状态的频次)

    HMM生成过程和公式

    注意:p(S1)就是初始状态概率,当前观测值Ot依赖于当前状态St,当前状态St依赖于前一个状态St-1,该公式表示的是生成序列Ot和St的概率

    问题:

    根据给定的HMM参数(πk,a(k,l),bk(u))和观测序列O,如何求隐藏序列S

    分析:根据公式,每个可能的S序列都能计算出一个概率,而概率最大的那个S序列即为解

    动态规划求解:

    中文分词实例

    用BMES表示单词的位置

    给定一个未分割的句子,如果知道每个字的位置信息BMES,则就能分词

    这里的BMES相当于隐藏序列S(S in {B,M,E,S}),观测序列O相当于未分割的句子。如图:

    p(S1)=句子中第一个字的状态概率(初始状态概率),p(O1|S1)=句子中第一个字的发射概率,p(S1)*p(O1|S1)表示句子中第一个字出现的概率,p(S2|S1)表示句子中第一个字的隐藏状态S1到第二个字的隐藏状态S2的概率,全部相乘得到整个句子出现的概率,目标就是找到一个序列S使得句子出现的概率最大,即找到黑色箭头指向的最优路径序列S

     

    3 分类算法之朴素贝叶斯

    link\算法\带你理解朴素贝叶斯分类算法 - 知乎.mhtml

    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法

    3.1 分类问题综述

    分类算法的内容是要求给定特征,让我们得出类别,这也是所有分类问题的关键。那么如何由指定特征,得到我们最终的类别

    3.2朴素贝叶斯分类

    贝叶斯公式

    朴素贝叶斯分类有朴素一词的来源:朴素贝叶斯算法是假设各个特征之间相互独立

    如:

    可以变换为:

    根据大数定律,频率=概率,则类别概率p(yi)=该类别样本数/样本总数

    3.3 多分类学习(OvO、OVR、MVM 原理区别)

    link\算法\nlp\多分类学习(OvO、OVR、MVM 原理区别)_ctf_h的博客-CSDN博客.mhtml

    4 word2vec

    link\算法\理解 Word2Vec 之 Skip-Gram 模型 - 知乎.mhtml

    4.0简介

    word2vec即将单词映射为向量,如one-hot形式的向量v0,但v0维度是整个词表的大小,且词向量之间相似度始终为0,故需要将v0这样的高维向量转换为低维的dense词向量,这时需要通过神经网络模型进行训练,得到隐藏层的W,即词表的Embedding权重矩阵

    4.1 模型分类:skip-gram和cbow

    4.1.1 skip-gram原理

    如上图,蓝色表示目标单词,假设推进窗口为2,可以得到样本对training samples,该样本对是 ( input word, output word ) 这样的单词对,input word和output word都是one-hot编码的向量。最终模型的输出是一个概率分布。注意,这里的input word是target word,output word是上下文单词。

    如果我们现在想用300个特征来表示一个单词(词表大小为10000)。那么隐层的权重矩阵应该为10000行,300列(隐层有300个结点)

    看下面的图片,左右两张图分别从不同角度代表了输入层-隐层的权重矩阵。左图中每一列代表一个10000维的词向量和隐层单个神经元连接的权重向量。从右边的图来看,每一行实际上代表了每个单词的词向量,所以我们最终的目标就是学习这个隐层的权重矩阵

    对高频词抽样

    基本思想如下:对于我们在训练原始文本中遇到的每一个单词,它们都有一定概率被我们从文本中删掉,而这个被删除的概率与单词的频率有关

    有一个参数叫"sample",这个参数代表一个阈值,默认值为0.001(在gensim包中的Word2Vec类说明中,这个参数默认为0.001,文档中对这个参数的解释为" threshold for configuring which higher-frequency words are randomly downsampled")。这个值越小意味着这个单词被保留下来的概率越小(即有越大的概率被我们删除)

    负采样(negative sampling)

    vocabulary的大小决定了我们的Skip-Gram神经网络将会拥有大规模的权重矩阵,所有的这些权重需要通过我们数以亿计的训练样本来进行调整,这是非常消耗计算资源的。

    不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。

    注意:以上权重更新指的是隐藏层到输出层的权重,在更新输入层到隐层的权重W时,词向量矩阵W只有输入单词那一行的导数非0,其余的行在迭代过程中导数都为0,均保持不变,所以在反向传播时只更新W矩阵的一行,即300个权重

    j in (0,n)表示词表中的所有单词

    4.1.2 cbow原理

    注意:cbow的input word为目标word的上下文单词,output word是目标单词

    CBOW是用某一个词的上下文(前面几个和后面几个)去预测它本身,但实现起来,word2vec绝不止这一点,其精华还在负(降)采样和层级softmax,两者都是为了加速而做的优化,我们来顺着这个图理解一下。

      先看下参数,我们的window设置为5,那么就是用前5个词和后5个词去预测当前词,所以模型的输入是上下文,也就是10个词,这就是右边的第一个input层。右边的Embedding层也好理解,词向量维度为128,那就成了10*128的张量。再看第一个lambda层,其做的是加法,将10个128维的词向量同一维度直接加在一起形成了一个128维的张量,至此右边完成

    再看左边,第二个输入层输入的就是当前词,也就是1个词。第二个lambda层做的是抽样,随机构造15个跟当前词不一样的词作为负样本,通过第三个lambda层拼接到一起。嵌入2次,分别得到W和b,也就是权重和偏置在第四个lambda层完成Dense(Wx+b)和Softmax的操作。

      最后一步也就是整个模型的输出就是softmax的值,其有16维实际上是模型预测当前词是正例(1个)和负例(抽样的15个)的概率值,这就做到了通过输入上下文来识别当前词,且识别范围(解空间)由原先的所有词,限制到了负采样个数+1内,这就大大地加快了训练速度。而我们所需要的词向量就是右边的Embeding层,也就是第一个嵌入层的权重

    一 决策树

    link\算法\【机器学习】决策树(上)——ID3、C4.5、CART(非常详细) - 知乎.mhtml

    link\算法\【机器学习】决策树(下)——XGBoost、LightGBM(非常详细) - 知乎.mhtml

    1 决策树

    用决策树做分类或回归任务时,从根节点开始,对样本的某一特征进行测试,根据测试结果,将样本分配到其子结点;这时,每一个子节点对应着该特征的一个取值。如此递归地对样本进行测试并分配,直至到达叶结点。

     

    其实,决策树是将空间用超平面进行划分的一种方法,每次分割的时候,都将当前的空间根据特征的取值进行划分, 这样使得每一个叶子节点都是在空间中的一个不相交的区域,在进行决策的时候,会根据输入样本每一维特征的值,一步一步往下,最后使得样本落入N个区域中的一个(假设有N个叶子节点)

    ID3 C4.5 cart算法对比

    决策树图1.1

    业务场景:以应用商店中应用个性化推荐为例。

     

    Step1:构造用户画像,收集用户历史下载应用记录、已安装应用记录、用户社会属性(年龄、性别、学历、所在城市)。

     

    Step2:构造应用画像,应用画像包括应用ID,应用类型、应用标签、应用安装量排名、应用CTR等。

     

    Step3:样本收集,收集用户历史曝光下载应用记录(字段:用户ID、应用ID、是否下载),并通关用户ID、应用ID与用户画像、应用画像关联起来得到样本数据,得到样本数据(用户ID,应用ID,用户画像,应用画像,是否下载)。

     

    Step4:构造模型训练样本,定义用户画像与应用画像不同类型特征的交叉规则生成模型特征,运用定义好的交叉规则对所有样本生成模型特征,得到模型训练样本(模型特征,是否下载)。

     

    Step5:模型训练,模型训练样本训练CARD算法,得到预测模型。

     

    Step6:模型使用,给定一个用户和应用,根据上述方法生成用户的用户画像及应用的应用画像,然后运用定义好的交叉特征规则生成模型特征,把模型特征代入模型得到预测值。

    2 信息熵

    设X是一个取值为有限个的离散型随机变量(例如前一篇引例中可能夺冠的16只球队),其概率分布为P(X=i)=pi,i=1 2 3...n(每个球队可能夺冠的概率),则随机变量X的信息熵定义为:

    通常log取2为底或e为底。信息熵越大,表示X越混乱,越小,X越纯净

    3 ID3算法

    数据集的信息熵:

    注意:D表示样本全集(全量数据集) ,如决策树图1.1,D=1024,C={买640,不买384}

    特征A的条件熵:

    如决策树图1.1,A为年龄特征,Di={青年样本数384,中年样本数256,老年样本数384}

    假设Di为青年,则Dik={青年-买128,青年-不买256}

    信息增益 = 信息熵 - 条件熵:

    信息增益越大表示使用特征 A 来划分所获得的"纯度提升越大"

     

    ID3 算法的核心思想就是以信息增益来度量特征选择,选择信息增益最大的特征进行分裂。算法采用自顶向下的贪婪搜索遍历可能的决策树空间(C4.5 也是贪婪搜索)。 其大致步骤为:

     

    1初始化特征集合和数据集合;

    2计算数据集合信息熵和所有特征的条件熵,选择信息增益最大的特征作为当前决策节点;

    3更新数据集合和特征集合(删除上一步使用的特征,并按照特征值来划分不同分支的数据集合);

    4重复 2,3 两步,若子集值包含单一特征,则为分支叶子节点

    缺点:

    4 C4.5算法

    相对于ID3:

    支持连续变量

    公式:

    其中对于,如果i越大,即特征A取值越多,则越大,从而对取值多的特征,A进行了惩罚,i越小,则信息增益率对可取值较少的特征有所偏好(分母越小,整体越大),因此 C4.5 并不是直接用增益率最大的特征进行划分,而是使用一个启发式方法:先从候选划分特征中找到信息增益高于平均值的特征,再从中选择增益率最高的

    剪枝策略

    为什么要剪枝:过拟合的树在泛化能力的表现非常差。

    预剪枝

    在节点划分前来确定是否继续增长,及早停止增长的主要方法有:

    决策树到达一定高度的情况下就停止树的生长

    节点内数据样本低于某一阈值;

    节点划分前准确率比划分后准确率高。

     

    预剪枝不仅可以降低过拟合的风险而且还可以减少训练时间,但另一方面它是基于"贪心"策略,会带来欠拟合风险。

    后剪枝

    在已经生成的决策树上进行剪枝,从而得到简化版的剪枝决策树。

     

    C4.5 采用的悲观剪枝方法,用递归的方式从低往上针对每一个非叶子节点,评估用一个最佳叶子节点去代替这课子树是否有益。如果剪枝后与剪枝前相比其错误率是保持或者下降,则这棵子树就可以被替换掉。C4.5 通过训练数据集上的错误分类数量来估算未知样本上的错误率。

     

    后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但同时其训练时间会大的多。

    缺点

    剪枝策略可以再优化;

    C4.5 用的是多叉树,用二叉树效率更高;

    C4.5 只能用于分类;

    C4.5 使用的熵模型拥有大量耗时的对数运算,连续值还有排序运算;

    C4.5 在构造树的过程中,对数值属性值需要按照其大小进行排序,从中选择一个分割点,所以只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时,程序无法运行

    5 cart回归分类树(Classification and Regression Tree)

    cart属于二分类树,ID3 C4.5均是多分类树,特征选择采用基尼系数

    剪枝策略-代价复杂度剪枝

    对于原始的cart树A0,先剪去一棵子树,生成A1,然后再剪去一棵子树,生成A2,一直到只剩下根节点,生成An,共n+1棵树,再用0-n+1棵树预测验证集,哪棵树效果好,就选谁

     

    基尼系数

    基尼系数的性质与信息熵一样:度量随机变量的不确定度的大小;

    G 越大,数据的不确定性越高;

    G 越小,数据的不确定性越低;

    G = 0,数据集中的所有样本都是同一类别

    注意,基尼系数用于分类

     

    6 随机森林和GBDT(Gradient Boosting Decision Tree)

    link\算法\集成学习终篇:从CART回归树开始,经历BDT、GBDT彻底理解XGBoost - 知乎.mhtml

    link\算法\RF、GBDT、XGBoost常见面试题整理 - 知乎.mhtml

    link\算法\机器学习算法GBDT的面试要点总结-上篇 - ModifyBlog - 博客园.mhtml

    两者都是多棵树进行预测

    随机森林

    如果是回归树组成森林,则最终结果是求平均,如果是分类树,则取众数

    GBDT

    BDT算法流程

    GBDT算法

    注意:GBDT也可以用来解决分类问题

     

    GBDT采用梯度下降求解损失函数

    GBDT分类

    XGBoost

    XGBoost损失函数相当于GBDT损失函数加上正则化项

    泰勒公式

    目标函数

    q(x)表示特征x的输出叶子节点位置,Wq(x)表示特征x的输出叶子节点的权重,如w1=2

     

    优化目标函数

    最优切分点划分算法

    1)贪心算法

    2)近似算法

    xgboost block结构

    xgboost优点

    xgboost缺点

    xgboost和GBDT区别

    传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。节点分裂的方式不同,GBDT中,CART回归树的分裂依据是选择平方误差最小的特征及分割点进行分裂,xgboost的分裂依据为最小化损失函数的误差

    LightGBM

    1)单边梯度抽样算法

    2)直方图算法

    3)互斥特征捆绑算法(EFB)

    4)带深度限制的 Leaf-wise 算法

    5)类别特征最优分割

    LIghtGBM和xgboost对比

    7 回归树构建过程

    link\算法\Regression Tree 回归树 - 知乎.mhtml

    Rm和Cm解释:

    比如age特征划分为<=30和>30,则R1为>=30,R2为<30,C1为<=30的样本的age均值,C2为>30的样本的age均值

    算法流程

    注意:

    以上特征选择是针对连续变量,如果是离散变量,则使用条件标准差来选择最优特征(越小越优)

    A表示某特征,C表示特征A的某个取值,P(C)表示取值C的占比,S(C)表示取值C的样本的标准差。

    如样本(age,y): 10,2 12,1 13,1 20,0 10,1

    p(C=10)=2/5

    S(C=10)=sqrt( ( (1-1.5)^2+(2-1.5)^2 )/2 )=0.5

    回归树示例

    已知如下图所示的训练数据,试用平方误差损失准则生成一个二叉回归树

    之后的递归过程同上,完整的二叉回归树

    8 adaboost

    简介

    adaboost例子

    AdaBoost为何如此神奇

    9 拟合优度

    回归模型拟合优度=可决系数

    可决系数

    总离差的平方和,简称总平方和,用SST表示,又称作总变差(Total variation)。已解释离差的平方和,简称回归平方和,用SSR表示,又称作已解释变差(Explained variation)。未解释离差的平方和,简称误差平方和,用SSE表示,又称作未解释变差(Unexplained variation)。可以证明,由总离差的分解公式能推出总变差的分解公式: ,或:SST=SSR+SSE

    证明:

     

     

  2. LCS

    LongestCommonSubsequence 最长公共子序列

    link\算法\程序员的算法课(6)-最长公共子序列(LCS) - 知乎.mhtml

    二 聚类

    监督式学习:

    训练集有明确答案,监督学习就是寻找问题(又称输入、特征、自变量)与答案(又称输出、目标、因变量)之间关系的学习方式。监督学习模型有两类,分类和回归。

     

    • 分类模型:目标变量是离散的分类型变量;

     

    • 回归模型:目标变量是连续性数值型变量。

     

    无监督学习:

    只有数据,无明确答案,即训练集没有标签。常见的无监督学习算法有聚类(clustering),由计算机自己找出规律,把有相似属性的样本放在一组,每个组也称为簇(cluster)。

     

    最早的聚类分析是在考古分类、昆虫分类研究中发展起来的,目的是找到隐藏于数据中客观存在的"自然小类","自然小类"具有类内结构相似、类间结构差异显著的特点,通过刻画"自然小类"可以发现数据中的规律、揭示数据的内在结构。

    Kmeans聚类

    质心:

    假设有样本 ,则该N个样本的质心为不同维度的均值组成的点

     

     

    第一步中的初始中心点怎么确定?

  3. 先随便选个点作为第1个初始中心C1,接下来计算所有样本点与C1的距离,距离最大的被选为下一个中心C2,直到选完K个中心。这个算法叫做K-Means++,可以理解为 K-Means的改进版,它可以能有效地解决初始中心的选取问题,但无法解决离群点问题
  4. 先找所有样本点的均值点,计算每个点与均值点的距离,选取最远的K个点作为K个初始中心。当然,如果样本中有离群点,这个方法也不佳

     

    第二步中点之间的距离用什么来定义?(欧氏距离)

    第三步中的所有点的均值(新的中心点)怎么算?

    质心

    K怎么选择?

    层次聚类

    DBscan

    算法

     

    1从数据集中随机选择核心点

    2.以一个核心点为圆心,做半径为V的圆,选择圆内圈入点的个数满足密度阈值的核心点,因此称这些点为核心对象,且将圈内的点形成一个簇,其中核心点直接密度可达周围的其他实心原点;

    3.合并这些相互重合的簇

    三 神经网络

    1简介

    感知机与神经网络

     

    神经网络的传播都是形如Y=WX+b的矩阵运算;为了给矩阵运算加入非线性,需要在隐藏层中加入激活层;输出层结果需要经过Softmax层处理为概率值,并通过交叉熵损失来量化当前网络的优劣

    其中:I1,I2...IN表示输入层X的各个特征值,h1 h2...表示隐含层的值,O1 O2...表示输出层各样本X的值

    2神经网络分层:

    输入层:X(含多维特征的向量)

    隐藏层:

    隐藏层主要有线性运算y=wx+b 和激活运算

    激活函数

    激活函数作用

    输出层:

    softmax变换

    交叉熵损失(Cross Entropy Error)衡量输出结果的好坏

    -logP

    还是用90%举例,对数的负数就是:-log0.9=0.046

    可以想见,概率越接近100%,该计算结果值越接近于0,说明结果越准确

     

    3求解

    BP算法

    链式求导一:假设输出层激活函数为sigmoid

    1)计算输出层i节点到隐藏层的j节点的权重Wij的变化

    这里hi表示输出层i节点的net值(输入值),Y_hat_i表示输出层i节点的out值(输出值),Oj表示隐藏层j节点的out值

    2)

    注意,hk错误,应该是hj,表示j节点的net值

    结论:

    步骤:

    链式求导二:假设输出层激活函数为softmax

    雅可比矩阵

    其中z表示softmax层的输入,并非X到隐藏层的输入。

    m个样本的损失函数为

    yi为第i个样本的真实标签向量如([0 0 1 0]),ai表示预测向量y_hat(如[0.1 0.1 0.8])

    aj表示i样本中真实类别所在位置j的softmax值

    softmax函数求导

    如图,分别是输入层X,hout隐藏层节点的输出值,Onet输出层的net值Zi,Oout输出层的真实分类的softmax输出值aj,如果aj对Zi求导,则如果真实分类j和输出层节点i在相同的位置(i=j),则求导如下(k表示分类数)

    就单个样本而言,损失函数对输出层i节点的net值Zi求导如下:

     

    4 dropout正则化

    4.1 Dropout具体工作流程

    4.2 Dropout在神经网络中的使用

    4.3 dropout为什么可以防止过拟合

    5 梯度消失、爆炸

  5. 深层网络角度

  6.  

    5.2 激活函数角度

    同理,tanh作为激活函数,它的导数图如下,可以看出,tanh比sigmoid要好一些,但是它的导数仍然是小于1的。tanh数学表达为:

    5.3 梯度消失、爆炸的解决方案

    梯度剪切、正则

    l2_loss = tf.add_n([tf.nn.l2_loss(var) for var in tf.trainable_variables() if 'weights' in var.name])

     

    relu、leakrelu、elu等激活函数

    但是elu相对于leakrelu来说,计算要更耗时间一些

    方案3 batchnorm

    link\算法\(3条消息) 基础 _ batchnorm原理及代码详解_Double_V的博客-CSDN博客.mhtml

    方案4 残差结构

    link\算法\你必须要知道CNN模型:ResNet - 知乎.mhtml

    方案5 LSTM

     

     

    四CNN(convolution neural network)

    link\算法\卷积神经网络CNN完全指南终极版(一) - 知乎.mhtml

    link\算法\卷积神经网络CNN完全指南终极版(二) - 知乎.mhtml

    1 CNN基本概念

    卷积核又叫滤波器(filter,也称为kernel),如图

     

    2 CNN的结构组成

    Convolutional layer(卷积层--CONV)

    由滤波器filters和激活函数构成。 一般要设置的超参数包括filters的数量、大小、步长,以及padding是"valid"还是"same"。当然,还包括选择什么激活函数

    Pooling layer (池化层--POOL)

    卷积操作后,我们得到了一张张有着不同值的feature map,尽管数据量比原图少了很多,但还是过于庞大(比较深度学习动不动就几十万张训练图片),因此接下来的池化操作就可以发挥作用了,它最大的目标就是减少数据量。

    池化分为两种,Max Pooling 最大池化、Average Pooling平均池化。顾名思义,最大池化就是取最大值,平均池化就是取平均值

    这里里面没有参数需要我们学习,因为这里里面的参数都是我们设置好了,要么是Maxpooling,要么是Averagepooling。 需要指定的超参数,包括是Max还是average,窗口大小以及步长。 通常,我们使用的比较多的是Maxpooling,而且一般取大小为(2,2)步长为2的filter,这样,经过pooling之后,输入的长宽都会缩小2倍,channels不变

    Fully Connected layer(全连接层--FC)

    在经过数次卷积和池化之后,我们 最后会先将多维的数据进行"扁平化",也就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了。

    可以从图中看到,随着网络的深入,我们的图像(严格来说中间的那些不能叫图像了,但是为了方便,还是这样说吧)越来越小,但是channels却越来越大了。在图中的表示就是长方体面对我们的面积越来越小,但是长度却越来越长了

    如下图,压缩后的一维数组全连接到输出层,权重矩阵W为(len,n_class)

    五 动态规划

    link\算法\告别动态规划,连刷 40 道题,我总结了这些套路,看不懂你打我(万字长文) - 知乎.mhtml

     

    动态规划,无非就是利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存

    动态规划的三大步骤:

    第一步骤:

    定义数组元素的含义,上面说了,我们会用一个数组,来保存历史数组,假设用一维数组 dp[] 吧。这个时候有一个非常非常重要的点,就是规定你这个数组元素的含义,例如你的 dp[i] 是代表什么意思?

    第二步骤:

    找出数组元素之间的关系式,我觉得动态规划,还是有一点类似于我们高中学习时的归纳法的,
    当我们要计算 dp[n] 时,是可以利用 dp[n-1],dp[n-2].....dp[1],来推出 dp[n] 的,也就是可以利用历史数据来推出新的元素值,
    * 所以我们要找出数组元素之间的关系式,例如 dp[n] = dp[n-1] + dp[n-2],这个就是他们的关系式了。而这一步,也是最难的一步,
    后面我会讲几种类型的题来说。

    第三步骤:

    找出初始值。学过数学归纳法的都知道,虽然我们知道了数组元素之间的关系式,例如 dp[n] = dp[n-1] + dp[n-2],
    我们可以通过 dp[n-1] 和 dp[n-2] 来计算 dp[n],但是,我们得知道初始值啊,例如一直推下去的话,会由 dp[3] = dp[2] + dp[1]。
    而 dp[2] 和 dp[1] 是不能再分解的了,所以我们必须要能够直接获得 dp[2] 和 dp[1] 的值,而这,就是所谓的初始值

    六 感知机和SVM

    link\算法\算法——感知机详解(推导+证明) - 知乎.mhtml

    link\算法\【机器学习】支持向量机 SVM(非常详细) - 知乎.mhtml

    1 感知机

    1.1 简介

    感知机是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别(取+1和-1)。感知机对应于输入空间中将实例划分为两类的分离超平面。感知机旨在求出该超平面,为求得超平面导入了基于误分类的损失函数,利用梯度下降法对损失函数进行最优化

    1.2 感知机模型

    如果我们将sign称之为激活函数的话,感知机与logistic regression的差别就是感知机激活函数是sign,logistic regression的激活函数是sigmoid。sign(x)将大于0的分为1,小于0的分为-1

    1.3 感知机线性方程(即超平面函数)

    1.4 学习策略和损失函数

    该损失函数的意义可以理解为:错误样本的错误程度之和sum(Err),我们的目标是使得sum(Err)最小化

    1.5 感知机模型学习过程

    1.6 收敛性证明(线性可分时)

    2 支持向量机(support vector machines, SVM)

    2.1 线性可分模型(硬间隔)

    2.1.1 线性可分

    在二维空间上,两类点被一条直线完全分开叫做线性可分

    2.1.2 支持向量

    支持向量性质:yi(wxi+b)=1

    2.1.3 SVM损失函数

    其中新的w=w/(||w||d) 新的b= b/(||w||d) ,新的wx+b=0 和旧的wx+b=0其实是一条直线,故可以令||w||d=1,得到:

    最优化问题

    即寻找W,b使得||w||^2最小,且还要满足约束条件

    smo算法:

    注意,求解该对偶问题时,每个样本i至少要更新2个参数ai aj,即smo算法

    2.2 软间隔(线性不可分)

    在实际应用中,完全线性可分的样本是很少的,如果遇到了不能够完全线性可分的样本,我们应该怎么办?比如下面这个

    最优化问题

    2.3 非线性SVM(kernel核函数)

    我们刚刚讨论的硬间隔和软间隔都是在说样本的完全线性可分或者大部分样本点的线性可分。

     

    但我们可能会碰到的一种情况是样本点不是线性可分的,比如

    这种情况的解决方法就是:将二维线性不可分样本映射到高维空间中,让样本点在高维空间线性可分,比如:

    2.3.1 核函数的作用

    xi为训练样本中的支持向量 xj为测试样本

    2.3.2 核函数分类

    双曲函数tanh(x)=(e^x-e^(-x))/(e^2+e^(-x))

    2.3.3 模型

    由2.1可知

    且ai yi是标量,最优化问题和软间隔相同

    所以

    七 FM和FFM

    1 FM(Factorization Machines,因子分解机)

    1.1 FM简介

    最早由Steffen Rendle于2010年在ICDM上提出,它是一种通用的预测方法,在即使数据非常稀疏的情况下,依然能估计出可靠的参数进行预测。与传统的简单线性模型不同的是,因子分解机考虑了特征间的交叉,对所有嵌套变量交互进行建模(类似于SVM中的核函数),因此在推荐系统和计算广告领域关注的点击率CTR(click-through rate)和转化率CVR(conversion rate)两项指标上有着良好的表现。此外,FM的模型还具有可以用线性时间来计算,以及能够与许多先进的协同过滤方法(如Bias MF、svd++等)相融合等优点

    1.2 FM由来

    1.3 模型:

    1.4 FM优势

    2 FFM(Field Factorization Machine)

    八 RNN(循环神经网络Recurrent Neural Network)

    1 从单层网络谈起

    2 经典的RNN结构(N vs N)

    由于这个限制的存在,经典RNN的适用范围比较小,但也有一些问题适合用经典的RNN结构建模,如:

     

    计算视频中每一帧的分类标签。因为要对每一帧进行计算,因此输入和输出序列等长。

    输入为字符,输出为下一个字符的概率。这就是著名的Char RNN(详细介绍请参考:The Unreasonable Effectiveness of Recurrent Neural Networks,Char RNN可以用来生成文章,诗歌,甚至是代码,非常有意思)。

    3 N VS 1

    4 1 VS N

    这种1 VS N的结构可以处理的问题有:

    从图像生成文字(image caption),此时输入的X就是图像的特征,而输出的y序列就是一段句子

    从类别生成语音或音乐等

    5 N vs M(Seq2Seq)

    6 Attention机制

    在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此, c中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个c可能存不下那么多信息,就会造成翻译精度的下降

    7 LSTM 长短期记忆网络(Long Short-Term Memory)

    link\算法\如何简单的理解LSTM——其实没有那么复杂 - 简书.mhtml

     

    九 LR模型

  7. 简介

    这里的LR模型讨论的是多元线性回归模型

    LR之sigmoid变换

    (二)损失函数分类

    1 最小二乘法损失求解

    W求解方法:

    1 如果可逆,可直接求解

    如果 X 是个(k,p) 矩阵,则求逆的算法的时间复杂度为 , k是the number of features,意思就是如果特征个数 k 很大,就会非常慢

    2 如果不可逆,则变换为可逆矩阵

    3 梯度下降法

    link\算法\【机器学习面试总结】—— LR(逻辑回归) - 知乎.mhtml

    link\算法\2020算法岗机器学习超全面经整理(LR&SVM部分) - 知乎.mhtml

    link\多元线性回归与梯度下降法原理及公式推导(附Python代码)_koko_TT的博客-CSDN博客_梯度下降法和随机梯度下降法的多变量线性回归模型.mhtml

    需要多次迭代来收敛到全局最小值

    2 交叉熵损失求解

    1)交叉熵损失函数j(w)推导

    其中p(xi)即模型的预测值:sigmoid(wx+b),yi表示真实值(样本值)

    2)交叉熵损失函数求导

    其中xi为第i维度的特征值

    3 均方误差和交叉熵对比

    1)如果使用均方误差

    假设只有一个样本,则

    所以,如果当前模型的输出接近0或者1时,σ′(z)就会非常小,接近0,使得求得的梯度很小,损失函数收敛的很慢

     

    2)如果使用交叉熵作为损失函数

    4 正则化

    L1正则

    L2正则

    L1和L2正则区别

     

    L1正则中,当(d0-λ)(d0+λ)<0,即λ>|d0|时,J(w)=L(w)+λ|w| 在w=0时有极小值

    函数等高线

    (三)梯度下降法分类

    link\(4条消息)梯度下降算法总结 (FG,SG,SAG,mini-batch,Momentum等等)_Oscar2018的博客-CSDN博客_随机平均梯度下降.mhtml

    1 全梯度下降算法(FG)

    计算训练集所有样本误差,对其求和再取平均值作为目标函数。权重向量沿其梯度相反的方向移动,从而使当前目标函数减少得最多

    2 随机梯度下降算法(SGD:stochastic gradient descent)

    由于FG每迭代更新一次权重都需要计算所有样本误差,而实际问题中经常有上亿的训练样本,故效率偏低,且容易陷入局部最优解,因此提出了随机梯度下降算法。其每轮计算的目标函数不再是全体样本误差,而仅是单个样本误差,即每次只代入计算一个样本目标函数的梯度来更新权重,再取下一个样本重复此过程,直到损失函数值停止下降或损失函数值小于某个可以容忍的阈值。此过程简单,高效,通常可以较好地避免更新迭代收敛到局部最优解。其迭代形式为

    3 随机平均梯度下降算法(SAG)

    4 小批量梯度下降算法(mini-bantch)

    小批量梯度下降算法是FG和SGD的折中方案,在一定程度上兼顾了以上两种方法的优点。每次从训练样本集上随机抽取一个小样本集,在抽出来的小样本集上采用FG迭代更新权重。被抽出的小样本集所含样本点的个数称为batch_size,通常设置为2的幂次方,更有利于GPU加速处理[7]。特别的,若batch_size=1,则变成了SGD;若batch_size=n,则变成了FG.其迭代形式为

    5 梯度优化器比较

    link\算法\深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam) - 知乎.mhtml

    5.1 SGD(tf-GradientDescentOptimizer)

    SGD一般都指mini-batch gradient descent,SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新。

    5.2 Momentum(tf-MomentumOptimizer())

    5.3 Adam

     

    (四)混淆矩阵和AUC

    1 混淆矩阵

    TP = True Postive = 真阳性; FP = False Positive = 假阳性

    FN = False Negative = 假阴性; TN = True Negative = 真阴性

     

    精度(precision, 或者PPV, positive predictive value,所有预测值为正样本中的预测正确的) = TP / (TP + FP)

    召回(recall, 或者敏感度,sensitivity,真阳性率,TPR,True Positive Rate,所有真实正样本中召回正样本的概率) = TP / (TP + FN)

    准确率AUC=(TP+TN)/(TP+TN+FN+FP)

    2 AUC

    link\logistic回归 ROC AUC L1正则化_wangqi1113的博客-CSDN博客_l1正则化逻辑回归.mhtml

    AUC即准确度,假设分类器的输出是样本属于正类的socre(置信度),则AUC的物理意义为,任取一对(正、负)样本,正样本的score大于负样本的score的概率。

    AUC值的计算

      (1)第一种方法:AUC为ROC曲线下的面积,那我们直接计算面积可得。面积为一个个小的梯形面积之和,计算的精度与阈值的精度有关。

      (2)第二种方法:根据AUC的物理意义,我们计算正样本score大于负样本的score的概率。取N*M(M为正样本数,N为负样本数)个二元组,比较score,最后得到AUC。时间复杂度为O(N*M)。

    (3)第三种方法:与第二种方法相似,直接计算正样本score大于负样本的score的概率。我们首先把所有样本按照score排序,依次用rank表示他们,如最大score的样本,rank=n(n=N+M),其次为n-1。那么对于正样本中rank最大的样本(rank_max),有M-1个其他正样本比他score小,那么就有(rank_max-1)-(M-1)个负样本比他score小。其次为(rank_second-1)-(M-2)。最后我们得到正样本大于负样本的概率为:

    rank为正样本排序,时间复杂度为O(N+M)

    (五)连续特征离散化

     

  8. 召回算法:CB、CF、MF

  9. CB算法

    Content-based Recommendations(CB)和CF一样广泛应用于研究界和工业界,算是最早使用的推荐算法,根据用户过去喜欢的产品(item),为用户推荐和他过去喜欢产品相似的产品。

    CB的过程:

    Item Representation:为每个item抽取出一些特征(content)来表示item

    Profile Learning:利用一个用户过去喜欢(不喜欢)的item的特征数据,来学习出此用户恶喜好特征(profile)

    Recommendation Generation:通过比较上一步得到的用户profile与候选item的特征,为此用户推荐一组相关性最大的item

    优点:

  10. 可解释、可感知
  11. 实时性好
  12. 实现简单

    缺点:

  13. 过于侧重字面内容(语义缺失:如"港台十大金曲"和"流行经典"字面上没有关联,但实际关系较大)
  14. 没有用户数据介入(性别 年龄 消费水平),没有个性化

     

  15. CF协同过滤(Collaborative Filtering)

    协同过滤算法的大概思路如下:

    1)对于用户B,根据用户B的评分找出和用户B相似的用户集合setB

    2)通过setB预测出用户B对别的商品的评分,把高分商品推荐给用户B

    上面这种思路又叫做User-User Collaborative Filtering,当然还有Item-Item Collaborative Filtering的思路:

    1)对于商品C,根据全体用户集合setALL对商品C的评分,寻找出和商品C相似的商品集合setC

    2)通过商品C与setC的相似度预测某用户对别的商品的评分,把高分商品推荐给别人

     

    协同过滤不需要找出商品的特征值,而只需要分析用户的行为就可以为用户推荐相应的产品。这个行为指的是用户对某些商品感兴趣的行为,例如对商品的评分,对商收藏量等行为判断。但是协同过滤方法也有相应的缺点,如不能给新用户推荐产品,不能把新产品推荐给用户等

  16. MF基于矩阵分解(Matrix Factorization)

     

    常见问题

    (一)特征选择方法

    link\算法\机器学习中,有哪些特征选择的工程方法? - 知乎.mhtml

    1方差选择法:

    如下图,返回值为方差大于3的特征的数据

    2相关系数法

    #选择K个最好的特征,返回选择特征后的数据

    #第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数

    #参数k为选择的特征个数

    SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

    3卡方检验

    4嵌入法

    使用LR+正则(L1 L2)模型训练,得到各个特征的权重,倒序排列,过滤掉权重较小的特征。过滤特征即降维

    5降维

    (二)交叉验证

     

     

    (三)LR SVM 决策树的对比

    1 LR

    LR的优势:

    对观测样本的概率值输出

    实现简单高效

    多重共线性的问题可以通过L2正则化来应对

    大量的工业界解决方案

    支持online learning(个人补充)

    LR的劣势:

    特征空间太大时表现不太好

    对于大量的分类变量无能为力

    对于非线性特征需要做特征变换

    依赖所有的样本数据

    2 决策树DT

    由于决策树是的分支生成是使用离散的区间或类别值的,所以对于不管多少分类变量都能够轻松适应,而且通过决策树生成出来的模型很直观而且容易解释(随着决策树的分支解释即可),而且决策树也可以通过计算落到该叶子类目的标签平均值获得最终类别的概率输出。但是这就引发了决策树的最大问题:非常容易过拟合,我们很容易就会生成一个完美拟合训练集的模型,但是该模型在测试集合上的表现却很poor,所以这个时候就需要剪枝以及交叉验证来保证模型不要过拟合了

    DT的优势:

    直观的决策过程

    能够处理非线性特征

    DT的劣势:

    极易过拟合(使用RF可以一定程度防止过拟合,但是只要是模型就会过拟合!)

    无法输出score,只能给出直接的分类结果

    3 SVM

    SVM最大的好处就是它只依赖于处于分类边界的样本来构建分类面,可以处理非线性的特征,同时,只依赖于决策边界的样本还可以让他们能够应对"obvious"样本缺失的问题。由于SVM能够轻松搞定大规模的特征空间所以在文本分析等特征维度较高的领域是比较好的选择。SVM的可解释性并不像决策树一样直观,如果使用非线性核函数,SVM的计算代价会高很多。

    SVM的优势:

    可以处理高维特征

    使用核函数轻松应对非线性特征空间

    分类面不依赖于所有数据

    SVM的劣势:

    对于大量的观测样本,效率会很低

    找到一个"合适"的核函数还是很tricky的

     

    (四)过拟合

    简介

    过拟合(overfitting)是指在模型参数拟合过程中的问题,由于训练数据包含抽样误差,,训练时,复杂的模型将抽样误差也考虑在内,将抽样误差也进行了很好的拟合。具体表现就是最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱。

     

     

    为什么要解决过拟合

    这是因为我们拟合的模型一般是用来预测未知的结果(不在训练集内),过拟合虽然在训练集上效果好,但是在实际使用时(测试集)效果差。同时,在很多问题上,我们无法穷尽所有状态,不可能将所有情况都包含在训练集上。所以,必须要解决过拟合问题。

    解决办法

    link\算法\机器学习中用来防止过拟合的方法有哪些? - 知乎.mhtml

    1 获取更多数据

    这是解决过拟合最有效的方法,只要给足够多的数据,让模型「看见」尽可能多的「例外情况」,它就会不断修正自己,从而得到更好的结果。

    如何获取更多数据,可以有以下几个方法:

    从数据源头获取更多数据,:这个是容易想到的,例如物体分类,我就再多拍几张照片好了;但是,在很多情况下,大幅增加数据本身就不容易;另外,我们不清楚获取多少数据才算够;

    数据增强(Data Augmentation) :通过一定规则扩充数据。如在物体分类问题里,物体在图像中的位置、姿态、尺度,整体图片明暗度等都不会影响分类结果。我们就可以通过图像平移、翻转、缩放、切割等手段将数据库成倍扩充;

    2 使用合适的模型

    2.1减少网络层数

    2.2 减少训练时间

    2.3 正则化

  17. CTR CVR

    合格的网络营销人员都应该熟悉下面的常见英文缩写,这些都是我们必须知道的名词解释:

     

    CVR (Click Value Rate): 转化率,衡量CPA广告效果的指标

     

    CTR (Click Through Rate): 点击率

     

    CPC (Cost Per Click): 按点击计费

     

    CPA (Cost Per Action): 按成果数计费

     

    CPM (Cost Per Mille): 按千次展现计费

     

    PV (Page View): 流量

     

    PV单价: 每PV的收入,衡量页面流量变现能力的指标

     

    ADPV (Advertisement Page View): 载有广告的pageview流量

     

    ADimp (ADimpression): 单个广告的展示次数

     

    RPS (Revenue Per Search): 每搜索产生的收入,衡量搜索结果变现能力指标

     

    ROI:投资回报率(ROI)是指通过投资而应返回的价值,它涵盖了企业的获利目标。利润投入的经营所必备的财产相关,因为管理人员必须通过投资和现有财产获得利润。又称会计收益率、投资利润率。

     

    公司怎么提交实时任务,有多少JobManager,TM

    常用求导公式

posted @ 2023-04-05 11:50  霍橼甲  阅读(70)  评论(0)    收藏  举报