SVM
是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
**支持向量:**距离超平面最近的且满足一定条件的几个训练样本点被称为支持向量。
图中有红色和蓝色两类样本点。黑色的实线就是最大间隔超平面。在这个例子中,A,B,C 三个点到该超平面的距离相等。
注意,这些点非常特别,这是因为超平面的参数完全由这三个点确定。该超平面和任何其他的点无关。如果改变其他点的位置,只要其他点不落入虚线上或者虚线内,那么超平面的参数都不会改变。A,B,C 这三个点被称为支持向量(support vectors)。
目标:求解能够正确划分训练数据集并且几何间隔最大的分离超平面(
w
⋅
x
+
b
=
0
w\cdot x+b=0
w⋅x+b=0)。对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。
推导:
几何间隔:对于给定的数据集T和超平面
w
⋅
x
+
b
=
0
w\cdot x+b=0
w⋅x+b=0 ,定义超平面关于样本点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi) 的几何间隔为
γ
i
=
y
i
(
w
∣
∣
w
∣
∣
⋅
x
+
b
∣
∣
w
∣
∣
)
\gamma_i=y_i(\frac{w}{||w||}\cdot x+\frac{b}{||w||})
γi=yi(∣∣w∣∣w⋅x+∣∣w∣∣b)
SVM模型的求解最大分割超平面问题又可以表示为以下约束最优化问题:
min
w
,
b
1
2
∣
∣
w
∣
∣
2
\min_{w,b}\frac{1}{2}||w||^2
minw,b21∣∣w∣∣2
s
.
t
.
y
i
(
w
)
⋅
x
i
+
b
≧
1
,
i
=
1
,
2
,
.
.
.
,
N
s.t. y_i(w)\cdot x_i+b\geqq1,i=1,2,...,N
s.t.yi(w)⋅xi+b≧1,i=1,2,...,N
SVM的优缺点
优点:
它工作的效果很明显,有很好的分类作用
它在高维空间中同样是有效的。
它在尺寸数量大于样本数量的情况下,也是有效的。
它在决策函数(称为支持向量)中使用训练点的子集,因此它的内存也是有效的
缺点:
当我们拥有大量的数据集时,它表现并不好,因为它所需要的训练时间更长
当数据集具有很多噪声,也就是目标类重叠时,它的表现性能也不是很好
SVM不直接提供概率估计,这些是使用昂贵的五重交叉验证来计算的。它是Python scikit-learn库的相关SVC方法。
SVM的核技术
没有kernel的SVM也就是一个线性分类器,与LR(logistic regression)没有本质的差别,就连目标函数都很相似,但训练数据并不一定能被线性区分开。SVM kernel描述:一种隐含特征空间映射、以更低计算复杂度实现向量内积运算的特殊函数。
考虑上文提到的2维空间图,要把每个数据点映射到3维空间,才有可能线性可分。而映射到了3维空间后,计算寻找最优SVM decision boundary的过程里需要计算任意两个向量的内积。
对于一个2维空间数据点v = (x, y),要把它映射到3维空间,其中一种映射关系是:
p
(
x
,
y
)
=
(
x
2
,
2
x
y
,
y
2
)
p(x,y)=(x^2,\sqrt{2}xy,y^2)
p(x,y)=(x2,2xy,y2)。假如有任意两个数据点:
v
1
=
(
x
1
,
y
1
)
,
v
2
=
(
x
2
,
y
2
)
v_1=(x_1,y_1),v_2=(x_2,y_2)
v1=(x1,y1),v2=(x2,y2),我们可以直接计算它们对应向量的内积为:
<
p
(
v
1
)
,
p
(
v
2
)
>
=
<
(
x
1
2
,
2
x
1
y
1
,
y
1
2
)
,
(
(
x
2
2
,
2
x
2
y
2
,
y
2
2
)
>
<p(v_1),p(v_2)>=<(x^2_1,\sqrt{2}x_1y_1,y^2_1),((x^2_2,\sqrt{2}x_2y_2,y^2_2)>
<p(v1),p(v2)>=<(x12,2x1y1,y12),((x22,2x2y2,y22)>
很明显,这是一个3维运算。假如3维还是无法线性区分,要映射到N维去,那这里就是N维运算,N越大计算量越大。有没有办法能够降低这个计算量呢?我们来展开推导一下:
(
x
1
2
,
2
x
1
y
1
,
y
1
2
)
,
(
(
x
2
2
,
2
x
2
y
2
,
y
2
2
)
=
x
1
2
x
2
2
+
2
x
1
x
2
y
1
y
2
+
y
1
2
y
2
2
=
(
x
1
x
2
+
y
1
y
2
)
2
=
(
<
v
1
,
v
2
>
)
2
(x^2_1,\sqrt{2}x_1y_1,y^2_1),((x^2_2,\sqrt{2}x_2y_2,y^2_2)=x^2_1x^2_2+2x_1x_2y_1y_2+y^2_1y^2_2=(x_1x_2+y_1y_2)^2=(<v_1,v_2>)^2
(x12,2x1y1,y12),((x22,2x2y2,y22)=x12x22+2x1x2y1y2+y12y22=(x1x2+y1y2)2=(<v1,v2>)2
经过推导可以看到,两个数据点在映射后的向量内积等于映射前向量内积的平方。如果我们引入核函数:
K
(
v
1
,
v
2
)
=
(
<
v
1
,
v
2
>
)
2
K(v_1,v_2)=(<v_1,v_2>)^2
K(v1,v2)=(<v1,v2>)2,那么就可以通过核函数的计算来等价于映射后的向量内积,实现了高维向量运算转换为低维向量计算(本例中是2维向量运算代替了3维向量运算)。
由此看出,即使没有kernel,只要找到映射关系,我们仍然可以实现低维空间映射到高维空间,进而通过高维向量内积运算来寻找最佳分割超平面。但是,kernel的引入,降低了向量内积运算的计算复杂度。无论我们映射到几维空间,我们只要把原有维度代入核函数,就能等价于高维上的内积运算。极端的情况下,特征空间映射到了无穷维度空间,如果没有核函数,根本无法计算出映射后的向量内积。
现在,问题关键变成了,怎么去找合适的核函数,并不是任意的函数都能隐含低维到高维的映射关系吧?
线性核
K
(
x
,
y
)
=
x
y
T
+
c
K(x,y)=xy^T+c
K(x,y)=xyT+c
多项式核
K
(
x
,
y
)
=
(
α
x
T
y
+
c
)
d
K(x,y)=(\alpha x^Ty+c)^d
K(x,y)=(αxTy+c)d
径向基核函数
K
(
x
,
y
)
=
e
x
p
(
−
γ
∣
∣
x
−
y
∣
∣
2
)
K(x,y)=exp(-\gamma||x-y||^2)
K(x,y)=exp(−γ∣∣x−y∣∣2)
也叫高斯核
K
(
x
,
y
)
=
e
x
p
(
−
∣
∣
x
−
y
∣
∣
2
2
σ
2
)
K(x,y)=exp(-\frac{||x-y||^2}{2\sigma^2})
K(x,y)=exp(−2σ2∣∣x−y∣∣2)
K-近邻算法
文本分类算法、简单的机器学习算法、基本要素、距离度量、类别判定、k取值、改进策略
kNN算法是著名的模式识别统计学方法,是最好的文本分类算法之一,在机器学习分类算法中占有相当大的地位,是最简单的机器学习算法之一。
思
想
:
{\color{Red}思想:}
思想:
就
是
计
算
一
个
点
与
样
本
空
间
所
有
点
之
间
的
距
离
,
取
出
与
该
点
最
近
的
k
个
点
,
然
后
统
计
这
k
个
点
里
面
所
属
分
类
比
例
最
大
的
(
“
回
归
”
里
面
使
用
平
均
法
)
,
则
点
A
属
于
该
分
类
。
{\color{Green}就是计算一个点与样本空间所有点之间的距离,取出与该点最近的k个点,然后统计这k个点里面所属分类比例最大的(“回归”里面使用平均法),则点A属于该分类。}
就是计算一个点与样本空间所有点之间的距离,取出与该点最近的k个点,然后统计这k个点里面所属分类比例最大的(“回归”里面使用平均法),则点A属于该分类。
三
个
基
本
要
素
:
{\color{Red}三个基本要素:}
三个基本要素:
k
值
的
选
择
、
距
离
度
量
、
分
类
决
策
规
则
{\color{Green}k值的选择、距离度量、分类决策规则}
k值的选择、距离度量、分类决策规则
上图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。
算
法
步
骤
:
{\color{Red}算法步骤:}
算法步骤:
1、
算
距
离
:
{\color{Blue}算距离:}
算距离: 给定测试对象,计算它与训练集中的每个对象的距离;
2、
找
邻
居
:
{\color{Blue}找邻居:}
找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻;
3、
做
分
类
:
{\color{Blue}做分类:}
做分类:根据这k个近邻归属的主要类别,来对测试对象分类;
距
离
的
计
算
方
式
(
相
似
性
度
量
)
:
{\color{Red}距离的计算方式(相似性度量):}
距离的计算方式(相似性度量):
欧
式
距
离
:
d
(
x
,
y
)
=
[
∑
j
=
1
d
(
x
j
−
y
j
)
2
]
1
2
=
[
(
x
−
y
)
(
x
−
y
)
T
]
1
2
{\color{Blue}欧式距离:}d(x,y)=[\sum^d_{j=1}(x_j-y_j)^2]^{\frac{1}{2}}=[(x-y)(x-y)^T]^{\frac{1}{2}}
欧式距离:d(x,y)=[∑j=1d(xj−yj)2]21=[(x−y)(x−y)T]21
曼
哈
顿
距
离
:
d
(
x
,
y
)
=
∑
j
=
1
d
∣
x
j
−
y
j
∣
{\color{Blue}曼哈顿距离:}d(x,y)=\sum^d_{j=1}|x_j-y_j|
曼哈顿距离:d(x,y)=∑j=1d∣xj−yj∣
类
别
的
判
定
:
{\color{Red}类别的判定:}
类别的判定:
投
票
法
:
{\color{Blue}投票法:}
投票法:少数服从多数,近邻中哪个类别的点最多就分为该类。
加
权
投
票
法
:
{\color{Blue}加权投票法:}
加权投票法:根据距离的远近,对邻近的投票进行加权,距离越近则权重越大(权重为距离平方的倒数)。
K
−
近
邻
算
法
优
缺
点
:
{\color{Red}K-近邻算法优缺点:}
K−近邻算法优缺点:
优
点
:
{\color{Blue}优点:}
优点:
1、简单,易于理解,易于实现,无需估计参数,无需训练;
2、适合对稀有事件进行分类;
3、特别适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。
缺
点
:
{\color{Blue}缺点:}
缺点:
1、样本容量较小的类域采用这种算法比较容易产生误分。该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。
2、该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。3、可理解性差,无法给出像决策树那样的规则。
BP神经网络
转载https://www.jianshu.com/p/6ab6f53874f7
BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:
BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。
神经网络的基本组成单元是神经元。神经元的通用模型如图所示
神经元的输出为:
y
=
f
(
∑
i
=
1
m
w
i
x
i
)
y=f(\sum_{i=1}^mw_ix_i)
y=f(∑i=1mwixi)
其中常用的激活函数有阈值函数、sigmoid函数和双曲正切函数。
主要介绍2种激活函数,分别是sigmoid和relu函数,函数公式如下:
s
i
g
m
o
i
d
(
z
)
=
1
1
+
e
−
z
sigmoid(z)=\frac{1}{1+e^{-z}}
sigmoid(z)=1+e−z1
r
e
l
u
(
z
)
=
{
z
,
z
>
0
0
,
z
≦
0
relu(z)=\begin{cases} z,z>0 \\ 0,z\leqq0 \end{cases}
relu(z)={z,z>00,z≦0
注
意
:
{\color{Red}注意:}
注意:
引入激活函数的目的是在模型中引入非线性。如果没有激活函数,那么无论你的神经网络有多少层,最终都是一个线性映射,单纯的线性映射无法解决线性不可分问题。引入非线性可以让模型解决线性不可分问题。
一般来说,在神经网络的中间层更加建议使用relu relurelu函数,两个原因:
relu relurelu函数计算简单,可以加快模型速度;
由于反向传播过程中需要计算偏导数,通过求导可以得到sigmoid sigmoidsigmoid函数导数的最大值为0.25,如果使用sigmoid sigmoidsigmoid函数的话,每一层的反向传播都会使梯度最少变为原来的四分之一,当层数比较多的时候可能会造成梯度消失,从而模型无法收敛。
神经网络是将多个神经元按一定规则联结在一起而形成的网络,如图 所示。
从图 可以看出,一个神经网络包括输入层、隐含层(中间层)和输出层。输入层神经元个数与输入数据的维数相同,输出层神经元个数与需要拟合的数据个数相同,隐含层神经元个数与层数就需要设计者自己根据一些规则和目标来设定。在深度学习出现之前,隐含层的层数通常为一层,即通常使用的神经网络是3层网络。
朴素贝叶斯
贝叶斯原理与其他统计学推断方法截然不同,它是建立在主观判断的基础上:在我们不了解所有客观事实的情况下,同样可以先估计一个值,然后根据实际结果不断进行修正。
贝叶斯定理
1.2 贝叶斯定理
条件概率 是指在事件 B 发生的情况下,事件 A 发生的概率。通常记为 P(A | B)。
P
(
A
∣
B
)
=
P
(
A
∩
B
)
P
(
B
)
P(A | B)=\frac{P(A \cap B)}{P(B)}
P(A∣B)=P(B)P(A∩B)
因此
P
(
A
∩
B
)
=
P
(
A
∣
B
)
P
(
B
)
P(A \cap B)=P(A | B)P(B)
P(A∩B)=P(A∣B)P(B)
P
(
A
∩
B
)
=
P
(
B
∣
A
)
P
(
A
)
P(A \cap B)=P(B | A)P(A)
P(A∩B)=P(B∣A)P(A)
可得
P
(
A
∣
B
)
P
(
B
)
=
P
(
B
∣
A
)
P
(
A
)
P(A | B)P(B)=P(B | A)P(A)
P(A∣B)P(B)=P(B∣A)P(A)
由此可以推出贝叶斯公式
P
(
A
∣
B
)
=
P
(
B
∣
A
)
P
(
A
)
P
(
B
)
P(A | B)=\frac{P(B | A)P(A)}{P(B)}
P(A∣B)=P(B)P(B∣A)P(A)
贝叶斯推断
贝叶斯公式中,P(A)称为"先验概率"
P(A|B)称为"后验概率"
P(B|A)/P(B)称为"可能性函数",这是一个调整因子,使得预估概率更接近真实概率。
后验概率=先验概率 x 调整因子
贝
叶
斯
推
断
:
{\color{Red}贝叶斯推断:}
贝叶斯推断:我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。因为在分类中,只需要找出可能性最大的那个选项,而不需要知道具体那个类别的概率是多少,所以为了减少计算量,全概率公式在实际编程中可以不使用。
朴
素
贝
叶
斯
推
断
:
{\color{Red}朴素贝叶斯推断:}
朴素贝叶斯推断:是在贝叶斯推断的基础上,对条件概率分布做了条件独立性的假设。因此可得朴素贝叶斯分类器的表达式。因为以自变量之间的独立(条件特征独立)性和连续变量的正态性假设为前提,就会导致算法精度在某种程度上受影响。
y
^
=
a
r
g
m
a
x
c
∈
Y
P
(
c
)
∏
i
=
1
d
P
(
x
i
∣
c
)
\widehat{y}=argmax_{c\in Y}P(c)\begin{matrix} \prod_{i=1}^d P(x_i|c) \end{matrix}
y
=argmaxc∈YP(c)∏i=1dP(xi∣c)
似然函数:
你可以把概率模型的训练过程理解为求参数估计的过程。似然在这里就是可能性的意思,它是关于统计参数的函数。
朴素贝叶斯模型由两种类型的概率组成:
1、每个类别的概率P(C_j);
2、每个属性的条件概率P(A_i|C_j)。
贝
叶
斯
原
理
、
贝
叶
斯
分
类
和
朴
素
贝
叶
斯
{\color{Red}贝叶斯原理、贝叶斯分类和朴素贝叶斯}
贝叶斯原理、贝叶斯分类和朴素贝叶斯这三者之间是有区别的:
贝叶斯原理是最大的概念,它解决了概率论中“逆向概率”的问题,在这个理论基础上,人们设计出了贝叶斯分类器,朴素贝叶斯分类是贝叶斯分类器中的一种,也是最简单,最常用的分类器。朴素贝叶斯之所以朴素是因为它假设属性是相互独立的,因此对实际情况有所约束,如果属性之间存在关联,分类准确率会降低。不过好在对于大部分情况下,朴素贝叶斯的分类效果都不错。
离散数据案例
我以下面的数据为例,这些是根据你之前的经验所获得的数据。然后给你一个新的数据:身高“高”、体重“中”,鞋码“中”,请问这个人是男还是女?
男女就是类型,男C1,女C2;
属性条件:身高A1,体重A2,鞋码A3
那么我们想求在 A1、A2、A3 属性下,Cj 的概率,用条件概率表示就是 P(Cj|A1A2A3)。根据上面讲的贝叶斯的公式,我们可以得出:
P
(
C
j
∣
A
1
A
2
A
3
)
=
P
(
A
1
A
2
A
3
∣
C
j
)
P
(
C
j
)
P
(
A
1
A
2
A
3
)
P(C_j|A_1A_2A_3)=\frac{P(A_1A_2A_3|C_j)P(C_j)}{P(A_1A_2A_3)}
P(Cj∣A1A2A3)=P(A1A2A3)P(A1A2A3∣Cj)P(Cj)
因为一共有 2 个类别,所以我们只需要求得
P
(
C
1
∣
A
1
A
2
A
3
)
P(C_1|A_1A_2A_3)
P(C1∣A1A2A3) 和
P
(
C
2
∣
A
1
A
2
A
3
)
P(C_2|A_1A_2A_3)
P(C2∣A1A2A3) 的概率即可,然后比较下哪个分类的可能性大,就是哪个分类结果。
等价于求
P
(
A
1
A
2
A
3
∣
C
j
)
P
(
C
j
)
P(A_1A_2A_3|C_j)P(C_j)
P(A1A2A3∣Cj)P(Cj) 最大值。
我们假定
A
i
A_i
Ai之间是相互独立的,那么:
P
(
A
1
A
2
A
3
∣
C
j
)
=
P
(
A
1
∣
C
j
)
P
(
A
2
∣
C
j
)
P
(
A
3
∣
C
j
)
P(A_1A_2A_3|C_j)=P(A_1|C_j)P(A_2|C_j)P(A_3|C_j)
P(A1A2A3∣Cj)=P(A1∣Cj)P(A2∣Cj)P(A3∣Cj)
连续数据案例
那么如果给你一个新的数据,身高 180、体重 120,鞋码 41,请问该人是男是女呢?
公式还是上面的公式,这里的困难在于,由于身高、体重、鞋码都是连续变量,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算。怎么办呢?
这时,可以假设男性和女性的身高、体重、鞋码都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。
有了密度函数,就可以把值代入,算出某一点的密度函数的值。
比如,男性的身高是均值 179.5、标准差为 3.697 的正态分布。(我们选择不同条件下的样本,得出的均值,标准差就是条件下的概率分布了。这点稍后计算中体现)
所以男性的身高为 180 的概率为 0.1069。怎么计算得出的呢?
NORMDIST(x,mean,standard_dev,cumulative) 函数,一共有 4 个参数:
这里我们使用的是NORMDIST(180,179.5,3.697,0)=0.1069。
同理我们可以计算得出男性体重为 120 的概率为0.000382324,男性鞋码为 41 号的概率为 0.120304111。
很明显这组数据分类为男的概率大于分类为女的概率。
总结:
朴
素
贝
叶
斯
分
类
常
用
于
文
本
分
类
,
尤
其
是
对
于
英
文
等
语
言
来
说
,
分
类
效
果
很
好
。
它
常
用
于
垃
圾
文
本
过
滤
、
情
感
预
测
、
推
荐
系
统
等
。
{\color{Red}朴素贝叶斯分类常用于文本分类,尤其是对于英文等语言来说,分类效果很好。它常用于垃圾文本过滤、情感预测、推荐系统等。}
朴素贝叶斯分类常用于文本分类,尤其是对于英文等语言来说,分类效果很好。它常用于垃圾文本过滤、情感预测、推荐系统等。
第一阶段:准备阶段
在这个阶段我们需要确定特征属性,比如上面案例中的“身高”、“体重”、“鞋码”等,同时明确预测值是什么。并对每个特征属性进行适当划分,然后由人工对一部分数据进行分类,形成训练样本。
第二阶段:训练阶段
这个阶段就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率。
第三阶段:应用阶段
这个阶段是使用分类器对新数据进行分类。
贝叶斯算法的优缺点
优点:
(1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
(2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
(3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
缺点:
(1)理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
(2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
(3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
(4)对输入数据的表达形式很敏感。