以Iris数据集为例,分别实现PCA和LDA降维

算法原理

主成分分析(Principal Component Analysis,PCA)是一种常用的线性降维数据分析方法,其实质是在能尽可能好的代表原特征的情况下,将原特征进行线性变换、映射至低纬度空间中。

算法实现

首先将数据做中心化处理1

2meanVal = np.mean(X, axis=0)

W = X - meanVal

这里说一下,中心化就是使得样本矩阵的中心回归到坐标系的原点,看下图应该比较好理解。也可以点这里更详细。

计算中心化后数据的协方差矩阵1covMat = np.cov(W, rowvar=0)

计算协方差矩阵的特征值和特征向量1eigVals, eigVects = np.linalg.eig(np.mat(covMat))

找出特征值最大的k个特征所对应的特征向量,并组成向量T1

2

3E = np.argsort(eigVals)

k_E = E[:-(k + 1):-1]

T = eigVects[:, k_E]

Y=W*T即为降维到k维后的数据1Y = W * T

结果

PCA算法1

2

3

4

5

6

7

8

9

10

11

12

13

14

15def (X,k):

meanVal = np.mean(X, axis=0)

W = X - meanVal

covMat = np.cov(W, rowvar=0)

eigVals, eigVects = np.linalg.eig(np.mat(covMat))

E = np.argsort(eigVals)

k_E = E[:-(k + 1):-1]

T = eigVects[:, k_E]

Y = W * T

return Y

带入Iris数据集1

2

3data = load_iris()

y = data.target

X = data.data

带入数据,输出结果1

2reduced_X = np.array(MyPca(X, 2))

show2(reduced_X)

LDA

算法原理

线性判别分析(linear discriminant analysis,LDA)是是一种监督学习的降维技术,投影后希望类内方差最小,类间方差最大,即每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。

算法实现

首先将数据根据标签分类1

2yi = set(y)

xi = np.array([X[np.where(y == i)] for i in yi])

计算所有样本均值$mu=frac{1}{m}sumlimits_{i=1}^m$和各类样本均值$mu_i=frac{1}{n_i}sumlimits_{xin x_i}x$

其中$m$表示总样本数,$n_i$表示第i类的样本数。1

2u = np.array([np.mean(X, axis=0)])

ui = np.array([np.mean(xi[i], axis=0) for i in range(xi.shape[0])])

计算类内散度矩阵$S_w=sumlimits_{i=1}^csumlimits_{xin x_i}(x-mu_i)(x-mu_i)^T$

及类间散度矩阵$S_b=sumlimits_{i=1}^cn_i(mu_i-mu)(mu_i-mu)^T$

其中$c$表示类别数。1

2Sw = sum(np.dot((xi[i] - ui[i]).T, (xi[i] - ui[i])) for i in range(len(yi)))

Sb = sum(len(xi[i]) * (ui[i].reshape(1, 4) - u).T * (ui[i].reshape(1, 4) - u) for i in range(len(yi)))

计算$S_w^{-1}S_b$(由于$S_b$的秩最大为$c-1$,所以LDA最大只能降到$c-1$的维度)1

2

3

4

5S=np.linalg.inv(Sw).dot(Sb)

r=np.linalg.matrix_rank(S)

if(k>r):

print("k_max=",r)

k=r

找出特征值最大的k个特征所对应的特征向量,并组成向量$W$,$Y=W*X$即为降维到k维后的数据1

2

3

4

5eigVals, eigVects = np.linalg.eig(S)

E = np.argsort(eigVals)

k_E = E[:-(k + 1):-1]

W = eigVects[:, k_E]

Y=np.dot(X, W)

结果

LDA算法1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25def MyLDA(X,y,k):

yi = set(y)

xi = np.array([X[np.where(y == i)] for i in yi])

u = np.array([np.mean(X, axis=0)])

ui = np.array([np.mean(xi[i], axis=0) for i in range(xi.shape[0])])

Sw = sum(np.dot((xi[i] - ui[i]).T, (xi[i] - ui[i]))

for i in range(len(yi)))

Sb = sum(len(xi[i]) * (ui[i].reshape(1, 4) - u).T * (ui[i].reshape(1, 4) - u)

for i in range(len(yi)))

S=np.linalg.inv(Sw).dot(Sb)

r=np.linalg.matrix_rank(S)

if(k>r):

print("k_max=",r)

k=r

eigVals, eigVects = np.linalg.eig(S)

E = np.argsort(eigVals)

k_E = E[:-(k + 1):-1]

W = eigVects[:, k_E]

Y=np.dot(X, W)

return Y

带入数据,输出结果1

2LDA_2D = np.array(MyLDA(X,y,2))

show2(LDA_2D)

这样就将数据降到二维,但可能有人会疑惑,怎么知道降维后的信息量变化了多少呢?可以用这样的计算方法: $eta_k=frac{sum_{j=1}^klambda_j}{sum_{j=1}^klambda_j}$来表示降维后剩余的信息量

总结

总的来说,PCA和LDA的实现很简单,但是基本原理和推导需要扎实的数学基础,尤其是LDA中,尤其要注意矩阵的秩对结果的影响。PCA和LDA虽然都用到数据降维的思想,但是两者有着很大的不同,首先监督方式不一样,LDA是有监督的降维方法,而PCA是无监督的降维方法;再者目的也不一样,PCA是为了去除原始数据集中冗余的维度,让投影子空间的各个维度的方差尽可能大。而LDA是通过数据降维使得原始数据中不同的类别尽可能区分开来。

代码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

import numpy as np

from sklearn.datasets import load_iris

def MyPCA(X,k):

meanVal = np.mean(X, axis=0)

W = X - meanVal

covMat = np.cov(W, rowvar=0)

eigVals, eigVects = np.linalg.eig(np.mat(covMat))

E = np.argsort(eigVals)

k_E = E[:-(k + 1):-1]

T = eigVects[:, k_E]

n = sum(eigVals[k_E])/sum(eigVals)

print("降到",k,"维后保留的信息量是原来的",n * 100.0, "%")

Y = W * T

return Y

def MyLDA(X,y,k):

yi = set(y)

xi = np.array([X[np.where(y == i)] for i in yi])

u = np.array([np.mean(X, axis=0)])

ui = np.array([np.mean(xi[i], axis=0) for i in range(xi.shape[0])])

Sw = sum(np.dot((xi[i] - ui[i]).T, (xi[i] - ui[i]))

for i in range(len(yi)))

Sb = sum(len(xi[i]) * (ui[i].reshape(1, 4) - u).T * (ui[i].reshape(1, 4) - u)

for i in range(len(yi)))

S=np.linalg.inv(Sw).dot(Sb)

r=np.linalg.matrix_rank(S)

if(k>r):

print("k_max=",r)

k=r

eigVals, eigVects = np.linalg.eig(S)

E = np.argsort(eigVals)

k_E = E[:-(k + 1):-1]

W = eigVects[:, k_E]

n = sum(eigVals[k_E]) / sum(eigVals)

print("降到", k, "维后保留的信息量是原来的", n * 100.0, "%")

Y=np.dot(X, W)

return Y

def show2(reduced_X):

red_x, red_y = [], []

blue_x, blue_y = [], []

green_x, green_y = [], []

for i in range(len(reduced_X)):

if y[i] == 0:

red_x.append(reduced_X[i][0])

red_y.append(reduced_X[i][1])

elif y[i] == 1:

blue_x.append(reduced_X[i][0])

blue_y.append(reduced_X[i][1])

else:

green_x.append(reduced_X[i][0])

green_y.append(reduced_X[i][1])

plt.scatter(red_x, red_y, c='r', marker='x')

plt.scatter(blue_x, blue_y, c='b', marker='*')

plt.scatter(green_x, green_y, c='g', marker='.')

# plt.show()

def show3(X):

red_x, red_y, red_z = [], [], []

blue_x, blue_y, blue_z = [], [], []

green_x, green_y, green_z = [], [], []

for i in range(len(X)):

if y[i] == 0:

red_x.append(X[i][0])

red_y.append(X[i][1])

red_z.append(X[i][2])

elif y[i] == 1:

blue_x.append(X[i][0])

blue_y.append(X[i][1])

blue_z.append(X[i][2])

else:

green_x.append(X[i][0])

green_y.append(X[i][1])

green_z.append(X[i][2])

fig = plt.figure()

ax = fig.gca(projection='3d')

ax.scatter(red_x, red_y, red_z, c='r', marker='x')

ax.scatter(blue_x, blue_y, blue_z, c='b', marker='*')

ax.scatter(green_x, green_y, green_z, c='g', marker='.')

# plt.show()

if __name__ == "__main__":

data = load_iris()

y = data.target

X = data.data

#PCA

#降到2维

PCA_2D = np.array(MyPCA(X, 2))

show2(PCA_2D)

# 降到3维

PCA_3D = np.array(MyPCA(X, 3))

show3(PCA_3D)

plt.show()

#LDA

# 降到2维

LDA_2D = np.array(MyLDA(X,y,2))

show2(LDA_2D)

plt.show()

如有错误,欢迎指正;如果有更好的,欢迎分享。

python 降维lda算法的使用_【Python】降维算法PCA和LDA的实现及总结相关推荐

  1. 四大降维算法的比较和一些理解(PCA、LDA、LLE、LEP)

    PCA Principle components analysis 主成分分析法:https://blog.csdn.net/weixin_43909872/article/details/85321 ...

  2. python三维图如何标注曲面_(python)使用colormap作为第4维,x,y,z函数绘制3d曲面 - python...

    我正在尝试绘制3d曲面,其中三个维度中的每个维度都在单独的值数组中,并且每个坐标处的曲面着色是x,y,z的函数.一种numpy.pcolormesh,但是是4D而不是3D的. 3D图由下式给出: fr ...

  3. python中for循环的用法_@Python小白,一文让你掌握Python爬虫

    兴趣 我没事喜欢逛知乎,有一段时间看到了这个问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情: http://t.cn/RptGOPx 觉得回答的一个个炒鸡酷炫 就对爬虫产生了浓厚的兴趣, 于是就开 ...

  4. python打开excel执行vba代码_“Python替代Excel Vba”系列(终):vba中调用Python

    请关注本号,后续会有更多相关教程. 系列文章 学Python还不会处理Excel数据?带你用pandas玩转各种数据处理"Python替代Excel Vba"系列(二):panda ...

  5. python c++情侣网名含义_#python和C/C++#让python和C/C++联姻

    让python不在孤单,轻易而举的为python写C/C++第三方库. 我们都知道python很慢,特别是处理大数据的时候,简直慢到极致,如果在知道代码的瓶颈的时候,可以将需要大量计算的数据块放在C/ ...

  6. python爬虫项目实战教学视频_('[Python爬虫]---Python爬虫进阶项目实战视频',)

    爬虫]---Python 爬虫进阶项目实战 1- Python3+Pip环境配置 2- MongoDB环境配置 3- Redis环境配置 4- 4-MySQL的安装 5- 5-Python多版本共存配 ...

  7. a*算法matlab代码_导向滤波算法及其matlab代码实现

    导向滤波同样是一种平滑滤波算法,其与最小二乘滤波和双边滤波相比,同样是一种具有边缘保持的功能的图形滤波算法,可以用于处理图形噪点较多的图像,而且此种滤波算法与最小二乘滤波和双边滤波相比,有其独特的特点 ...

  8. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  9. 算法与数据结构_数据结构与算法专题--算法基本概念

    很多开发者都知道"程序=数据结构+算法"这个著名的公式,并不真正明白算法的定义或概念.究竟什么是算法呢?从字面意义上理解,算法即用于计算的方法,通过这种方法可以达到预期的计算结果. ...

  10. prim算法适用条件_内部排序算法的比较及应用

    "内部排序包括        插入排序(直接插入排序.折半插入排序.希尔排序),        交换排序(冒泡排序.快速排序),        选择排序(简单选择排序.堆排序),       ...

最新文章

  1. 2021重庆江北中学高考成绩查询,重庆江北中学校2021年排名
  2. Qt CheckBox的使用
  3. 学习开发语言 python 资料
  4. C#中使用tao.opengl绘制三维模型
  5. 1._请写出5种以上的android中界面常用布局方式,跳槽季“充电宝”Android面试题(一)...
  6. IIS6.0不支持ASP的解决办法
  7. 学完Java基础后的总结
  8. C# Sqlite For WP7
  9. Python 数学建模算法与应用(持续更新)
  10. 小米登录的HTML源代码,html--登录页面(小米登录)
  11. 如何理解“方差越大信息量就越多”
  12. java rgb yuv_RGB,CMY(K),YUV,YIQ,YCbCr顏色的轉換算法(java實現)
  13. iOS 开发值得拥有的75 个工具
  14. 【问题解决】虚拟机打开gazebo黑屏、闪退、模型加载不出来
  15. 【新闻】李晓翾先生荣获北美产险精算学会2022年度卓越成就奖
  16. 什么,BOM指的是物料清单?
  17. Linux提权全剧终
  18. ISO 8601 格式是干什么的?底层原理是什么?
  19. 推荐10个HTML5游戏网站
  20. 使用正则表达式匹配全角空格

热门文章

  1. 11月最新纯净版XP系统999宝藏网GhostXP_SP3会员专用版V5.0
  2. 干货丨如何使用DolphinDB进行机器学习
  3. Filling in the gaps—floating-point numbers
  4. matlab绘制星形线并求面积,利用曲线积分,求下列曲线所围成的图形的面积: (1)星形线x=acos3t,y=asin3t,0≤t...
  5. 射频常用单位 dB dBm dBW/ dBi dBd dBic
  6. 如何突破路由器(TPLINK等)的IP带宽控制(限速)
  7. 基于SSM框架实现的汽车维修管理系统【源码+数据库】
  8. 静电、浪涌与TVS(测试标准、参数、选型)
  9. Exchange信箱迁移(只适用于DC和exh不在同一服务器上)
  10. 2020北邮网安803考研经验