scikit学习中的高斯NB与LDA

时间:2020-07-21 21:23:27

标签: python scikit-learn lda naivebayes

根据我的理解,如果只有一个特征,那么高斯NB(朴素贝叶斯分类)和LDA(线性判别分析)应该给出相同的结果。

但是scikit学习并没有成功。

首先,我生成一些玩具数据

from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=20, centers=2, n_features=1,
                  random_state=0)

然后我创建具有高斯分布的NB模型

from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(X, y)

然后是LDA模型

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis()
lda.fit(X, y)

现在可以绘制结果了。

plt.scatter(X,y)
X_test = np.linspace(-1, 8, 300).reshape(-1,1)

plt.plot(X_test, gnb.predict_proba(X_test.reshape(-1,1))[:,1],color="black")
plt.plot(X_test, lda.predict_proba(X_test.reshape(-1,1))[:,1],color="green")

plt.ylabel('y')
plt.xlabel('X')

plt.axhline(.5, color='.5')
plt.show()

但是我得到了以下情节

enter image description here

也许我没有这些算法。您能解释为什么会有差异吗?

1 个答案:

答案 0 :(得分:1)

C1C2两个类时,GNB,LDA和QDA之间的主要高级差异如下:

GNB:假设类XC1C2的协方差是不同的,但非对角元素是0

QDA:假设类XC1C2的协方差不同,且非对角元素不等于0

LDA:假设类XC1C2的协方差相同,并且非对角元素不等于0

这三个假设都假设XC1C2的均值是不同的。

X仅是1个变量时,GNB应该默认与QDA相同,因为两者都假定两种类别下X的方差不同,而LDA通常会有所不同假设两个类别下X的方差相同(除非巧合,两个类别的方差相等)。

在您的示例中,当Xy = 1分别为y = 01.0450.950的方差(这是GNB对两个类别的假设) ),而X的方差为1.678(这是LDA将为这两个类假定的)。因此,他们的解决方案将略有不同。

但是,不幸的是,即使用Sklearn的QDA实现替换了LDA,我也会得到不同的曲线。我怀疑这可能是由于Sklearn的实现差异(例如,四舍五入的问题,或者在计算方差时可能是nn-1等)。