PCA LDA降维测试

测试概述

该实验的主要目的是测试LDA(Linear Discriminant Analysis,线性判别分析)和PCA(Principal components analysis,主成分分析)的降维效果(主要是训练时间)。训练模型使用SVM算法。降维(PCA LDA)和训练(SVM)均是调用python的sklearn库,所有代码都在程序中给出。

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

 

测试环境

操作系统

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)

测试过程

修改数据集路径,每次测试需要修改训练集和测试集名称,运行PCA_LDA_test.py

                   

 

测试结果

本次实验使用人工的和真实的数据集,其中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

 

测试结论

  1. PCA和LDA对样本降维后的训练时间都降低了
  2. axa系列数据集,PCA降维后再训练的准确率降低了4%左右,LDA降维后的准确率基本不变;summer-10000数据集,PCA降维后在训练的准确率降低了16%左右,LDA降低了3%左右
  3. PCA降维后再训练的支持向量增加,LDA降维后的支持向量减少,且都随着样本集的增大而增加/减少的更多。

  总结,PCA和LDA对样本降维后训练都更快了,但LDA降维后的分类效果更好。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值