一、概率知识点复习

(1)条件概率

就是事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为P(A|B),读作“在B条件下A的概率”。

(2)联合概率

可以简单的理解为事件A与事件B都发生的概率,记为P(AB)或P(A, B)。

此处就有  P(A, B) = P(A|B) * P(B)

若事件A与事件B独立,则有 P(A, B) = P(A) * P(B),这也说明了此时 P(A|B) = P(A)。

(3)全概率

如果事件B1,B2,B3,…,Bn 构成一个完备事件组,即它们两两互不相容,其和为全集;并且P(Bi)大于0,则对任一事件A有:

P(A)=P(A|B1)*P(B1) + P(A|B2)*P(B2) + ... + P(A|Bn)*P(Bn)

(这里我就只介绍这么多,大家如果对全概率不太理解的可以去补充补充!这点很重要,对后面理解贝叶斯很重要!!今天我重点在讲贝叶斯,所以此处就不在多讲全概率啦~~~后面的例子会涉及到!)

二、贝叶斯定理

我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)求得P(B|A)的道路。

此处我就给出贝叶斯定理的公式(其推导没必要知道)

便于大家记忆,可以这样记P(A, B) = P(A|B) * P(B) 且P(A, B) = P(B|A) * P(A),大家将两式子合并会有P(A|B) * P(B) =  P(B|A) * P(A)

现有校准过的枪5把,没校准过的3把。现在某人用校准过的枪打靶中靶概率为0.8,用没校准过的枪中靶概率只为0.3。现在已知拿起一把枪打靶中靶了,请问这个枪是校准过的枪的概率?

(分析:直接套用上面的公式,但做P(A)的时候是要用到全概率的!!(全概率的重要性体现出来了))

令中靶的事件为A,选中校准过的枪的事件为B1,选中未校准过的抢的事件为B2

则: P(B1) = 5 / 8        P(B2) = 3 / 8

P(A|B1) = 8 / 10   P(A|B2) = 3 / 10

P(A) = P(A|B1)P(B1) + P(A|B2)P(B2) = 49 / 80

上面的都做出来后,你会发现根据贝叶斯定理的公式是不是就可以求出P(B1|A)啦~

得:      P(B1|A) = P(B1)P(A|B1) / P(A) = 40 / 49

思考:

通过这个例子我们可以看到贝叶斯定理的作用,他就是打通了P(A|B1)求得P(B1|A)的道路,也可清晰理解到贝叶斯定理用来可分类!!

三、Naive Bayes-朴素贝叶斯

在概率论和统计学中,Bayes’ theorem(贝叶斯法则)根据事件的先验知识描述事件的概率。贝叶斯法则表达式如下所示

  • P(A|B) – 在事件B下事件A发生的条件概率
  • P(B|A) – 在事件A下事件B发生的条件概率
  • P(A), P(B) – 独立事件A和独立事件B的边缘概率

顺便提一下,上式中的分母P(B)可以根据全概率公式分解为:

Bayesian inferenc(贝叶斯推断)

贝叶斯定理的许多应用之一就是贝叶斯推断,一种特殊的统计推断方法,随着信息增加,贝叶斯定理可以用于更新假设的概率。在决策理论中,贝叶斯推断与主观概率密切相关,通常被称为“Bayesian probability(贝叶斯概率)”。

贝叶斯推断根据 prior probability(先验概率) 和统计模型导出的“likelihood function(似然函数)”的结果,再由贝叶斯定理计算 posterior probability(后验概率):

  • P(H) – 已知的先验概率
  • P(H|E) – 我们想求的后验概率,即在B事件发生后对于事件A概率的评估
  • P(E|H) – 在事件H下观测到E的概率
  • P(E) – marginal likelihood(边际似然),对于所有的假设都是相同的,因此不参与决定不同假设的相对概率
  • P(E|H)/P(E) – likelihood function(可能性函数),这是一个调整因子,通过不断的获取信息,可以使得预估概率更接近真实概率

贝叶斯推断例子

假设我们有两个装满了饼干的碗,第一个碗里有10个巧克力饼干和30个普通饼干,第二个碗里两种饼干都有20个。我们随机挑一个碗,再在碗里随机挑饼干。那么我们挑到的普通饼干来自一号碗的概率有多少?

我们用 H1 代表一号碗,H2 代表二号碗,而且 P(H1) = P(H2) = 0.5。事件 E 代表普通饼干。由上面可以得到 P(E|H1) = 30 / 40 = 0.75,P(E|H2) = 20 / 40 = 0.5。由贝叶斯定理我们得到

  • P(E|H1)P(H1), P(E|H2)P(H2) – 分别表示拿到来自一号碗的普通饼干、来自二号碗的普通饼干的概率
  • P(E|H1)P(H1) + P(E|H2)P(H2) – 表示拿到普通饼干的概率

在我们拿到饼干前,我们会选到一号碗的概率是先验概率 P(H1),在拿到了饼干后,我们要得到是后验概率 P(H1|E)

特征条件独立假设

这一部分开始朴素贝叶斯的理论推导,从中你会深刻地理解什么是特征条件独立假设。

朴素贝叶斯分类的正式定义如下:

1、设为一个待分类项,而每个a为x的一个特征属性。

2、有类别集合

3、计算

4、如果,则

那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:

1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

2、统计得到在各类别下各个特征属性的条件概率估计。即:

3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:

------------------------------------------------------------------------

给定训练数据集(X,Y),其中每个样本x都包括n维特征,即x=(x1,x2,x3,...,xn),类标记集合含有k种类别,即y=(y1,y2,...,yk)。

如果现在来了一个新样本x,我们要怎么判断它的类别?从概率的角度来看,这个问题就是给定x,它属于哪个类别的概率最大。那么问题就转化为求解P(y1|x),P(y2|x),...,P(yk|x)中最大的那个,即求后验概率最大的输出:arg max ykP(yk|x)

P(yk|x)怎么求解?答案就是贝叶斯定理:


根据全概率公式,可以进一步地分解上式中的分母:

    【公式1】

先不管分母,分子中的P(yk)

是先验概率,根据训练集就可以简单地计算出来。

而条件概率P(x|yk)=P(x1,x2,...,xn|yk)

它的参数规模是指数数量级别的,假设第i维特征xi可取值的个数有Si个,类别取值个数为k个,那么参数个数为:kni=1Si

这显然不可行。针对这个问题,朴素贝叶斯算法对条件概率分布作出了独立性的假设,通俗地讲就是说假设各个维度的特征x1,x2,...,xn互相独立,在这个假设的前提上,条件概率可以转化为:

【公式2】

这样,参数规模就降到∑ni=1Sik

以上就是针对条件概率所作出的特征条件独立性假设,至此,先验概率P(yk)

和条件概率P(x|yk)的求解问题就都解决了,那么我们是不是可以求解我们所要的后验概率P(yk|x)了?

答案是肯定的。我们继续上面关于P(yk|x)

的推导,将【公式2】代入【公式1】得到:

于是朴素贝叶斯分类器可表示为:

因为对所有的yk,上式中的分母的值都是一样的(为什么?注意到全加符号就容易理解了),所以可以忽略分母部分,朴素贝叶斯分类器最终表示为:


四 Naive Bayes Classifiers(朴素贝叶斯分类器)

在机器学习中,朴素贝叶斯分类器是一个基于贝叶斯定理的比较简单的概率分类器,其中 naive(朴素)是指的对于模型中各个 feature(特征) 有强独立性的假设,并未将 feature 间的相关性纳入考虑中。

朴素贝叶斯分类器一个比较著名的应用是用于对垃圾邮件分类,通常用文字特征来识别垃圾邮件,是文本分类中比较常用的一种方法。朴素贝叶斯分类通过选择 token(通常是邮件中的单词)来得到垃圾邮件和非垃圾邮件间的关联,再通过贝叶斯定理来计算概率从而对邮件进行分类。

由单个单词分类邮件

假设可疑消息中含有“sex”这个单词,平时大部分收到邮件的人都会知道,这封邮件可能是垃圾邮件。然而分类器并不知道这些,它只能计算出相应的概率。假设在用户收到的邮件中,“sex”出现在在垃圾邮件中的频率是5%,在正常邮件中出现的概率是0.5%。

我们用 S 表示垃圾邮件(spam),H 表示正常邮件(healthy)。两者的先验概率都是50%,即:

P(S)=P(H)=50%

我们用 W 表示这个词,那么问题就变成了计算 P(S|W) 的值,根据贝叶斯定理我们可以得到:

P(W|S)和P(W|H)的含义是,这个词语在垃圾邮件和正常邮件中,分别出现的概率。通过计算可以得到 P(S|W) = 99.0%,说明“sex”的判断能力很强,将50%的先验概率提高到了99%的后验概率。

结合独立概率

大多数贝叶斯垃圾邮件分类器基于这样的假设:邮件中的单词是独立的事件,实际上这种条件一般不被满足,这也是为什么被称作朴素贝叶斯。这是对于应用情景的理想化,在此基础上,我们可以通过贝叶斯定理得到以下公式:

  • p 是可疑邮件是垃圾邮件的概率
  • pN 当邮件中包含第 Nth 个单词时邮件是垃圾邮件的概率 p(S|WN)

对于输出的概率,我们将它和一个 threshold(阈值)相比较,小于阈值的是正常邮件,否则认为它是垃圾邮件。

五 scikit-learn 朴素贝叶斯类库概述

  朴素贝叶斯是一类比较简单的算法,scikit-learn中朴素贝叶斯类库的使用也比较简单。相对于决策树,KNN之类的算法,朴素贝叶斯需要关注的参数是比较少的,这样也比较容易掌握。在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。

这三个类适用的分类场景各不相同:

  • 高斯朴素贝叶斯:sklearn.naive_bayes.GaussianNB(priors=None) 用于样本特征的分布大部分是连续值
  • 多项式朴素贝叶斯:sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)主要用于离散特征分类,例如文本分类单词统计,以出现的次数作为特征值
  • 伯努利朴素贝叶斯:sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True,class_prior=None)类似于多项式朴素贝叶斯,也主要用户离散特征分类,和MultinomialNB的区别是:MultinomialNB以出现的次数为特征值,BernoulliNB为二进制或布尔型特性

1. GaussianNB类使用总结

    GaussianNB假设特征的先验概率为正态分布,即如下式:

其中Ck为Y的第k类类别。μkσ2k 为需要从训练集估计的值

  GaussianNB会根据训练集求出μkσ2kμk为在样本类别Ck中,所有Xj的平均值。σ2k为在样本类别Ck中,所有Xj的方差。

  GaussianNB类的主要参数仅有一个,即先验概率priors ,对应Y的各个类别的先验概率P(Y=Ck)。这个值默认不给出,如果不给出此时P(Y=Ck)=mk/m。其中m为训练集样本总数量,mk为输出为第k类别的训练集样本数。如果给出的话就以priors 为准。

  高斯模型假设每一维特征都服从高斯分布(正态分布):

μyk,i表示类别为yk的样本中,第i维特征的均值。
σ2yk,i表示类别为yk的样本中,第i维特征的方差。

在使用GaussianNB的fit方法拟合数据后,我们可以进行预测。此时预测有三种方法,包括predict,predict_log_proba和predict_proba。 predict方法就是我们最常用的预测方法,直接给出测试集的预测类别输出。predict_proba则不同,它会给出测试集样本在各个类别上预测的概率。容易理解,predict_proba预测出的各个类别概率里的最大值对应的类别,也就是predict方法得到类别。predict_log_proba和predict_proba类似,它会给出测试集样本在各个类别上预测的概率的一个对数转化。转化后predict_log_proba预测出的各个类别对数概率里的最大值对应的类别,也就是predict方法得到类别。

当特征是连续变量的时候,运用多项式模型就会导致很多P(xi|yk)=0(不做平滑的情况下),此时即使做平滑,所得到的条件概率也难以描述真实情况。所以处理连续的特征变量,应该采用高斯模型。

下面是一组人类身体特征的统计资料。

性别 身高(英尺) 体重(磅) 脚掌(英寸)
6 180 12
5.92 190 11
5.58 170 12
5.92 165 10
5 100 6
5.5 150 8
5.42 130 7
5.75 150 9

已知某人身高6英尺、体重130磅,脚掌8英寸,请问该人是男是女?
根据朴素贝叶斯分类器,计算下面这个式子的值。

P(身高|性别) x P(体重|性别) x P(脚掌|性别) x P(性别)

困难在于,由于身高、体重、脚掌都是连续变量,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算。怎么办?
      这时,可以假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。有了密度函数,就可以把值代入,算出某一点的密度函数的值。

比如,男性的身高是均值5.855、方差0.035的正态分布。所以,男性的身高为6英尺的概率的相对值等于1.5789(大于1并没有关系,因为这里是密度函数的值,只用来反映各个值的相对可能性)

对于脚掌和体重同样可以计算其均值与方差。有了这些数据以后,就可以计算性别的分类了。

   P(身高=6|男) x P(体重=130|男) x P(脚掌=8|男) x P(男) = 6.1984 x e-9P(身高=6|女) x P(体重=130|女) x P(脚掌=8|女) x P(女) = 5.3778 x e-4

可以看到,女性的概率比男性要高出将近10000倍,所以判断该人为女性。

2. MultinomialNB类使用总结

    MultinomialNB假设特征的先验概率为多项式分布,即如下式:

   

    其中,P(Xj=xjl|Y=Ck)是第k个类别的第j维特征的第l个个取值条件概率。mk是训练集中输出为第k类的样本个数。λ

为一个大于0的常数,常常取为1,即拉普拉斯平滑。也可以取其他值。

    MultinomialNB参数比GaussianNB多,但是一共也只有仅仅3个。其中,参数alpha即为上面的常数λ,如果你没有特别的需要,用默认的1即可。如果发现拟合的不好,需要调优时,可以选择稍大于1或者稍小于1的数。布尔参数fit_prior表示是否要考虑先验概率,如果是false,则所有的样本类别输出都有相同的类别先验概率。否则可以自己用第三个参数class_prior输入先验概率,或者不输入第三个参数class_prior让MultinomialNB自己从训练集样本来计算先验概率,此时的先验概率为P(Y=Ck)=mk/m。其中m为训练集样本总数量,mk为输出为第k类别的训练集样本数。

  在使用MultinomialNB的fit方法或者partial_fit方法拟合数据后,我们可以进行预测。此时预测有三种方法,包括predict,predict_log_proba和predict_proba。由于方法和GaussianNB完全一样,这里就不累述了。

多项式模型在计算先验概率P(yk)和条件概率P(xi|yk)时,会做一些平滑处理,具体公式为:

N是总的样本个数,k是总的类别个数,Nyk是类别为yk的样本个数,α是平滑值。

Nyk是类别为yk的样本个数,n是特征的维数,Nyk,xi是类别为yk的样本中,第i维特征的值是xi的样本个数,α是平滑值。

α=1时,称作Laplace平滑,当0<α<1时,称作Lidstone平滑,α=0时不做平滑。

如果不做平滑,当某一维特征的值xi

没在训练样本中出现过时,会导致P(xi|yk)=0,从而导致后验概率为0。加上平滑就可以克服这个问题。

2.1 举例

有如下训练数据,15个样本,2维特征X1,X2

,2种类别-1,1。给定测试样本x=(2,S)T

,判断其类别。

解答如下:

运用多项式模型,令α=1

  • 计算先验概率

  • 计算各种条件概率

  • 对于给定的x=(2,S)T计算:

由此可以判定y=-1。

3. BernoulliNB类使用总结

BernoulliNB假设特征的先验概率为二元伯努利分布,即如下式:

此时l只有两种取值。xjl只能取值0或者1。

    BernoulliNB一共有4个参数,其中3个参数的名字和意义和MultinomialNB完全相同。唯一增加的一个参数是binarize。这个参数主要是用来帮BernoulliNB处理二项分布的,可以是数值或者不输入。如果不输入,则BernoulliNB认为每个数据特征都已经是二元的。否则的话,小于binarize的会归为一类,大于binarize的会归为另外一类。

 在使用BernoulliNB的fit或者partial_fit方法拟合数据后,我们可以进行预测。此时预测有三种方法,包括predict,predict_log_proba和predict_proba。由于方法和GaussianNB完全一样,这里就不累述了。

与多项式模型一样,伯努利模型适用于离散特征的情况,所不同的是,伯努利模型中每个特征的取值只能是1和0(以文本分类为例,某个单词在文档中出现过,则其特征值为1,否则为0).

伯努利模型中,条件概率P(xi|yk)的计算方式是:

当特征值xi为1时,P(xi|yk)=P(xi=1|yk);

当特征值xi为0时,P(xi|yk)=1−P(xi=1|yk);

伯努利模型和多项式模型是一致的,BernoulliNB需要比MultinomialNB多定义一个二值化的方法,该方法会接受一个阈值并将输入的特征二值化(1,0)。当然也可以直接采用MultinomialNB,但需要预先将输入的特征二值化。

六、朴素贝叶斯的优缺点

朴素贝叶斯的主要优点有:

  1.  朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
  2.  对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
  3.  对缺失数据不太敏感,算法也比较简单,常用于文本分类。
  4. 不存在过拟合的说法。

朴素贝叶斯的主要缺点有:   

  1.  理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
  2.  需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
  3. 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
  4.  对输入数据的表达形式很敏感。

参考:

  • 《统计学习方法》,李航
  • 《机器学习》,Tom M.Mitchell
  • 维基百科Sex classification
  • 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利
  • 朴素贝叶斯分类器的应用
  • 数学之美番外篇:平凡而又神奇的贝叶斯方法
  • 朴素贝叶斯理论推导与三种常见模型

  • https://blog.csdn.net/weixin_42180810/article/details/81278326

[机器学习] 分类 --- Naive Bayes(朴素贝叶斯)相关推荐

  1. 机械学习与R语言--Naive Bayes 朴素贝叶斯在R语言中的实现

    为什么天气预报说70%概率下雨?为什么垃圾短信垃圾邮件被自动归类?这一切的基础算法便是朴素贝叶斯理论(算法有很多,这仅是其中之一). 1.由贝叶斯理论到朴素贝叶斯(naive bayes) 理论的基础 ...

  2. Naive Bayes 朴素贝叶斯代码实现-Python

    Implementing Naive Bayes in Python To actually implement the naive Bayes classifier model, we're goi ...

  3. 机器学习实战之基于概率论的分类方法:朴素贝叶斯

    基于概率论的分类方法:朴素贝叶斯 引入 1 基于贝叶斯决策理论的分类方法 1.1 条件概率 1.2 使用条件概率来分类 1.3 使用朴素贝叶斯进行文档分类 2 使用Python进行文本分类 2.1 准 ...

  4. 《机器学习实战》-04 朴素贝叶斯

    说明: 作业的所有代码都要基于Python3 学习大纲:https://blog.csdn.net/qq_34243930/article/details/84669684 (所有计划均在学习大纲里) ...

  5. 机器学习实战3(朴素贝叶斯篇)

    目录 1.朴素贝叶斯 2.朴素贝叶斯算法实例1--文档分类 3.朴素贝叶斯算法实例2--过滤垃圾邮件 1.朴素贝叶斯 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失.是否值得投资. ...

  6. Machine Learning in Action 读书笔记---第4章 基于概率论的分类方法:朴素贝叶斯

    Machine Learning in Action 读书笔记 第4章 基于概率论的分类方法:朴素贝叶斯 文章目录 Machine Learning in Action 读书笔记 一.基于贝叶斯决策理 ...

  7. 机器学习系列七:朴素贝叶斯

    一.算法原理 贝叶斯公式描述了两个相关的随机事件或随机变量之间的概率关系.贝叶斯分类器使用贝叶斯公式计算样本属于某一类的条件概率值,并将样本判定为概率值最大的那个类. 贝叶斯公式为: 我们把P(A)称 ...

  8. 【机器学习入门】(3) 朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)附python完整代码及数据集

    各位同学好,今天我和大家分享一下朴素贝叶斯算法中的三大模型.在上一篇文章中,我介绍了朴素贝叶斯算法的原理,并利用多项式模型进行了文本分类预测. 朴素贝叶斯算法 -- 原理,多项式模型文档分类预测,附p ...

  9. [分类算法] :朴素贝叶斯 NaiveBayes

    [分类算法] :朴素贝叶斯 NaiveBayes 1. 原理和理论基础(参考) 2. Spark代码实例: 1)windows 单机 import org.apache.spark.mllib.cla ...

  10. 机器学习实战4.2 朴素贝叶斯案例:屏蔽社区留言板的侮辱性言论

    机器学习实战4.2 朴素贝叶斯案例:屏蔽社区留言板的侮辱性言论 参考地址:https://cuijiahua.com/blog/2017/11/ml_4_bayes_1.html 一.引子 很久没更新 ...

最新文章

  1. iPhone XR XS 底部固定定位偏移解决方案
  2. JavaScript性能优化 DOM编程
  3. 相同vlan跨交换机进行通信
  4. JeecgBoot 2.4.3版本发布,企业级低代码平台
  5. 2021年8月国产数据库排行榜:TiDB稳榜首,达梦返前三,Kingbase进十强,各厂商加速布局云生态...
  6. 网页设计中JS与Java的区别
  7. servlet (七)javaBean
  8. C++程序设计基础(1)程序的编译和执行
  9. Legend of Mir(传奇)官方源码学习2、运行试玩及GM命令
  10. LSV加载大面积实景三维模型出现偏移,如何投影变换处理?
  11. 巴曙松:寻找可持续的经济复苏
  12. 两个栈来实现一个队列的C++代码(某公司社会招聘笔试题)
  13. 计算机奥林匹克竞赛基础知识,竞赛考什么?五大学科竞赛基础常识盘点
  14. Drools LHS与RHS常见语法
  15. 关于av_freep
  16. 安装Tomcat服务器
  17. 关于 getWriter() has already been called for this response 的错误解决办法
  18. 四阶龙格库塔法c语言程序,四阶龙格_库塔算法的C语言实现_毋玉芝
  19. 计量经济学复习笔记(1)
  20. 长沙理工大学计算机科学与技术专业排名,2019长沙理工大学专业排名

热门文章

  1. SpringCloud学习成长之 十一 Docker部署cloud项目
  2. ElasticSearch概述和定义
  3. Windows 10封装中出现“无法验证你的Windows安装”错误解决方法
  4. 用nginx TCP反向代理作mail邮件代理
  5. 我国5G有望引领全球 2020年前将商用
  6. 使用nginx cache缓存网站数据实践
  7. CSS3伪类选择器:nth-child()(nth-child(odd)/nth-child(even))
  8. pap chap认证配置
  9. OSChina 周三乱弹——节前综合症来袭,简直无法抵抗了
  10. 分布式存储MooseFS的搭建