如何运行和解读scikit-learn中的Fisher线性判别分析

4 投票
1 回答
10700 浏览
提问于 2025-04-18 04:08

我正在尝试运行Fisher的线性判别分析(LDA),目的是减少矩阵中的特征数量。

简单来说,如果我理解得没错,给定n个样本并且这些样本被分类到几个类别中,Fisher的LDA会试图找到一个轴线,沿着这个轴线投影时,可以最大化一个叫做J(w)的值。这个J(w)的值是所有样本的方差与各个类别内部方差之和的比率。

我认为这可以用来找出每个类别中最有用的特征。

我有一个矩阵X,里面有m个特征和n个样本(m行,n列)。

我还有一个样本分类y,也就是一个包含n个标签的数组,每个标签对应一个样本。

基于y,我想把特征数量减少到,比如说,3个最具代表性的特征。

我使用scikit-learn尝试了以下方法(参考这份文档):

>>> import numpy as np
>>> from sklearn.lda import LDA
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> y = np.array([1, 1, 1, 2, 2, 2])
>>> clf = LDA(n_components=3)
>>> clf.fit_transform(X, y)
array([[ 4.],
   [ 4.],
   [ 8.],
   [-4.],
   [-4.],
   [-8.]])

在这个时候我有点困惑,怎么才能得到最具代表性的特征呢?

1 个回答

2

你想要的特性在 clf.coef_ 中,前提是你已经训练好了分类器。

需要注意的是,n_components=3 在这里没有意义,因为 X.shape[1] == 2,也就是说你的特征空间只有两个维度。

你不需要使用 fit_transform 来获取 coef_,只要调用 clf.fit(X, y) 就可以了。

撰写回答