【361】机器学习常见算法

 

一、线性回归(Linear Regression)

参考:机器学习实战教程(十一):线性回归基础篇之预测鲍鱼年龄(局部加权线性回归)

参考:线性回归原理小结 - 刘建平

参考:scikit-learn 线性回归算法库小结 - 刘建平

参考:通过一个例子快速上手矩阵求导

步骤:自我理解

1. 回归方程

  hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxnhθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn

  用矩阵形式表示:

  hθ(X)=Xθhθ(X)=Xθ

2. 损失函数

  J(θ0,θ1...,θn)=i=0m(hθ(x0,x1,...xn)yi)2J(θ0,θ1...,θn)=∑i=0m(hθ(x0,x1,...xn)−yi)2

  用矩阵形式表示:

  J(θ)=12(XθY)T(XθY)J(θ)=12(Xθ−Y)T(Xθ−Y)

3. 求损失函数的最小值

  并将各个系数计算出来,可以通过 Gradient Descent 也可以通过直接求导为零的方法。

4. 线性回归正则化

  为了防止过拟合,需要让系数的值尽量小,因此加入正则项一起求最小值,就可以兼顾损失函数最小的情况下有保证系数的值也尽量小。

  参考机器学习中正则化项L1和L2的直观理解里面方框与圆圈的解释还是不是很理解,2019年1月31日

  解释1:拟合过程中通常都倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。可以设想一下对于一个线性回归方程,若参数很大,那么只要数据偏移一点点,就会对结果造成很大的影响;但如果参数足够小,数据偏移得多一点也不会对结果造成什么影响,专业一点的说法是『抗扰动能力强』。

  参考:正则化方法:L1和L2 regularization、数据集扩增、dropout

  解释2:过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。

  

二、Logistic 回归算法

参考:机器学习实战教程(六):Logistic回归基础篇之梯度上升算法

参考:机器学习实战教程(七):Logistic回归实战篇之预测病马死亡率

参考:逻辑回归原理小结 - 刘建平

步骤:自我理解

1. 用于分类问题

  可以通过线性回归的直线将两类点分开

  

  为了表征直线两侧点的值,将上面的点(>0)定义为1,下面的点(<0)定义为0

2. 通过Sigmoid函数实现转换

  它有一个非常好的性质,即当zz 趋于正无穷时,g(z)g(z) 趋于1,而当zz 趋于负无穷时,g(z)g(z) 趋于0,这非常适合于我们的分类概率模型。

4. 损失函数

  下面不加负号的话就是求其最大值。

  J(θ)=lnL(θ)=i=1m(y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i))))J(θ)=−lnL(θ)=−∑i=1m(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))

  矩阵表示为:

  J(θ)=YTloghθ(X)(EY)Tlog(Ehθ(X))J(θ)=−YT∙loghθ(X)−(E−Y)T∙log(E−hθ(X))

  其中E为全1向量, 为内积。

5. 损失函数优化

  使用梯度下降方法,需要对$ heta$求偏导,直接按照矩阵求导比较复杂,可以按照单个$ heta$求导,然后总结出矩阵的形式。

  注意:直接通过矩阵的形式求导没有实现,主要是左右位置关系没有搞通(2019年1月31日)

K-近邻算法(K Nearest Neighbors)

参考:机器学习实战教程(一):K-近邻算法(史诗级干货长文)

参考:K近邻法(KNN)原理小结 - 刘建平

决策树算法(Decision Tree)

参考:机器学习实战教程(二):决策树基础篇之让我们从相亲说起

参考:机器学习实战教程(三):决策树实战篇之为自己配个隐形眼镜

参考:决策树算法原理(上) - 刘建平

参考:决策树算法原理(下) - 刘建平

朴素贝叶斯算法(Naive Bayes)

参考1:机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器

参考2:机器学习实战教程(五):朴素贝叶斯实战篇之新浪新闻分类

参考3:朴素贝叶斯算法原理小结 - 刘建平

参考4:朴素贝叶斯分类器的应用 —— 阮一峰

参考5:算法杂货铺 —— 分类算法之朴素贝叶斯分类(Naive Bayesian classification)

参考6:《机器学习实战》第4章

参考7:白宁超 —— 一步步教你轻松学朴素贝叶斯模型算法实现篇2

  • 以下内容参见 参考1
  • 先验概率(Prior probability):P(A),即在B事件发生之前,我们对A事件概率的一个判断。
  • 后验概率(Posterior probability):P(A|B),即在B事件发生之后,我们对A事件概率的重新评估。
  • 可能性函数(Likelyhood):P(B|A)/P(B),这是一个调整因子,使得预估概率更接近真实概率。
  • 打喷嚏、建筑工人、感冒实例,实际计算

  • 言论过滤器
    • 读取词条,数组形式,读取分类结果
      【初级】
    • 构建词汇列表,取以上词条的并集(包含上面的所有词汇)
    • Words2Vec,每个句子写成矩阵的一行,长度就是词汇列表的长度,然后判断词汇列表中的单词是否在对应句子中,从而构建只包含1、0的矩阵
    • 计算词汇表中每一个单词的条件概率 P(wi|1) and P(wi|0)
      计算的时候用同一类别中出现的单词数目除以此类别中所有单词的数目
    • 通过朴素贝叶斯计算 P(1|wi) and P(0|wi),比较大小,哪个大就是哪个
      【改进】
    • 防止分子为0,拉普拉斯平滑(Laplace Smoothing)
    • 防止小数相乘,结果下溢出,取对数,相乘变成相加

支持向量机算法(SVM)

参考: [推荐] 林轩田 - 机器学习技法 - SVM系列(对于公式推导以及来龙去脉讲解较好)

参考:机器学习-白板推导系列-支持向量机SVM(Support Vector Machine)(推导过程比较到位)

参考:机器学习实战教程(八):支持向量机原理篇之手撕线性SVM(前面一部分比较好, 拉格朗日之前部分)

参考:刘建平系列博客

参考:知乎专栏

参考:How Support Vector Machines work / How to open a black box

参考:深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

参考:Constrained optimization introduction

参考:Lagrange multipliers, using tangency to solve constrained optimization

参考:拉格朗日乘数 - Wikipedia

2019年1月29日:还是没有看懂SVM,实在是太复杂啦~

2019年2月3日: 我听了 林轩田 老师的视频基本理解了, 不过鉴于内容很复杂, 基本上课上理解, 课下就忘了~如果想深入学习需要记笔记多运算啊~

参考:【机器学习经典算法】真正的SVM简明(傻瓜)教程!

加入松弛变量后,需要让松弛变量的总和尽量小。C只是代表一个常数,用来控制松弛变量部分的影响。简单来说就是,这个C值越大,说明松弛变量看得越重,那错误分类的容忍度就越小

min12||w||22+Ci=1mξimin12||w||22+C∑i=1mξi

感知机(Perceptron)

参考:感知机原理小结 - 刘建平Pinard

参考:感知机 - 码农场

参考:感知机中的损失函数中的分母为什么可以不考虑

参考:感知机中损失函数1/||w||为什么可以不考虑(或直接忽略)?

我的理解:之所以可以忽略分母,是因为函数距离与几何距离的原因,两者都是距离,在考虑函数距离的时候就可以忽略分母了~参考知乎答案


支持向量机对于核函数的理解举例:https://zhuanlan.zhihu.com/p/24291579?refer=understand

在这里引入核函数(Kernel Function) K(x^{(i)},x^{(j)})=phi(x^{(i)})cdot phi(x^{(j)}) ,此时 :

y=sum_{k=1}^malpha _iy^{(i)}K(x^{(i)},x)+b\

好像有点乱,让我们先来捋一捋:

x^{(i)}cdot x^{(j)}longrightarrow phi(x^{(i)})cdot phi(x^{(j)}) =K(x^{(i)},x^{(j)})

映射函数 phi 的作用是将低维空间的数据映射到高维空间中,核函数 K表示的是映射之后高维空间中两个矢量的点积。

通过映射函数,我们能从原始数据中(低维空间)抽象出所需的特征(高维空间),由低维空间向高维空间的转化很多时候非常的麻烦,有意思的是,无论是1维、10维、100维还是更高维的空间,其矢量点积的结果都是一个常数,那么有没有什么捷径,可以跳过维度转换的过程,通过相对简单的计算直接得到矢量积?答案就是核函数,还是举一个例子来说明吧:

x=[x_1, x_2, x_3]^T,y=[y_1, y_2, y_3]^T,我们定义 phi(x)=[x_1x_1,x_1x_2,x_1x_3,x_2x_1,x_2x_2,x_2x_3,x_3x_1,x_3x_2,x_3x_3] 将原始数据从三维空间映射到九维空间中,让我们来计算phi(1,2,3) cdot phi(4,5,6)

$$

egin{split}
phi(1,2,3)&=[1,2,3,2,4,6,3,6,9]^T\
phi(4,5,6)&=[16,20,24,20,25,30,24,30,36]^T\
phi(1,2,3) cdot phi(4,5,6) &=1	imes16+2	imes 20 + 3	imes 24 + 2	imes 20 + 4 	imes 25 + 6 	imes 30 + 3 	imes 24 + 6 	imes 30 + 9	imes 36\
&=16+40+72+40+100+180+72+180+324\
&=1024
end{split}

可以看出计算相当繁琐,嗯,我们来尝试找找对应的核函数:

egin{split}
phi(x)cdot phi(y)&=[x_1x_1,x_1x_2,x_1x_3,x_2x_1,x_2x_2,x_2x_3,x_3x_1,x_3x_2,x_3x_3]^Tcdot [y_1y_1,y_1y_2,y_1y_3,y_2y_1,y_2y_2,y_2y_3,y_3y_1,y_3y_2,y_3y_3] \
&= x_1y_1x_1y_1+x_1y_1x_2y_2+x_1y_1x_3y_3+x_2y_2x_1y_1+x_2y_2x_2y_2+x_2y_2x_3y_3\&+x_3y_3x_1y_1+x_3y_3x_2y_2+x_3y_3x_3y_3\
&=(x_1y_1+x_2y_2+x_3y_3)^2\
&=(x^Ty)^2\
&=K(x,y)
end{split}

通过上面的推导,我们发现虽然维度转化的过程较为繁琐复杂,但是矢量点积的结果确实相当简洁,这一次我们直接用核函数计算:

egin{split}
K(x,y)=K((1,2,3),(4,5,6))=(1	imes 4 + 2	imes 5 + 3	imes 6)^2=(32)^2=1024
end{split}

相比于从低维映射到高维空间再进行矢量积运算,核函数大大简化了计算的过程,使得向更高维转化变为了可能,我们不需要知道低维空间的数据是怎样映射到高维空间的,我们只需要知道结果是怎么计算出来的。

 
原文地址:https://www.cnblogs.com/alex-bn-lee/p/10323607.html