一.降维
在数据处理中,常常会出现维度冗余,维度灾难,为了得到更精简更有价值的信息,我们就使用到了降维
降维方法
1.特征抽取
把高维空间的数据映射到低维空间,pca即为一种特征抽取方法
2.特征选择
选出原始特征的一个子集
二.特征值和特征向量
A ξ = λ ξ \textbf{A\textcolor{red}{ξ}} =λ\textbf{\textcolor{red}{ξ}} Aξ=λξ
如果矩阵对某一个向量或某些向量只发生伸缩变换,不产生旋转效果,那么这个向量就称为矩阵的特征向量ξ,伸缩的比例就是特征值λ
通过求出A的特征值和对应特征向量,就能找到旋转后的坐标轴.
经过特征向量变换下的数据称为变量主成分.
三.PCA降维
1.PCA降维目标
最小投影距离,最大投影方差.降维后不同维度相关性为0
2.最大投影方差
数据离散度最大,代表数据在所投影维度有越高的区分度.考虑新坐标轴
将坐标轴进行旋转就能正确降维了,旋转操作通过矩阵变换实现
通过矩阵A对坐标系进行旋转,得知,特征值对应的特征向量就是需要取得的正确坐标轴,二特征值等于旋转后坐标上对应维度方差.
3.PCA过程
中心化
中心化特征均值变为0,以达到主成分分析的目的最小投影距离,最大投影方差
标准化数据
去除量纲影响最大方差及最大特征向量
算协方差矩阵
在降维后的每一维度上,方差最大,而去中心化后,协方差矩阵的对角线上的值就是各个维度的方差.
原始数据的协方差矩阵对角线就是原始数据的方差;降维后的数据协方差矩阵就是降维后数据的方差.那么方差之和就是对角线所有元素之和.
4.实现
def pca(data, num_components=None):
# 计算数据的均值
mean = np.mean(data, axis=0)
# 减去均值,得到中心化的数据
centered_data = data - mean
# 计算协方差矩阵
cov_matrix = np.cov(centered_data, rowvar=False)
# 计算协方差矩阵的特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)
# 根据特征值排序,选择前num_components个最大的特征向量
if num_components is None:
num_components = eigenvalues.shape[0]
# 选择前num_components个最大的特征值和对应的特征向量
sorted_indices = np.argsort(eigenvalues)[::-1]
selected_eigenvectors = eigenvectors[:, sorted_indices][:, :num_components]
# 将数据投影到主成分上
transformed_data = np.dot(centered_data, selected_eigenvectors)
return transformed_data
测试
# 示例数据
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
# 进行PCA降维,保留2个主成分
transformed_data = pca(data, 2)
print("降维后的数据:")
print(transformed_data)
四.总结
pca优缺点
-
优点
(1)仅通过方差衡量,不受外因影响
(2)主成分正交,消除原始数据成分相关的可能
(3)方法简单,易于实现
-
缺点
(1)可解释性变弱
(2)可能丢失强力特征,可能对后续处理有影响