朴素贝叶斯算法
数学基础
我们先举一个例子。投硬币是一个随机过程,我们不能预测任意一次投币结果是正面还是反面,我们只能谈论其下一次结果是正面或者反面的概率,如果容貌取得一些额外的数据,如硬币的精准成分,硬币的最初位置,投币的力量与方向,硬币的落地点的情况等,投币的准确结果是可以预测的。
因此,我们有如下定义:
我们将不能获取的那些额外的数据称之为不可观测的变量(unobservable variable)。在投币的例子中,唯一可观测的变量(observable variable) 是投币的结果。我们用zzz表示不可观测的变量,用xxx表示可观测的变量,事实上我们有
x=f(z) x = f\left( z \right) x=f(z)
其中f(⋅)f\left( \cdot \right)f(⋅)是一个确定性函数,他定义不可观测数据的输出。因为我们不能用这种方式对该过程进行建模,所以我们定义输出XXX为指明该过程、由概率分布P(X=x)P\left( X = x \right)P(X=x)抽取的随机变量。
如果我们不知道P(X)P\left( X
\right)P(X),并想从给定的样本估计,就需要统计学知识了。我们有一个样本χ\chiχ,包含由可观测变量xix^{i}xi的概率分布(记为p(x)p\left(
x \right)p(x))抽取出的样例,目的是使用样本χ\chiχ构造一个它的近似p^(x)\hat{p}\left(
x \right)p^(x)。
而朴素贝叶斯算法,便是求解该过程的一个算法。
我们设可以观测的条件用伯努利随机变量CCC表示,根据上文,一个最简单的CCC的定义就是观测的结果。我们用xxx表示观测变量向量,xxx的一个简单的例子便是上文投掷硬币时硬币的精准成分,硬币的最初位置,投币的力量与方向,硬币的落地点的情况等等。则根据贝叶斯规则,我们有如下公式:
p(C∣x)=p(C)p(x∣C)p(x) p\left( \left. C \right|x \right) = \frac{p\left( C \right)p\left( \left. x \right|C \right)}{p\left( x \right)} p(C∣x)=p(x)p(C)p(x∣C)
如何理解这个公式?我们还拿掷硬币的例子来说。假设我们投掷了1000次硬币,我们利用某些手段精确的得到了这1000次掷硬币时每次硬币的精准成分,硬币的最初位置,投币的力量与方向,硬币的落地点的情况以及每次掷硬币的结果;当我们掷硬币第1001次时,在观测结果之前,我们已经得到这次掷硬币时硬币的精准成分,硬币的最初位置,投币的力量与方向,硬币的落地点的情况,那么我们如何预测这1001次掷硬币的结果?我们可以根据以往掷硬币的经验,判断在1001次掷硬币时,利用获得到的观测到的硬币的精准成分,硬币的最初位置,投币的力量与方向,硬币的落地点的情况这些因素值与之前投掷时其所有取值完全相同的所有的掷硬币的实验相比较,计算这些取值相同的实验中出现正面的次数和出现反面的次数的比例,而这个比例,便是这次掷硬币结果是正面和反面的概率。用公式表示,则为:
p(第1001次掷硬币为正面∣{精准成分,最初位置,…}={a,b…})
p\left( \left. 第1001次掷硬币为正面 \right|\left\{精准成分,最初位置,\ldots \right\} = \left\{ a,b\ldots \right\} \right)
p(第1001次掷硬币为正面∣{精准成分,最初位置,…}={a,b…})=p(掷硬币为正面)p(精准成分=a,最初位置=b…∣掷硬币为正面)p(精准成分=a,最初位置=b…)
= \frac{p\left(掷硬币为正面 \right)p\left( \left. 精准成分= a, 最初位置= b\ldots \right| 掷硬币为正面\right)}{p\left(精准成分= a, 最初位置= b \ldots \right)}
=p(精准成分=a,最初位置=b…)p(掷硬币为正面)p(精准成分=a,最初位置=b…∣掷硬币为正面)
如何求解p(精准成分=a,最初位置=b…∣掷硬币为正面)p\left( \left. 精准成分 = a, 最初位置 = b\ldots \right|掷硬币为正面 \right)p(精准成分=a,最初位置=b…∣掷硬币为正面)即p(x∣C)p\left( \left. x \right|C \right)p(x∣C)呢?我们一般假设每个可观测的条件都是独立的,即
p(精准成分=a,最初位置=b…∣掷硬币为正面)= p\left( \left. 精准成分 = a,最初位置 = b\ldots \right| 掷硬币为正面\right)= p(精准成分=a,最初位置=b…∣掷硬币为正面)=p(精准成分=a∣掷硬币为正面)×p(最初位置=b∣掷硬币为正面)×… p\left( \left. 精准成分 = a \right|掷硬币为正面\right) \times p\left( \left. 最初位置 = b \right|掷硬币为正面 \right) \times \ldots p(精准成分=a∣掷硬币为正面)×p(最初位置=b∣掷硬币为正面)×…
用数学符号表示即令x=(x1,x2…)x = \left( x_{1},x_{2}\ldots \right)x=(x1,x2…),则
p(x∣C)=p(x1∣C)p(x2∣C)… p\left( \left. x \right|C \right) = p\left( \left. x_{1} \right|C \right)p\left( \left. x_{2} \right|C \right)\ldots p(x∣C)=p(x1∣C)p(x2∣C)…
而在实际求解问题中,对于分母p(x)p\left( x \right)p(x)我们一般不直接求它,而是根据
∑i=1np(Ci∣x)=1 \sum_{i = 1}^{n}{p\left( \left. C_{i} \right|x \right) = 1} i=1∑np(Ci∣x)=1
即
∑i=1np(Ci)p(x∣Ci)p(x)=1 \sum_{i = 1}^{n}{\frac{p\left( C_{i} \right)p\left( \left. x \right|C_{i} \right)}{p\left( x \right)} = 1} i=1∑np(x)p(Ci)p(x∣Ci)=1
求出所有可能结果带有p(x)p\left( x \right)p(x)的式子,利用概率归一化原理得出每个p(Ci∣x)p\left( \left.C_{i} \right|x \right)p(Ci∣x)的概率,并假设该次的结果为max(p(Ci∣x))max(p\left( \left. C_{i} \right|x \right))max(p(Ci∣x)).
理解了上述问题,下面的概念便不难理解了。
我们将p(C=K)p\left( C = K \right)p(C=K)称之为CCC取值为KKK的先验概率(prior
probability),与xxx的取值无关。先验概率满足
∑i=1np(C=K)=1 \sum_{i = 1}^{n}{p\left( C = K \right) = 1} i=1∑np(C=K)=1
我们将p(x∣C)p\left( \left. x \right|C \right)p(x∣C)称之为类似然(class likelihood),是属于CCC的时间具有相关联的观测值xxx的条件概率。
p(x)p\left( x
\right)p(x)是证据(evidence),是看到观测xxx的边缘概率,不论它是正实例还是负实例。由全概率公式,我们有:
∑i=1np(x∣C=i)p(C=i)
\sum_{i = 1}^{n}{p\left( \left. x \right|C = i \right)p\left( C = i \right)}
i=1∑np(x∣C=i)p(C=i)
使用贝叶斯规则,组合先验知识和数据告诉我们的,在看到观测xxx之后,计算概念的后验概率(posterior probability)p(C∣x)p\left( \left. C \right|x \right)p(C∣x)。
后验=(先验×似然值)/证据 后验=(先验×似然值)/证据 后验=(先验×似然值)/证据
连续值的处理
如果特征是连续值,处理连续值的一种常用技术是使用分级来离散特征值,以获得一组新的伯努利分布特征;
另一种方法:假设ppp具有高斯(正态)分布,则估计p(Xj∣C=ci)p\left( X_{j}|C = c_{i} \right)p(Xj∣C=ci):
p(Xj∣C=ci)=12πσjiexp(−(Xj−μji)22σji2) p\left( X_{j}|C = c_{i} \right) = \frac{1}{\sqrt{2\pi}\sigma_{\text{ji}}}\exp\left( - \frac{\left( X_{j} - \mu_{\text{ji}} \right)^{2}}{2\sigma_{\text{ji}}^{2}} \right) p(Xj∣C=ci)=2πσji1exp(−2σji2(Xj−μji)2)
其中,
μji\mu_{\text{ji}}μji指C=ciC = c_{i}C=ci的示例的特征值XjX_{j}Xj的平均值;
σji2\sigma_{\text{ji}}^{2}σji2指C=ciC = c_{i}C=ci的示例的特征值XjX_{j}Xj的方差。
小结
朴素贝叶斯是一个简单但重要的概率模型。
朴素贝叶斯是一种简单的多类分类算法,它基于贝叶斯定理应用特征之间的“朴素”独立假设。它假设自变量的条件概率在统计上是独立的。
它计算给定标签的每个特征的条件概率分布,然后应用贝叶斯定理计算给定观察的标签的条件概率分布将其用于预测。
它根据新数据属于某个最高概率的特定类别对其进行分类。
但其也有如下缺点:
-
需要计算先验概率;
-
分类决策存在错误率;
-
对输入数据的表达形式很敏感;
-
由于使用了样本属性独立性的假设,如果样本属性之间有关联时其预测效果不好。
KNN算法
算法描述
定义 给定一个数据库D={x1,x2,x3,…,xn}D = \left\{ x_{1},x_{2},x_{3},\ldots,x_{n} \right\}D={x1,x2,x3,…,xn}和一组类C={C1,…,Cn}C = \{ C_{1},\ldots,C_{n}\}C={C1,…,Cn}假定每个元组包括一些数值型的属性值xi={xi1,xi2,xi3,…,xin}x_{i} = \left\{ x_{i1},x_{i2},x_{i3},\ldots,x_{\text{in}} \right\}xi={xi1,xi2,xi3,…,xin},每个类也包含数值型属性值Cj={Cj1,…,Cjn}C_{j} = \{ C_{j1},\ldots,C_{\text{jn}}\}Cj={Cj1,…,Cjn},则分类问题是要分配每个xix_{i}xi到满足如下条件的类CjC_{j}Cj:
对∀Cl∈C\forall C_{l} \in C∀Cl∈C且Cl≠CjC_{l} \neq C_{j}Cl̸=Cj,有:
sim(xi,Cj)≥sim(xi,Cl)s\text{im}\left( x_{i},C_{j} \right) \geq s\text{im}\left( x_{i},C_{l} \right)sim(xi,Cj)≥sim(xi,Cl)
其中sim(xi,Cj)s\text{im}\left( x_{i},C_{j} \right)sim(xi,Cj)被称为相似性,在实际的计算中往往用距离来表征。距离越近,相似性越大,距离越远,相似性越小。
距离的计算方法有很多种:
设有向量:a=(a1,a2,a3,…,an), b=(b1,b2,b3,…,bn)a = \left( a_{1},a_{2},a_{3},\ldots,a_{n} \right),\ b = (b_{1},b_{2},b_{3},\ldots,b_{n})a=(a1,a2,a3,…,an), b=(b1,b2,b3,…,bn)则:
欧几里得距离(Euclidean Distance):
欧式距离由对应元素间差值平方和的平方根所表示,即
d(a,b)=(a1−b1)2+(a2−b2)2+…+(an−bn)2 d\left( a,b \right) = \sqrt{{(a_{1} - b_{1})}^{2} + {(a_{2} - b_{2})}^{2} + \ldots + {(a_{n} - b_{n})}^{2}}\ d(a,b)=(a1−b1)2+(a2−b2)2+…+(an−bn)2
曼哈坦距离(Manhattan Distance):
d(a,b)=∣a1−b1∣+∣a2−b2∣+…+∣an−bn∣d\left( a,b \right) = \left| a_{1} - b_{1} \right| + \left| a_{2} - b_{2} \right| + \ldots + |a_{n} - b_{n}|d(a,b)=∣a1−b1∣+∣a2−b2∣+…+∣an−bn∣
欧式距离和曼哈坦距离 共同点:
- 距离为一个非负数值;
- 自身距离为0;
- 距离函数具有对称性;
- 距离函数满足三角不等式。
明考斯基距离(Minkowski Distance) 为欧几里得距离和曼哈坦距离的概化:
d(a,b)=((a1−b1)p+(a2−b2)p+…+(an−bn)p)1p,p≥1d\left( a,b \right) = {(\left( a_{1} - b_{1} \right)^{p} + \left( a_{2} - b_{2} \right)^{p} + \ldots + \left( a_{n} - b_{n} \right)^{p})}^{\frac{1}{p}},p \geq 1d(a,b)=((a1−b1)p+(a2−b2)p+…+(an−bn)p)p1,p≥1
其中ppp为一个正整数,当p=1p = 1p=1时,其表示曼哈坦距离,p=2p = 2p=2时,其表示欧几里得距离
加权的明考斯基距离:如果对每一个变量根据其重要性赋予一个权重,就得到加权的明考斯基距离。
KNN分类直观思想
如果它走路像鸭子,叫声也像鸭子,那么他可能就是只鸭子。
KNN算法基本步骤
- 计算已知类别数据集中每个点与当前点的距离;
- 选取与当前点距离最小的k个点;
- 统计前K个点中每个类别的样本出现的概率;
- 返回前K个点出现频率最高的类别作为当前点的预测分类。
KNN算法常见问题
类别如何判定
投票法:没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最终的方案
改进方法:加权投票法。
如何选区合适的距离测量
高纬度对距离衡量的影响:变量数越多,欧式距离的区分能力就越差;
变量值域对距离的影响:值域大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化。
训练样本是否要一视同仁
可以给不同的样本加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响
性能问题
- KNN是一种 懒惰算法(收到测试样本后才开始训练)
- 对测试样本分类是,需要扫描全部训练样本并计算距离
- 压缩训练样本量可以提高计算效率
优化方法
特征降维:基于 Fuzzy ART 的 K- 最近邻分类改进算法,该算法用模糊自适应共振理论(Fuzzy ART)对K-最近邻的训练样本集进行浓缩, 以改善K- 最近邻的计算速度(对样本 的 维度进行简化,提取出特征明显的维度进行计算);
模式聚合: CHI 概率统计方法进行初步特征提取和模式聚合(如果某一维在各个类别中取值基本相同, 那么此维 对 于文本分类的贡献率就相对较低);
引入CLA(Classifier’s Local Accuracy)技术进行分类可信度分析。
KNN小结
KNN算法本身简单有效,它是一种lazylearning算法;
分类器不需要使用训练集进行训练, 训练时间复杂度为0;
KNN分类的计算复杂度和训练集中的文档 数目成正比,也就是说,如果训练集中文档总数为n,那么KNN的分类时间复杂度为O(n)。
KNN不足:
- KNN是由k值的选择驱动的,这可能是一个糟糕的选择;
- 通常,较大的k值会降低噪声对分类的影响,但会使类之间的边界不那么明显;
- 由于存在噪声、不相关的特征或者特征尺度与其重要性不一致,算法的准确性会严重降低;
- 检查解决方案对不同k值的敏感性是非常重要的