python 降维lda算法的使用_【Python】降维算法PCA和LDA的实现及总结
以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的实现及总结相关推荐
- 四大降维算法的比较和一些理解(PCA、LDA、LLE、LEP)
PCA Principle components analysis 主成分分析法:https://blog.csdn.net/weixin_43909872/article/details/85321 ...
- python三维图如何标注曲面_(python)使用colormap作为第4维,x,y,z函数绘制3d曲面 - python...
我正在尝试绘制3d曲面,其中三个维度中的每个维度都在单独的值数组中,并且每个坐标处的曲面着色是x,y,z的函数.一种numpy.pcolormesh,但是是4D而不是3D的. 3D图由下式给出: fr ...
- python中for循环的用法_@Python小白,一文让你掌握Python爬虫
兴趣 我没事喜欢逛知乎,有一段时间看到了这个问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情: http://t.cn/RptGOPx 觉得回答的一个个炒鸡酷炫 就对爬虫产生了浓厚的兴趣, 于是就开 ...
- python打开excel执行vba代码_“Python替代Excel Vba”系列(终):vba中调用Python
请关注本号,后续会有更多相关教程. 系列文章 学Python还不会处理Excel数据?带你用pandas玩转各种数据处理"Python替代Excel Vba"系列(二):panda ...
- python c++情侣网名含义_#python和C/C++#让python和C/C++联姻
让python不在孤单,轻易而举的为python写C/C++第三方库. 我们都知道python很慢,特别是处理大数据的时候,简直慢到极致,如果在知道代码的瓶颈的时候,可以将需要大量计算的数据块放在C/ ...
- python爬虫项目实战教学视频_('[Python爬虫]---Python爬虫进阶项目实战视频',)
爬虫]---Python 爬虫进阶项目实战 1- Python3+Pip环境配置 2- MongoDB环境配置 3- Redis环境配置 4- 4-MySQL的安装 5- 5-Python多版本共存配 ...
- a*算法matlab代码_导向滤波算法及其matlab代码实现
导向滤波同样是一种平滑滤波算法,其与最小二乘滤波和双边滤波相比,同样是一种具有边缘保持的功能的图形滤波算法,可以用于处理图形噪点较多的图像,而且此种滤波算法与最小二乘滤波和双边滤波相比,有其独特的特点 ...
- 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)
我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...
- 算法与数据结构_数据结构与算法专题--算法基本概念
很多开发者都知道"程序=数据结构+算法"这个著名的公式,并不真正明白算法的定义或概念.究竟什么是算法呢?从字面意义上理解,算法即用于计算的方法,通过这种方法可以达到预期的计算结果. ...
- prim算法适用条件_内部排序算法的比较及应用
"内部排序包括 插入排序(直接插入排序.折半插入排序.希尔排序), 交换排序(冒泡排序.快速排序), 选择排序(简单选择排序.堆排序), ...
最新文章
- 2021重庆江北中学高考成绩查询,重庆江北中学校2021年排名
- Qt CheckBox的使用
- 学习开发语言 python 资料
- C#中使用tao.opengl绘制三维模型
- 1._请写出5种以上的android中界面常用布局方式,跳槽季“充电宝”Android面试题(一)...
- IIS6.0不支持ASP的解决办法
- 学完Java基础后的总结
- C# Sqlite For WP7
- Python 数学建模算法与应用(持续更新)
- 小米登录的HTML源代码,html--登录页面(小米登录)
- 如何理解“方差越大信息量就越多”
- java rgb yuv_RGB,CMY(K),YUV,YIQ,YCbCr顏色的轉換算法(java實現)
- iOS 开发值得拥有的75 个工具
- 【问题解决】虚拟机打开gazebo黑屏、闪退、模型加载不出来
- 【新闻】李晓翾先生荣获北美产险精算学会2022年度卓越成就奖
- 什么,BOM指的是物料清单?
- Linux提权全剧终
- ISO 8601 格式是干什么的?底层原理是什么?
- 推荐10个HTML5游戏网站
- 使用正则表达式匹配全角空格
热门文章
- 11月最新纯净版XP系统999宝藏网GhostXP_SP3会员专用版V5.0
- 干货丨如何使用DolphinDB进行机器学习
- Filling in the gaps—floating-point numbers
- matlab绘制星形线并求面积,利用曲线积分,求下列曲线所围成的图形的面积: (1)星形线x=acos3t,y=asin3t,0≤t...
- 射频常用单位 dB dBm dBW/ dBi dBd dBic
- 如何突破路由器(TPLINK等)的IP带宽控制(限速)
- 基于SSM框架实现的汽车维修管理系统【源码+数据库】
- 静电、浪涌与TVS(测试标准、参数、选型)
- Exchange信箱迁移(只适用于DC和exh不在同一服务器上)
- 2020北邮网安803考研经验