PCA LDA降维测试

测试概述

该实验的目的是测试LDA(Linear Discriminant Analysis,线性判别分析)的降维效果(主要是训练时间),同时引入了PCA(Principal components analysis,主成分分析)作为比较。

程序比较简单,降维算法和训练算法均是调用python的sklearn库的函数,所有代码都在程序中给出。

每次使用相同数据集,通过三种不同方式测试,分别是直接训练、PCA降维后训练、LDA降维后训练。

 

文件说明

code

测试程序文件夹,内含LDA_test.py程序

dataset

测试数据集文件夹

output

测试结果截图文件夹

 

测试环境

操作系统

win10 64位

CPU

AMD Ryzen 5 2600x 6-core 3.60GHz

内存

16GB

IDE/编辑器

PyCharm

Python版本

3.6

 

LDA_test.py代码

import numpy as np
from pandas import read_csv
import time
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn import preprocessing

import warnings
warnings.filterwarnings("ignore")

def sklearn_SVM(X, y, X_t, y_t):
    """
	sklearn的SVM
    :param X: 训练集x
    :param y: 训练集y
    :param X_t: 测试集x
    :param y_t: 测试集y
    :return:
    """
    clf = SVC()  # C=1,kernel='rbf',gamma=auto
    t1 = time.time()
    clf.fit(X, y)
    t2 = time.time()
    score = clf.score(X_t, y_t)

    print("训练时间:%fs" % (t2 - t1))
    print("支持向量:", clf.n_support_)
    print("准确率:", score)

def sklearn_PCA(X, y):
    """
	sklearn的PCA
    :param X: 样本集x
    :param y: 样本集y
    :return: 降维后x
    """
    pca = PCA(n_components=1)  # n_components 降至的维数
    X_new = pca.fit_transform(X, y)

    return X_new

def sklearn_LDA(X, y):
    """
	sklearn的LDA
    :param X: 样本集x
    :param y: 样本集y
    :return: 降维后x
    """
    lda = LinearDiscriminantAnalysis(n_components=1)  # n_components 降至的维数  [1,n_classes-1)对于2分类问题只能降到1维
    X_new = lda.fit_transform(X, y)

    return X_new

if __name__ == '__main__':
    path = "../dataset_DR/"  # 数据集路径
    dataset = "a5a.csv"  # 训练集
    dataset_t = "a5a.t.csv"  # 测试集
    print("当前训练集:", dataset)
    data = read_csv(path + dataset, header=-1).values
    data_t = read_csv(path + dataset_t, header=-1).values
    print("训练集大小:", data.shape)
    print("测试集大小:", data_t.shape)
    X = data[:, :-1]
    y = data[:, -1]
    X_t = data_t[:, :-1]
    y_t = data_t[:, -1]
    positive_point = y.tolist().count(1)
    negative_point = y.tolist().count(-1)
    print("负类:", negative_point)
    print("正类:", positive_point)
    # 归一化
    x = preprocessing.MinMaxScaler().fit_transform(X)
    x_t = preprocessing.MinMaxScaler().fit_transform(X_t)
    # 直接训练
    print("-----------------------------------")
    print("           直接训练                ")
    sklearn_SVM(x, y, x_t, y_t)

    print("-----------------------------------")
    print("            PCA降维                ")
    t1 = time.time()
    X_new = sklearn_PCA(x, y)
    Xt_new = sklearn_PCA(x_t, y_t)
    t2 = time.time()
    print("sklearn_PCA降维运行时间:%fs" % (t2 - t1))
    sklearn_SVM(X_new, y, Xt_new, y_t)

    print("-----------------------------------")
    print("            LDA降维                ")
    t1 = time.time()
    X_new = sklearn_LDA(x, y)
    Xt_new = sklearn_LDA(x_t, y_t)
    t2 = time.time()
    print("sklearn_LDA降维运行时间:%fs" % (t2 - t1))
    sklearn_SVM(X_new, y, Xt_new, y_t)

测试过程

运行LDA_test.py,每次需要更改训练集和测试集名称。

 

PCA LDA降维测试

 

 

测试结果

本次实验使用人工的和真实的数据集,其中summer_10000是人工的3维数据集,axa系列是libsvm dataset的二分类数据集。每次实验使用相同的数据集用三种不同的方法训练和测试,结果如下表所示

统计量

 

数据

集及

其大小

负类

正类

训练时间(s)

支持向量

准确率(%)

 

PCA

LDA

 

PCA

LDA

 

PCA

LDA

summer-10000

10000

,3

8160

1840

0.338

0.605

0.564

855

852

1862

1840

818

812

96.90

80.15

93.63

a5a

6414

,123

4845

1569

1.97

0.75

0.54

1308 1308

1589 1464

1089 1014

84.15

80.69

84.74

a6a

11220

,123

8528

2692

7.59

2.16

2.18

2181 2164

2589 2471

1849 1797

84.16

80.48

84.73

a7a

16100

,123

12182

3918

18.34

3.82

3.18

3094 3066

3573 3459

2650 2571

84. 58

80.52

84.84

a8a

22696

,123

17190

5506

38.30

7.25

6.01

4287 4258

4971 4864

3731 3652

85

80.43

85.44

a9a

32561

,123

24720

7841

74.76

13.02

11.56

5992 5962

7018 6933

5231 5152

84.81

80.17

84.89

 

测试结论

从测试结果可以看出,PCA和LDA对样本降维后的训练时间都减少了,PCA降维后准确率有一定降低,LDA降维后的准确率都和直接训练的结果变化不大,使用axa系列数据集时,LDA降维后的效果比直接训练更好一些。总的来说,PCA和LDA对样本降维后训练都更快,但LDA降维后的分类效果更好。

上一篇:机器学习(27)【降维】之主成分分析(PCA)详解


下一篇:R包ropls的偏最小二乘判别分析(PLS-DA)和正交偏最小二乘判别分析(OPLS-DA)