PCA底层学习
前面是PCA的简单知识,不感兴趣可以直接看代码部分
PCA降维是线性降维有损失的,我们降维的目的是简化机器模型的训练和预测,对高维数据进行可视化,实现数据的压缩
- PCA优缺点:
优点:
- 保留绝大部分数据
- 消除评价指标之间的相关影响
- 计算方法简单,易于实现
缺点:
- 主成分解释其含义往往具有一定的模糊性,不如原始变量的含义那么清楚,确切
代码思路:
降维简单来说就是将一个旧数据(old_data)经过降维变成了新数据(new_data)
- x_new=x_old.dot(U) #旧数据=新数据*U
- 2.U 和 选择的维度k,lmd(特征值)的大小,u(特征向量) 有关, k,lmd是会被提供的,所以只需要找u
- lmd,u=np.linalg.eig(协方差)
- 协方差=np.dot((x_old-mean)的转置,x_old-mean)
import numpy as np
#降维前数据x
x=np.array([
[1,3,6],
[5,7,9],
[4,5,9]
])
# 1.协方差=np.dot((x_old-mean)的转置,x_old-mean)
def pca(x,k):
s_d=np.dot((x-np.mean(x,axis=0)).T,x-np.mean(x,axis=0))
# 2.特征值,特征向量 = np.linalg.eig(协方差)
lmd,u=np.linalg.eig(s_d)
m,n=x.shape
# 3.将特征值,特征向量放到一起,排序找出lmd最大时候的U
all_g = []
for i in range(n):
one_g=(lmd[i],u[i])
all_g.append(one_g)
all_g.sort(reverse=True)
# 4.初始化U为第一个U,将k个U拼接起来,然后旧数据和U相乘
#将U初始化为第一个U,第一个U不在循环内,保证K=1时有对应的U
U=np.array(all_g[0][1])
for i in range(1,k):
U=np.c_[U,all_g[i][1]]
#x_new=x_old.dot(U)
new_=x.dot(U)
print(new_)
pca(x,2)