在Python中使用scikit学习进行线性判别分析

时间:2018-12-21 12:16:35

标签: python python-3.x machine-learning scikit-learn linear-discriminant

我正在学习机器学习,最近我使用线性判别分析研究了线性可分离数据的分类。为此,我使用了scikit-learn包和函数

.discriminant_analysis.LinearDiscriminantAnalysis

来自MNIST手写数字数据库的数据。我已经使用数据库来拟合模型,并通过以下方式对测试数据进行预测:

LDA(n_components=2)
LDA_fit(data,labels)
LDA_predict(testdata)

哪个工作正常。我得到了95%的准确率。但是,预测函数使用所有784个维度的数据(对应于28x28像素的图像)。我不明白为什么所有尺寸都用于预测?

尽管线性判别分析的目的是在低维空间上找到一个投影,该投影可以最大程度地允许类分离,从而使数据在理想情况下是线性可分离的,并且分类很容易。

如果将全部784个维都用于预测,那么LDA的意义何在并确定投影矩阵?

3 个答案:

答案 0 :(得分:1)

摘自文档:

discriminant_analysis.LinearDiscriminantAnalysis可用于通过将输入数据投影到一个线性子空间来执行有监督的降维,该线性子空间由使类之间的距离最大化的方向组成(在下面的数学部分中精确地讨论)。输出的维数必须小于类数,因此,通常这是一个相当强的维数缩减,并且仅在多类设置中才有意义。

这在discriminant_analysis.LinearDiscriminantAnalysis.transform中实现。可以使用n_components构造函数参数来设置所需的尺寸。该参数discriminant_analysis.LinearDiscriminantAnalysis.fitdiscriminant_analysis.LinearDiscriminantAnalysis.predict没有影响

含义n_components仅用于transformfit_transform。您可以使用降维来消除数据中的噪声或进行可视化。

答案 1 :(得分:0)

就分类而言,您提到的低维度实际上是n_classes

如果将此用于尺寸缩减技术,则可以选择n_components尺寸(如果已指定)(必须为<n_classes)。如文档中所述,这对预测没有影响。

因此,一旦提供输入数据,它将把数据转换成n_classes维空间,然后使用该空间进行训练/预测。 Reference-_decision_function()用于预测。

您可以使用Transform(X)来查看模型学习到的新的低维空间。

答案 2 :(得分:-1)

在维数较小的数据上应用LDA:

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=2)
X_r2 = lda.fit(data_1000, labels_1000).transform(data_1000)

# LDA before tsne
plt.figure()
colors = ['brown','black','deepskyblue','red','yellow','darkslategrey','navy','darkorange','deeppink', 'lawngreen']
target_names  = ['0','1','2','3','4','5','6','7','8','9']
lw = 2
y = labels_1000

plt.figure()
for color, i, target_name in zip(colors, [0, 1, 2,3,4,5,6,7,8,9], target_names):
plt.scatter(X_r2[y == i, 0], X_r2[y == i, 1], alpha=.8, color=color,
            label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('LDA of MNIST dataset before TSNE')

plt.show()