PCA LDA降维测试

短命女 2021-10-31 16:16 588阅读 0赞

测试概述

该实验的主要目的是测试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代码

  1. import numpy as np
  2. from pandas import read_csv
  3. import time
  4. from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
  5. from sklearn.decomposition import PCA
  6. from sklearn.svm import SVC
  7. from sklearn import preprocessing
  8. import warnings
  9. warnings.filterwarnings("ignore")
  10. def sklearn_SVM(X, y, X_t, y_t):
  11. """
  12. sklearn的SVM
  13. :param X: 训练集x
  14. :param y: 训练集y
  15. :param X_t: 测试集x
  16. :param y_t: 测试集y
  17. :return:
  18. """
  19. clf = SVC() # C=1,kernel='rbf',gamma=auto
  20. t1 = time.time()
  21. clf.fit(X, y)
  22. t2 = time.time()
  23. score = clf.score(X_t, y_t)
  24. print("训练时间:%fs" % (t2 - t1))
  25. print("支持向量:", clf.n_support_)
  26. print("准确率:", score)
  27. def sklearn_PCA(X, y):
  28. """
  29. sklearn的PCA
  30. :param X: 样本集x
  31. :param y: 样本集y
  32. :return: 降维后x
  33. """
  34. pca = PCA(n_components=1) # n_components 降至的维数
  35. X_new = pca.fit_transform(X, y)
  36. return X_new
  37. def sklearn_LDA(X, y):
  38. """
  39. sklearn的LDA
  40. :param X: 样本集x
  41. :param y: 样本集y
  42. :return: 降维后x
  43. """
  44. lda = LinearDiscriminantAnalysis(n_components=1) # n_components 降至的维数 [1,n_classes-1)对于2分类问题只能降到1维
  45. X_new = lda.fit_transform(X, y)
  46. return X_new
  47. if __name__ == '__main__':
  48. path = "../dataset_DR/" # 数据集路径
  49. dataset = "a5a.csv" # 训练集
  50. dataset_t = "a5a.t.csv" # 测试集
  51. print("当前训练集:", dataset)
  52. data = read_csv(path + dataset, header=-1).values
  53. data_t = read_csv(path + dataset_t, header=-1).values
  54. print("训练集大小:", data.shape)
  55. print("测试集大小:", data_t.shape)
  56. X = data[:, :-1]
  57. y = data[:, -1]
  58. X_t = data_t[:, :-1]
  59. y_t = data_t[:, -1]
  60. positive_point = y.tolist().count(1)
  61. negative_point = y.tolist().count(-1)
  62. print("负类:", negative_point)
  63. print("正类:", positive_point)
  64. # 归一化
  65. x = preprocessing.MinMaxScaler().fit_transform(X)
  66. x_t = preprocessing.MinMaxScaler().fit_transform(X_t)
  67. # 直接训练
  68. print("-----------------------------------")
  69. print(" 直接训练 ")
  70. sklearn_SVM(x, y, x_t, y_t)
  71. print("-----------------------------------")
  72. print(" PCA降维 ")
  73. t1 = time.time()
  74. X_new = sklearn_PCA(x, y)
  75. Xt_new = sklearn_PCA(x_t, y_t)
  76. t2 = time.time()
  77. print("sklearn_PCA降维运行时间:%fs" % (t2 - t1))
  78. sklearn_SVM(X_new, y, Xt_new, y_t)
  79. print("-----------------------------------")
  80. print(" LDA降维 ")
  81. t1 = time.time()
  82. X_new = sklearn_LDA(x, y)
  83. Xt_new = sklearn_LDA(x_t, y_t)
  84. t2 = time.time()
  85. print("sklearn_LDA降维运行时间:%fs" % (t2 - t1))
  86. sklearn_SVM(X_new, y, Xt_new, y_t)

测试过程

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

20190818125727525.png

测试结果

本次实验使用人工的和真实的数据集,其中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降维后的分类效果更好。

发表评论

表情:
评论列表 (有 0 条评论,588人围观)

还没有评论,来说两句吧...

相关阅读

    相关 补:PCA

    结合网上的资料,细看了两种求解PCA的方式。当进行协方差矩阵上求解特征值时,若矩阵的维数较小,则可以使用传统的求解方式,直接求出协方差矩阵的所有特征值和对应的特征向量。但是如果

    相关 PCA

    概念 在机器学习中经常会碰到一些高维的数据集,而在高维数据情形下会出现数据样本稀疏,距离计算等困难,这类问题是所有机器学习方法共同面临的严重问题,称之为“ 维度灾难 ”。

    相关 PCA原理

    PCA最重要的降维方法之一,在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用,一般我们提到降维最容易想到的算法就是PCA,目标是基于方差提取最有价值的信息,属于无监督问题。

    相关 PCA分析

    这里写目录标题 PCA降维的优化目标为: 关于为什么对协方差矩阵求特征值和特征向量可以实现各个变量两两间协方差为0,而变量方差尽可能大 > 参考博客:htt

    相关 PCA简介

    PCA全称为principal component analysis,即主成成分分析,用于降维。对数据进行降维有很多原因。比如: 1:使得数据更易显示,更易懂 2:降低