如何在sklearn中使用线性判别分析获取边界线方程

3

我使用sklearn中的LinearDiscriminantAnalysis分类器将一些数据分为两类,并且它的效果非常好,因此我做了这个操作:

from sklearn.cross_validation import train_test_split
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25) # 25% of the dataset are not used for the training
clf = LDA()
clf.fit(x_train, y_train)

然后我用它进行预测,没问题。

但是,这都在一个 ipython 笔记本中,我想在其他地方使用分类器。我看到了使用 pickle 和 joblib 的可能性,但是由于我只有 2 组和 2 个特征,所以我认为我可以“仅仅”得到边界线的方程,然后检查给定点是否在线的上方或下方,以确定它属于哪一组。

据我所知,这条线垂直于投影线,并通过聚类均值的平均值。我认为我用 np.mean(clf.means_, axis=0) 得到了聚类均值。

但是,我卡在了如何使用所有属性,比如 clf.coef_clf.intercept_ 等等来找到投影线的方程。

因此,我的问题是如何根据我的分类器得到边界线方程。

也有可能我没有正确理解 LDA,如果能有更多的解释,我会非常高兴。

谢谢

1个回答

3
决策边界是一个简单的线,由以下公式给出:
np.dot(clf.coef_, x) - clf.intercept_ = 0

在这里(取决于实现方式可能会翻转)截距的符号,因为这是决策函数符号翻转的位置。


这是每个线性分类器的通用方程。它们只在找到coef和intercept的方式上有所不同。LDA假设数据来自具有相同协方差的正态分布,并找到最佳分离线的闭式解。 - lejlot
我得到了一个ValueError: shapes (1,2) and (127,2) not aligned when doing the dot product的错误。而且我只有两个特征,所以也许这解释了上面的维度问题,因为使用clf.coef_*x - est.intercept是有效的。然后它给我投影线上的点,对吗?如果是的话,我会通过回归找到它的斜率和截距,并得到通过聚类均值的垂直线,但是当我画出来时,看起来还好,但是有几个点在线的错误一侧,而且斜率似乎不完全正确。我做错了什么?谢谢。 - jrjc
你需要转置你的X,仅此而已。你不需要回归任何东西,这是确切的、规范的方程式。C0x + C1y - 截距 = 0。没有其他事情需要做,只需绘制这条线。一些点可能会落在错误的一侧。LDA不能保证100%的训练准确性。 - lejlot
绘制 f(x) = -clf.coef_[0][0]/clf.coef_[0][1] * x - clf.intercept_/clf.coef_[0][1] 看起来像是正确的直线,但我是从 C0*x + C1*y + intercept = 0 推导出来的,这样对吗? - jrjc
另外,您有相关的参考资料(比如课程文档)吗?因为我找不到任何信息。 - jrjc
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接