根据我的理解,如果只有一个特征,那么高斯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()
但是我得到了以下情节
也许我没有这些算法。您能解释为什么会有差异吗?
答案 0 :(得分:1)
当C1
和C2
两个类时,GNB,LDA和QDA之间的主要高级差异如下:
GNB:假设类X
和C1
下C2
的协方差是不同的,但非对角元素是0
。
QDA:假设类X
和C1
下C2
的协方差不同,且非对角元素不等于0
。
LDA:假设类X
和C1
下C2
的协方差相同,并且非对角元素不等于0
。
这三个假设都假设X
和C1
下C2
的均值是不同的。
当X
仅是1个变量时,GNB应该默认与QDA相同,因为两者都假定两种类别下X
的方差不同,而LDA通常会有所不同假设两个类别下X
的方差相同(除非巧合,两个类别的方差相等)。
在您的示例中,当X
和y = 1
分别为y = 0
和1.045
时0.950
的方差(这是GNB对两个类别的假设) ),而X
的方差为1.678
(这是LDA将为这两个类假定的)。因此,他们的解决方案将略有不同。
但是,不幸的是,即使用Sklearn的QDA实现替换了LDA,我也会得到不同的曲线。我怀疑这可能是由于Sklearn的实现差异(例如,四舍五入的问题,或者在计算方差时可能是n
与n-1
等)。