'感知机','k近邻','朴素贝叶斯'

’感知机’,‘k近邻’,'朴素贝叶斯’

一、模型的泛化能力?

学习方法的泛化能力是指由该方法学习到的模型对未知数据的预测能力;是学习方法本质上的重要性质。现实中采用最多的办法就是通过测试误差来评价学习方法的泛化能力。但这种评价是依赖于测试数据集的,因为测试数据集是有限的,很可能得到的评价结果是不可靠的。

简单说,模型的泛化能力是指已经训练好的模型,对于非训练数据集进行测试的误差程度;

二、梯度下降法的思想和内容。

梯度定义:

某一函数沿着某点处的方向到处可以以最快速度取到极大值,该方向导数定义为该函数的梯度。

∇ = df ( θ ) dθ \nabla = \frac{\text{df}\left( \theta \right)}{\text{dθ}} =df(θ)

其中, θ \theta θ是自变量; ∇ \nabla 表示梯度; f ( θ ) f\left( \theta \right) f(θ)是关于 θ \theta θ的函数;

我们要解决的梯度下降的公式为:

θ =   θ 0 − η ∙ ∇ f ( θ 0 ) \theta = \ \theta_{0} - \eta \bullet \nabla f\left( \theta_{0} \right) θ= θ0ηf(θ0)

其中, η \eta η为步长, θ \theta θ是由 θ 0 \theta_{0} θ0按照上式更新后的值;

梯度下降法合理性证明:

由泰勒公式可知

f ( θ ) ≈   f ( θ 0 ) + ( θ − θ 0 ) ∙ ∇ f ( θ 0 ) f\left( \theta \right) \approx \ f\left( \theta_{0} \right) + \left( \theta - \theta_{0} \right) \bullet \nabla f\left( \theta_{0} \right) f(θ) f(θ0)+(θθ0)f(θ0)

因为 θ − θ 0 \theta - \theta_{0} θθ0为矢量,而 η \eta η为标量,因此用 v v v表示 θ − θ 0 \theta - \theta_{0} θθ0的单位,因此

θ −   θ 0 = η ∙ v \theta - \ \theta_{0} = \eta \bullet v θ θ0=ηv

其中 θ −   θ 0 \theta - \ \theta_{0} θ θ0应该尽可能小,原式替换为

f ( θ ) ≈   f ( θ 0 ) + η v ∙ ∇ f ( θ 0 ) f\left( \theta \right) \approx \ f\left( \theta_{0} \right) + \eta v \bullet \nabla f\left( \theta_{0} \right) f(θ) f(θ0)+ηvf(θ0)

由于局部下降的目的是希望每次更新的 θ \theta θ都能让 f ( θ ) f\left( \theta \right) f(θ)变小,因此则有

f ( θ ) − f ( θ 0 ) ≈ η v ∙ ∇ f ( θ 0 ) < 0 f\left( \theta \right) - f\left( \theta_{0} \right) \approx \eta v \bullet \nabla f\left( \theta_{0} \right) < 0 f(θ)f(θ0)ηvf(θ0)<0

其中因为 η \eta η为标量,且一般为正数,所以不等式转换为:

v ∙ ∇ f ( θ 0 ) < 0 v \bullet \nabla f\left( \theta_{0} \right) < 0 vf(θ0)<0

显然 v v v表示下一步前进的单位向量; ∇ f ( θ 0 ) \nabla f\left( \theta_{0} \right) f(θ0)表示当前位置的梯度方向;

若A,B均为向量, α \alpha α为两个向量之间的夹角;

显然 A ⋅ B = ∥ A ∥ ⋅ ∥ B ∥ ⋅ cos ⁡ α A \cdot B = \left\| A \right\| \cdot \left\| B \right\|{\cdot \cos}\alpha AB=ABcosα,因此若要AB乘积最小,则AB反向;

也就是 v v vKaTeX parse error: Undefined control sequence: \the at position 16: \nabla f\left( \̲t̲h̲e̲ ̲ta_{0} \right)互为反向,v和当前梯度方向相反能让 v ⋅   ∇ f ( θ 0 ) v \cdot \ \nabla f\left( \theta_{0} \right) v f(θ0)最大程度小,也就保证了v的方向是局部下降最快的;

v = −   ∇ f ( θ 0 )   ∥ ∇ f ( θ 0 ) ∥ v = - \frac{\ \nabla f\left( \theta_{0} \right)}{\ \left\| \nabla f\left( \theta_{0} \right) \right\|} v= f(θ0) f(θ0)

因此带入 θ −   θ 0 = η ∙ v \theta - \ \theta_{0} = \eta \bullet v θ θ0=ηv,所以 θ   = θ 0 − η ∙   ∇ f ( θ 0 )   ∥ ∇ f ( θ 0 ) ∥ \theta\ = \theta_{0} - \eta \bullet \frac{\ \nabla f\left( \theta_{0} \right)}{\ \left\| \nabla f\left( \theta_{0} \right) \right\|} θ =θ0η f(θ0) f(θ0)

因为   ∥ ∇ f ( θ 0 ) ∥ \ \left\| \nabla f\left( \theta_{0} \right) \right\|  f(θ0)是标量,可以并入到进步因子 η \eta η,最终

θ   = θ 0 − η ∙ ∇ f ( θ 0 ) \theta\ = \theta_{0} - \eta \bullet \nabla f\left( \theta_{0} \right) θ =θ0ηf(θ0)

梯度下降法:

函数沿梯度方向具有最大的变化率,那么在优化目标函数的时候,自然是沿着负梯度方向去减小函数值,以此达到我们的优化目标:

grad f ( x 0 , x 1 , ⋯   , x n ) = (   ∂ f   ∂ x 0 , ⋯   ,   ∂ f   ∂ x n ) \text{grad}f\left( x_{0},x_{1},\cdots,x_{n} \right) = \left( \frac{\ \partial f}{\ \partial x_{0}},\cdots,\frac{\ \partial f}{\ \partial x_{n}} \right) gradf(x0,x1,,xn)=( x0 f,, xn f)

同时梯度和偏导数都是向量,那么参考向量运算法则

Repeat{

x 0 : = x 0 − α   ∂ f   ∂ x 0 x_{0} : = x_{0} - \alpha\frac{\ \partial f}{\ \partial x_{0}} x0:=x0α x0 f

⋮ \vdots

x j : = x j − α   ∂ f   ∂ x j x_{j} : = x_{j} - \alpha\frac{\ \partial f}{\ \partial x_{j}} xj:=xjα xj f

⋮ \vdots

x n : = x n − α   ∂ f   ∂ x n x_{n} : = x_{n} - \alpha\frac{\ \partial f}{\ \partial x_{n}} xn:=xnα xn f

}

三、感知机的原理;

模型定义:

假设输入空间是 x ⊆ R n x \subseteq R^{n} xRn输出空间是 y = { + 1 , − 1 } y = \left\{ + 1, - 1 \right\} y={+11},由输入空间到输出空间的函数

f ( x ) = s i g n ( w ⋅ x + b ) f\left( x \right) = sign\left( w \cdot x + b \right) f(x)=sign(wx+b)称为感知机;

其中,W和b称为感知机模型参数, w ∈ R n w \in R^{n} wRn叫做权重(weight)或权重向量, b ∈ R b \in R bR叫做偏置(bias);

感知机学习策略:

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。为了找出这样的超平面需要定义经验损失函数并将其最小化;

损失函数的一个自然选择是误分类点总数,但是这样的损失函数不是参数w,b的连续可导函数不容易优化。因此另一个选择就是误分类点到超平面s的总距离,这就是感知机模型采用的。

对于误分类点 x i x_{i} xi到超平面 S S S的距离是

− 1 ∥ w ∥ y i ( w ⋅ x i + b ) , 其 中 ∥ w ∥ 为 w 的 范 数 - \frac{1}{\left\| w \right\|}y_{i}\left( w \cdot x_{i} + b \right),其中\left\| w \right\| 为w的范数 w1yi(wxi+b),ww

这样,假设误分类点的集合为M,那么所有误分类点到超平面S的总距离为

− 1 ∥ w ∥ ∑ x i ∈ M y i   ( w ⋅ x i + b ) - \frac{1}{\left\| w \right\|}\sum_{x_{i} \in M}^{}{y_{i}\ \left( w \cdot x_{i} + b \right)} w1xiMyi (wxi+b)

不考虑 1 ∥ w ∥ \frac{1}{\left\| w \right\|} w1,就得到了感知机学习的损失函数

L ( w , b ) = − ∑ x i ∈ M y i   ( w ⋅ x i + b ) L\left( w,b \right) = - \sum_{x_{i} \in M}^{}{y_{i}\ \left( w \cdot x_{i} + b \right)} L(w,b)=xiMyi (wxi+b)

这个损失函数就是感知机学习的经验风险函数,感知机学习的策略就是在假设空间中选取损失函数最小的模型参数 w , b w,b w,b

感知机学习算法:

感知机学习算法是误分类驱动的,具体采用随机梯度下降法。及消化的过程不是一次让M中所有误分类点的梯度下降,而是随机的选择其中一个分类点使其梯度下降;

原始形式:

a. 选取初始值 w 0 , B 0 w_{0},B_{0} w0,B0

b. 在训练集中选取数据 ( x i , y i ) {(x}_{i},y_{i)} (xi,yi)

c. 如果 y i   ( w ⋅ x i + b ) ≤ 0 , y_{i}\ \left( w \cdot x_{i} + b \right) \leq 0, yi (wxi+b)0, w ← w + η y i x i w \leftarrow w + \eta y_{i}x_{i} ww+ηyixi b ← b + η y i b \leftarrow b + \eta y_{i} bb+ηyi

d. 转至(b),直至训练数据集中没有误分类点;

其收敛性可以从(Novikoff)定理得知

y i ( w opt ⋅ x i + b opt ) ≥ γ y_{i}\left( w_{\text{opt}} \cdot x_{i} + b_{\text{opt}} \right) \geq \gamma yi(woptxi+bopt)γ; k   ≤   (   R γ   ) 2 k\ \leq {\ \left( \ \frac{R}{\gamma}\ \right)}^{2} k  ( γR )2;

此外,当数据集线性可分的时候,感知机学习算法的原始形式是收敛的,而训练集线性不可分的时候,学习算法不收敛,迭代结果会发生震荡;

对偶形式:

设修改次数为n则 a i =   η n i \mathbf{a}_{\mathbf{i}}\mathbf{= \ }\mathbf{\eta}\mathbf{n}_{\mathbf{i}} ai= ηni原始形式中不难看出

w = ∑ j = 1 N ( a j x j y j ) , b = ∑ j = 1 N ( a j y j ) w = \sum_{j = 1}^{N}\left( a_{j}x_{j}y_{j} \right),b = \sum_{j = 1}^{N}\left( a_{j}y_{j} \right) w=j=1N(ajxjyj),b=j=1N(ajyj)

实例点更新次数越多,意味着它距离分离超平面越近,也就越难正确分类,这样对结果影响最大;

a) a ← 0 a \leftarrow 0 a0,   b ← 0 \ b \leftarrow 0  b0

b) 在训练集中选取数据 ( x i , y i ) {(x}_{i},y_{i)} (xi,yi)

c) 如果 y i   ∑ j = 1 N ( a j x j y j ⋅ x i + b ) ≤ 0 , y_{i}\ \sum_{j = 1}^{N}\left( a_{j}x_{j}y_{j} \cdot x_{i} + b \right) \leq 0, yi j=1N(ajxjyjxi+b)0, w ← w + η y i x i w \leftarrow w + \eta y_{i}x_{i} ww+ηyixi, b ← b + η y i b \leftarrow b + \eta y_{i} bb+ηyi

d) 转至(b),直至训练数据集中没有误分类点;

对偶形式中训练示例仅以内积的形式出现。为了方便,可以预先将训练集中实例间的内机计算出来并用矩阵的形式存储,这个就是所谓的Gram矩阵;

G = [ x i ⋅ x j ] n × n G = \left\lbrack x_{i} \cdot x_{j} \right\rbrack_{n \times n} G=[xixj]n×n

四、K近邻的原理;

核心原理:

  1. 根据给定的距离度量,在训练集 T T T中找出与 x x x最邻近的 k k k个点,涵盖这 k k k个点的 x x x的邻域记作 N k ( x ) ; N_{k}\left( x \right); Nk(x);

  2. N k ( x ) N_{k}\left( x \right) Nk(x)中根据分类决策规则(如多数表决)决定 x x x的类别 y y y

相关细节:

  • K邻近算法的特殊情况是 k = 1 k = 1 k=1的时候称为最邻近模型。

  • K近邻没有显示的学习过程

  • K近邻算法中,当训练集、距离度量(欧氏距离)、k值、分类决策规则(如多数表决)确定后,对于任何一个新的输入,他所属的类别唯一确定。每个训练点拥有一个单元,所有训练示例点构成对特征空间的划分每个单元都有其所在点的类标记;

  • 距离度量:度量距离通常用欧氏距离,也可用更一般的 L p L_{p} Lp距离(p根据情况取);

L p ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ p ) 1 n L_{p}\left( x_{i}{,x}_{j} \right) = \left( \sum_{l = 1}^{n}\left| x_{i}^{\left( l \right)} - x_{j}^{\left( l \right)} \right|^{p} \right)^{\frac{1}{n}} Lp(xi,xj)=(l=1nxi(l)xj(l)p)n1

  • K值:一般取一个比较小的数值,如果过小会造成过拟合,过大会让整体模型变得简单,通常采用交叉验证法来选取最优的k值

  • **分类决策规则:**往往是多数表决,多数表决等价于经验风险最小化;

  • K近邻算法主要需要考虑对训练数据进行快速k近邻搜索,为了提高k近邻搜索的效率,可以考虑使用特殊的结构存储训练的数据,具体方法有很多,kd树就是其中的一种;

五、朴素贝叶斯的原理;

基本方法:

朴素贝叶斯法对条件概率分布做了条件独立性假设。由于这是一个较强的假设,朴素贝叶斯法也因此得名,具体的,条件独立性假设是:

P ( X = x ∣ y = c k ) = P ( X ( 1 ) = x ( 1 ) , ⋯   , X ( n ) = x ( n ) | y = c k ) P\left( X = x|y = c_{k} \right) = P\left( X^{\left( 1 \right)} = x^{\left( 1 \right)},\cdots,X^{\left( n \right)} = x^{\left( n \right)} \middle| y = c_{k} \right) P(X=xy=ck)=P(X(1)=x(1),,X(n)=x(n)y=ck)

= ∏ j = 1 n P ( X ( j ) = x ( j ) | y = c k ) ( 1 ) = \prod_{j = 1}^{n}{P\left( X^{\left( j \right)} = x^{\left( j \right)} \middle| y = c_{k} \right)}(1) =j=1nP(X(j)=x(j)y=ck)1

条件独立性假设等同于说用于分类的特征在类确定的条件下都是条件独立的。这一假设使得朴素贝叶斯比较简单,但也会牺牲准确率;

后验概率计算根据贝叶斯定理进行:

P ( y = c k ∣ X = x ) = P ( X = x ∣ y = c k ) P ( y = c k ) ∑ k P ( X = x ∣ y = c k ) P ( y = c k )      ( 2 ) P\left( y = c_{k}|X = x \right) = \frac{P\left( X = x|y = c_{k} \right)P\left( y = c_{k} \right)}{\sum_{k}^{}{P\left( X = x|y = c_{k} \right)P\left( y = c_{k} \right)}}\text{\ \ \ \ }(2) P(y=ckX=x)=kP(X=xy=ck)P(y=ck)P(X=xy=ck)P(y=ck)    2

将(1)带入(2)中,就有朴素贝叶斯分类的基本公式,朴素贝叶斯分类器可表示为:

y = f ( x ) = arg  max ⁡ ck P ( y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) | y = c k ) ∑ k P ( y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) | y = c k )   {y = f\left( x \right) = {\text{arg\ }\max_{\text{ck}}}\frac{P\left( y = c_{k} \right)\prod_{j = 1}^{n}{P\left( X^{\left( j \right)} = x^{\left( j \right)} \middle| y = c_{k} \right)}}{\sum_{k}^{}{P\left( y = c_{k} \right)\prod_{j = 1}^{n}{P\left( X^{\left( j \right)} = x^{\left( j \right)} \middle| y = c_{k} \right)}}}}_{\ } y=f(x)=arg ckmaxkP(y=ck)j=1nP(X(j)=x(j)y=ck)P(y=ck)j=1nP(X(j)=x(j)y=ck) 

由于坟墓对所有的 c k c_{k} ck都是相同的,所以

y = arg ⁡   max ⁡ ck   P ( y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) | y = c k ) {y = \arg\ \max_{\text{ck}}}_{\ }P\left( y = c_{k} \right)\prod_{j = 1}^{n}{P\left( X^{\left( j \right)} = x^{\left( j \right)} \middle| y = c_{k} \right)} y=arg ckmax P(y=ck)j=1nP(X(j)=x(j)y=ck)

后概率最大化:

朴素贝叶斯法将实力分到后验概率最大的类中,等价于期望风险最小化。假设

L ( Y , f ( x ) ) = { 1 , Y ≠ f ( x ) 0 , Y = f ( x )   L\left( Y,f\left( x \right) \right) = \left\{ \begin{matrix} 1,Y \neq f(x) \\ 0,Y = f(x) \\ \end{matrix} \right.\ L(Y,f(x))={1,Y=f(x)0,Y=f(x) 

其中 f ( x ) f(x) f(x)为分类决策函数,此时期望风险函数为

R exp ⁡ ( f ) = E [ L ( Y , f ( x ) ) ] R_{\exp}\left( f \right) = E\left\lbrack L(Y,f(x)) \right\rbrack Rexp(f)=E[L(Y,f(x))]

期望是对分布 P ( X , Y ) P(X,Y) P(X,Y)取的,由此条件期望

R exp ⁡ ( f ) = E ∑ k = 1 k [ L ( c k , f ( x ) ) ] P ( c k ∣ X ) R_{\exp}\left( f \right) = E\sum_{k = 1}^{k}{\left\lbrack L\left( c_{k},f\left( x \right) \right) \right\rbrack P(c_{k}|X)} Rexp(f)=Ek=1k[L(ck,f(x))]P(ckX)

为了使期望风险最小化,只需对* X = x X = x X=x*逐个极小化,由此得到

f ( x ) = a r g min ⁡ yϵY ∑ k = 1 k L ( c k , y ) P ( c k | X = x ) f\left( x \right) = arg\min_{\text{yϵY}}{\sum_{k = 1}^{k}{L\left( c_{k},y \right)P\left( c_{k} \middle| X = x \right)}} f(x)=argyϵYmink=1kL(ck,y)P(ckX=x)

= a r g min ⁡ yϵY ∑ k = 1 k P ( y ≠ c k ∣ X = x ) = arg\min_{\text{yϵY}}{\sum_{k = 1}^{k}{P(y \neq c_{k}|X = x)}} =argyϵYmink=1kP(y=ckX=x)

= a r g min ⁡ yϵY ( 1 − P ( y = c k | X = x ) ) = arg\min_{\text{yϵY}}{(1 - P\left( y = c_{k} \middle| X = x \right))} =argyϵYmin(1P(y=ckX=x))

= a r g max ⁡ yϵY P ( y = c k | X = x ) = arg\max_{\text{yϵY}}{P\left( y = c_{k} \middle| X = x \right)} =argyϵYmaxP(y=ckX=x)

这样一来就根据风险最小化准则得到了后验概率最大化准则

f ( x ) =   a r g max ⁡ ck P ( y = c k | X = x ) f\left( x \right) = \ arg\max_{\text{ck}}{P\left( y = c_{k} \middle| X = x \right)} f(x)= argckmaxP(y=ckX=x)

也就是朴素贝叶斯的原理;

朴素贝叶斯的参数估计:

极大似然估计:

在朴素贝叶斯法中,学习就意味着估计 P ( Y = c k ) P(Y = c_{k}) P(Y=ck) P ( X ( j ) = x ( j ) | y = c k ) P\left( X^{(j)} = x^{(j)} \middle| y = c_{k} \right) P(X(j)=x(j)y=ck),可以应用极大似然估计法(模型确定,且样本量大)估计相应的概率

先验概率:

P ( Y = c k ) = ∑ i = 1 n I ( y i = c k ) N P\left( Y = c_{k} \right) = \frac{\sum_{i = 1}^{n}{I(y_{i}{= c}_{k})}}{N} P(Y=ck)=Ni=1nI(yi=ck)

条件概率:

P ( X ( j ) = x ( j ) | y = c k ) = ∑ i = 1 n I ( x i ( j ) = a jl , y i = c k ) ∑ i = 1 n I ( y k = c k ) P\left( X^{(j)} = x^{(j)} \middle| y = c_{k} \right) = \frac{\sum_{i = 1}^{n}{I(x_{i}^{\left( j \right)} = a_{\text{jl}},y_{i}{= c}_{k})}}{\sum_{i = 1}^{n}{I(y_{k}{= c}_{k})}} P(X(j)=x(j)y=ck)=i=1nI(yk=ck)i=1nI(xi(j)=ajlyi=ck)

贝叶斯估计:

使用极大似然估计可能会出现索要估计得概率值为0的情况。这会影响到后验概率的计算结果,是分类产生偏差。解决方案是采用贝叶斯估计:

条件概率:

P ( X ( j ) = x ( j ) | y = c k ) = ∑ i = 1 n I ( x i ( j ) = a jl , y i = c k ) + λ ∑ i = 1 n I ( y k = c k ) + S j λ P\left( X^{(j)} = x^{(j)} \middle| y = c_{k} \right) = \frac{\sum_{i = 1}^{n}{I\left( x_{i}^{\left( j \right)} = a_{\text{jl}},y_{i}{= c}_{k} \right) + \lambda}}{\sum_{i = 1}^{n}{I(y_{k}{= c}_{k})} + S_{j}\lambda} P(X(j)=x(j)y=ck)=i=1nI(yk=ck)+Sjλi=1nI(xi(j)=ajlyi=ck)+λ

先验概率:

P ( Y = c k ) = ∑ i = 1 n I ( y i = c k ) + λ N + k λ P\left( Y = c_{k} \right) = \frac{\sum_{i = 1}^{n}{I\left( y_{i}{= c}_{k} \right) + \lambda}}{N + k\lambda} P(Y=ck)=N+kλi=1nI(yi=ck)+λ

学习和分类算法:

  • 计算先验概率及条件概率

  • 对于给定的实例x,计算

P ( y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) | y = c k ) P\left( y = c_{k} \right)\prod_{j = 1}^{n}{P\left( X^{\left( j \right)} = x^{\left( j \right)} \middle| y = c_{k} \right)} P(y=ck)j=1nP(X(j)=x(j)y=ck)

  • 确定实例* x x x*的类

y = arg ⁡   max ⁡ ck   P ( y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) | y = c k ) {y = \arg\ \max_{\text{ck}}}_{\ }P\left( y = c_{k} \right)\prod_{j = 1}^{n}{P\left( X^{\left( j \right)} = x^{\left( j \right)} \middle| y = c_{k} \right)} y=arg ckmax P(y=ck)j=1nP(X(j)=x(j)y=ck)

六、朴素贝叶斯简单实例;

原理:

朴素贝叶斯发法具体算法如上描述;

源码:

数据集来源《统计学习方法》63页例题一

%%---------------------程序入口---------------------

clc
clear
%书中例题实现朴素贝叶斯
%特征1的取值集合
A1=[1;2;3];
%特征2的取值集合
A2=[4;5;6];%S M L
AValues={A1;A2};
%Y的取值集合
YValue=[-1;1];
%数据集和
T=[ 1,4,-1;
    1,5,-1;
    1,5,1;
    1,4,1;
    1,4,-1;
    2,4,-1;
    2,5,-1;
    2,5,1;
    2,6,1;
    2,6,1;
    3,6,1;
    3,5,1;
    3,5,1;
    3,6,1;
    3,6,-1];
%训练朴素贝叶斯模型
theta = NBtrain(T(:, 1:size(T, 2) - 1), T(:, size(T, 2)), AValues, YValue);
%训练带la平滑的朴素贝叶斯模型
ltheta = LaplaceNBtrain(T(:, 1:size(T, 2) - 1), T(:, size(T, 2)), AValues, YValue, 1);
%测试两个数据与书中答案相符
correct = 0;
for i=1:length(T)
    if NBtest(theta, [T(i,1),T(i,2);], AValues, YValue)*T(i,3)==1
        correct = correct + 1;
    end
end
accuracy = correct/length(T);
disp(['极大似然做出参数估计对原始数据的准确率为'  num2str(accuracy)])


correct = 0;
 for i=1:length(T)
    if NBtest(ltheta, [T(i,1),T(i,2);], AValues, YValue)*T(i,3)==1
        correct = correct + 1;
    end
 end
accuracy = correct/length(T);
disp(['贝叶斯估计做出参数估计对原始数据的准确率为'  num2str(accuracy)])

%%---------------------使用训练模型进行预测---------------------

function y = NBtest(theta, X, AValues, YValue)
    Xindice=ones(size(X, 1), size(X, 2));
    %找到特征在取值集合中的下标,将X矩阵转化为下标矩阵
    for j=1:1:size(X, 2)
        AXi = AValues{j, 1};
        for i=1:1:size(X, 1)
            for t=1:1:size(AXi, 1)
                if(X(i, j) == AXi(t, 1))
                    Xindice(i, j) = t;
                    break
                end
            end
        end
    end
    %矩阵用于记录所有X在不同Yi下的P(X|Y)P(Y)
    Ys = zeros(size(X, 1), size(YValue, 1));
    PX_Y = theta{1,1};
    PY = theta{2,1};
    for i=1:1:size(Ys, 1)
        x=Xindice(i, :);
        for k=1:1:size(Ys, 2)
            ans = PY(k, 1);
            for j=1:1:size(x, 2)
                ans = ans * PX_Y{k, j}(x(1, j), 1);
            end
            Ys(i, k) = ans;
        end
    end
    Ys;
    %后验概率最大化
    y=zeros(size(Ys, 1), 1);
    for i=1:1:size(Ys, 1)
        max = -1;
        max_indice = 0;
        for j=1:1:size(Ys, 2)
            if(Ys(i, j) > max)
                max = Ys(i, j);
                max_indice = j;
            end
        end
        y(i, 1) = YValue(max_indice, 1);
    end
end

%---------------------极大似然估计---------------------

function theta=NBtrain(X,Y,AValues,YValue)
    %计算先验概率
    TY = zeros(size(YValue, 1), 1);
    for i=1:1:size(Y, 1)
        for j=1:1:size(YValue)
            if(Y(i, 1) == YValue(j, 1))
                Y(i,1);
                TY(j, 1) = TY(j, 1) + 1;
            end
        end
    end
    PY = TY/size(Y, 1);
    %计算条件概率
    PX_Y=cell(size(YValue, 1), size(X, 2));
    for k=1:1:size(YValue, 1)
        %条件y=yk
        for i=1:1:size(X, 2)
            %i为特征编号
            %取得第i个特征的取值集合
            XAi = AValues{i, 1};
            TXij_Y = zeros(size(XAi, 1), 1);
            for j=1:1:size(XAi, 1)
                %查找数据中所有Y=yk且特征i的值为Aij的数据个数并累加
                for t=1:1:size(X, 1)
                    if(Y(t, 1)==YValue(k, 1) && X(t, i) == XAi(j, 1))
                        TXij_Y(j, 1) = TXij_Y(j, 1) + 1;
                    end
                end
            end
            PX_Y{k, i} = TXij_Y/TY(k, 1);
        end
    end
    theta = cell(2,1);
    theta{1,1} = PX_Y;
    theta{2,1} = PY;
end
%---------------------贝叶斯估计---------------------

function theta=LaplaceNBtrain(X,Y,AValues,YValue,lambda)
    %计算先验概率
    TY = zeros(size(YValue, 1), 1);
    for i=1:1:size(Y, 1)
        for j=1:1:size(YValue)
            if(Y(i, 1) == YValue(j, 1))
                Y(i,1);
                TY(j, 1) = TY(j, 1) + 1;
            end
        end
    end
    PY = (TY + lambda)/(size(Y, 1) + lambda * size(YValue, 1));
    %计算条件概率
    PX_Y=cell(size(YValue, 1), size(X, 2));
    for k=1:1:size(YValue, 1)
        %条件y=yk
        for i=1:1:size(X, 2)
            %i为特征编号
            %取得第i个特征的取值集合
            XAi = AValues{i, 1};
            TXij_Y = zeros(size(XAi, 1), 1);
            for j=1:1:size(XAi, 1)
                %查找数据中所有Y=yk且特征i的值为Aij的数据个数并累加
                for t=1:1:size(X, 1)
                    if(Y(t, 1)==YValue(k, 1) && X(t, i) == XAi(j, 1))
                        TXij_Y(j, 1) = TXij_Y(j, 1) + 1;
                    end
                end
            end
            PX_Y{k, i} = (TXij_Y + lambda)/(TY(k, 1) + lambda * size(XAi, 1));
        end
    end
    theta = cell(2,1);
    theta{1,1} = PX_Y;
    theta{2,1} = PY;
end

实验结果:

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要先加载所需的库和数据集: ```R library(e1071) # 支持向量机 library(class) # K近邻 library(naivebayes) # 朴素贝叶斯 library(rpart) # 决策树 library(perceptron) # 感知机 data(germancredit) ``` 然后,需要将数据集分成训练集和测试集: ```R set.seed(123) trainIndex <- sample(1:nrow(germancredit), 0.7*nrow(germancredit)) train <- germancredit[trainIndex, ] test <- germancredit[-trainIndex, ] ``` 接下来,分别使用感知机法、K近邻法、朴素贝叶斯法、决策树法和线性支持向量机法构建分类器: ```R # 感知机法 model_perceptron <- perceptron(formula = Creditability ~ ., data = train) pred_perceptron <- predict(model_perceptron, newdata = test) # K近邻法 model_knn <- knn(train = train[, -1], test = test[, -1], cl = train$Creditability, k = 5) pred_knn <- as.numeric(model_knn) # 朴素贝叶斯法 model_nb <- naiveBayes(Creditability ~ ., data = train) pred_nb <- predict(model_nb, newdata = test) # 决策树法 model_tree <- rpart(Creditability ~ ., data = train, method = "class") pred_tree <- predict(model_tree, newdata = test, type = "class") # 线性支持向量机法 model_svm <- svm(Creditability ~ ., data = train, kernel = "linear") pred_svm <- predict(model_svm, newdata = test) ``` 最后,可以使用混淆矩阵和准确率等指标来评估分类器的性能: ```R # 感知机法 table(pred_perceptron, test$Creditability) # 准确率 mean(pred_perceptron == test$Creditability) # K近邻法 table(pred_knn, test$Creditability) # 准确率 mean(pred_knn == test$Creditability) # 朴素贝叶斯法 table(pred_nb, test$Creditability) # 准确率 mean(pred_nb == test$Creditability) # 决策树法 table(pred_tree, test$Creditability) # 准确率 mean(pred_tree == test$Creditability) # 线性支持向量机法 table(pred_svm, test$Creditability) # 准确率 mean(pred_svm == test$Creditability) ``` 其中,混淆矩阵可以用来展示分类器在不同类别上的表现,准确率则是分类器的整体性能指标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值