01 PCA降维思路
Step01:零均值化处理
Step02:计算协方差矩阵
Step03:构建降维矩阵
Step04:利用降维矩阵对初始数据进行降维
02 PCA降维的本质
寻找降维矩阵P,实现对原始数据的降维
03 代码实现及过程讲解
# 导入所需数据包
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets,decomposition#导入数据集
import re
#数据集:使用sklearn自带的鸢尾花数据集
iris_flower=datasets.load_iris()
print("鸢尾花分类:",iris_flower.target_names)
print("鸢尾花属性名:",iris_flower.feature_names)
print("*"*100)
iris_data=iris_flower.data
iris_target=iris_flower.target
# Step01:零均值化处理
[m,n]=np.shape(iris_data)
for j in range(n):
sum=0
for i in range(m):
sum=sum+iris_data[i,j]
average=sum/m
average=int(average*1000)/1000
for i in range(m):
iris_data[i,j]=iris_data[i,j]-average
# Step02: 计算协方差矩阵
C=np.matmul(iris_data.T,iris_data)/3
mc,nc=np.shape(C)
for i in range(mc):
for j in range(nc):
C[i,j]=int(C[i,j]*1000)/1000
if C[i,j]<0.001:
C[i,j]=0
# Step03:构建降维矩阵
eig_values,eig_vectors=np.linalg.eig(C)#计算特征值和特征向量
[me,ne]=np.shape(eig_vectors)
vecs=[]
vec01=[]
for i in range(4):
vec01.append(eig_vectors[i,0])
vecs.append(vec01)
vec02=[]
for i in range(4):
vec02.append(eig_vectors[i,3])
vecs.append(vec02)# 将特征值最大的两个特征向量构建出来,此处为了更深刻理解构建过程,代码量较多,熟练的朋友可以考虑np.argsort()
[mv,nv]=np.shape(vecs)
vecs=np.array(vecs)
for i in range(mv):
for j in range(nv):
vecs[i,j]=int(vecs[i,j]*10000)/10000 #手动去除冗余的小数部分
P=vecs #降维矩阵构建成功
Y=np.matmul(P,iris_data.T) #实现降维,所以PCA降维的本质就是构建降维矩阵P的过程
Y=Y.T
m_Y,n_Y=np.shape(Y)
# Step04:数据可视化
fig=plt.figure()#新建窗口
ax=fig.add_subplot(1,1,1)#创建画布
colors=['red','blue','green']
labels_names=iris_flower.target_names
for i in range(len(labels_names)):
ax.scatter(Y[iris_target==i,0],Y[iris_target==i,1],color=colors[i])
ax.scatter(Y[position,0],Y[position,1],label='Ttarget=%d'%label,color=color)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title("PCA降维后样本分布图")
plt.show()