Python sklearn中的线性判别分析无法减小特征尺寸

Python sklearn中的线性判别分析无法减小特征尺寸,python,scikit-learn,Python,Scikit Learn,据我所知,线性判别分析(LDA)是一种减少输入特征数量的技术。维基也有同样的说法 线性判别分析(LDA)、正常判别分析(NDA)或判别函数分析是费舍尔线性判别分析的推广,费舍尔线性判别分析是统计学、模式识别和机器学习中使用的一种方法,用于发现表征或分离两类或两类以上对象或事件的特征的线性组合。所得到的组合可以用作线性分类器,或者更常见的是,在以后的分类之前用于降维 然而,当我尝试使用sklearn.discriminant\u analysis中的线性分类分析时,我未能获得特征减少的数据 fro

据我所知,线性判别分析(LDA)是一种减少输入特征数量的技术。维基也有同样的说法

线性判别分析(LDA)、正常判别分析(NDA)或判别函数分析是费舍尔线性判别分析的推广,费舍尔线性判别分析是统计学、模式识别和机器学习中使用的一种方法,用于发现表征或分离两类或两类以上对象或事件的特征的线性组合。所得到的组合可以用作线性分类器,或者更常见的是,在以后的分类之前用于降维

然而,当我尝试使用
sklearn.discriminant\u analysis
中的
线性分类分析时,我未能获得特征减少的数据

from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

X, y = make_blobs(40000,600,2,cluster_std=20,random_state=101)
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=101)

model = LinearDiscriminantAnalysis(n_components=100)
model.fit(X_train,y_train)

X_train_new = model.transform(X_train)
print(X_train_new.shape)
>>> (28000, 1)
我的原始数据有600个特性,我想用
LDA
将其减少到只有100个特性。但是来自
sklearn
LDA
给了我这个形状(28000,1)


为什么LDA转换后只有一个功能?我做错了什么?

您的
LDA
只将数据集转换为一个功能,因为LDA将转义
n\u组件>(n\u类-1)
。 这里有两个类
=>2-1=1特性
。 请参阅

例如,将您的中心数更改为
200
,您将看到差异

Xx, yy = make_blobs(40000, 600, centers=200, cluster_std=5)
X_train, X_test, y_train, y_test = train_test_split(Xx, yy, test_size=0.3)
model = LinearDiscriminantAnalysis(n_components=100)
model.fit(X_train, y_train)
X_train_new = model.transform(X_train)
print(X_train_new.shape)
>> (28000, 100)
使用
PCA
SVD
否则

from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=100)
X_train_new = svd.fit_transform(X_train)
svd.explained_variance_ratio_.sum() # should be > 0.90
print(X_train_new.shape)
>>> (28000, 100)

您的
LDA
仅将数据集转换为一个功能,因为LDA将转义
n\u组件>(n\u类-1)
。 这里有两个类
=>2-1=1特性
。 请参阅

例如,将您的中心数更改为
200
,您将看到差异

Xx, yy = make_blobs(40000, 600, centers=200, cluster_std=5)
X_train, X_test, y_train, y_test = train_test_split(Xx, yy, test_size=0.3)
model = LinearDiscriminantAnalysis(n_components=100)
model.fit(X_train, y_train)
X_train_new = model.transform(X_train)
print(X_train_new.shape)
>> (28000, 100)
使用
PCA
SVD
否则

from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=100)
X_train_new = svd.fit_transform(X_train)
svd.explained_variance_ratio_.sum() # should be > 0.90
print(X_train_new.shape)
>>> (28000, 100)

我想你应该在这种情况下使用。LDA查找类之间差异最大的属性。因此,
n_组件
应该小于类的数量-1。我认为您希望在这种情况下使用。LDA查找类之间差异最大的属性。因此,
n_组件
应该小于类数-1。但我的实际数据是一个二进制分类问题。是否仍有可能将功能从600减少到100?或者是否有任何文献限制LDA维度始终小于类数?请参阅编辑并接受答案,如果它解决了您的问题:)但我的真实数据是一个二进制分类问题。是否仍有可能将功能从600减少到100?或者是否有任何文献限制LDA维度始终小于类数?请参阅编辑并接受答案,如果它解决了您的问题:)