代码之家  ›  专栏  ›  技术社区  ›  Raven Cheuk

sklearn中的线性判别分析未能减小特征尺寸

  •  0
  • Raven Cheuk  · 技术社区  · 7 年前

    据我所知,线性判别分析(LDA)是一种减少输入特征数量的技术。wiki也表示相同

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

    但是,当我尝试使用 LinearDiscriminantAnalysis sklearn.discriminant_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 . 但是 LDA sklearn 给了我形状(28000,1)。

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   J. Doe    7 年前

    你的 LDA 将数据集转换为一个功能,因为lda将 n_components > (n_classes - 1) . 这里有两个班 => 2 - 1 = 1 feature . 请参考 LDA for two classes on Wikipedia

    将中心数更改为 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)
    
    推荐文章