PCA(主成分分析)原理详解与python实现

在这里插入图片描述
PCA是一种数据降维的方法。当我们在处理一些高维且冗余数据时,可以使用PCA对数据进行降维,去除冗余信息,提高运行速度。如上图所示,左边3D图像,存在大量冗余数据,我们把这样的数据转移到2D可以更加清晰的观察数据本身,同时降低计算复杂度。

1.PCA原理详解
在这里插入图片描述
如果我们要对上图二维空间的特征点做特征降维,那怎样的降维结果对我们来说是好的呢?其实,二维特征降维就是找坐标系投影,如图可以看到红色箭头与黄色箭头两个坐标轴。如果我们将特征映射到黄色轴,二维特征点将会大量重叠在黄色轴上,损失大量原始信息是我们不想见到的。而映射到红色轴上,相较于其他坐标轴,这个特征压缩过程可以将信息损失降低到最小。

总结来说,我们希望投影后的数据点尽可能地分散,这种分散程度在数学上可以用方差来表示。同时,为了减少特征的冗余信息,我们希望降维后的特征互不相关,而不相关性可以用协方差来衡量。因此,我们可以先求出原始数据的协方差矩阵,协方差矩阵对角线元素是数据的方差,其他元素是特征之间的相关系数,我们希望降维后的方差尽量大,相关系数为0,那么利用正交变换将此协方差矩阵变换成对角阵,并提取前K个特征值对应的特征向量,即可完成转移矩阵。
在这里插入图片描述
2.PCA具体步骤
在这里插入图片描述
以X为例,我们用PCA将其降维到一维。
1)求协方差矩阵
在这里插入图片描述
在这里插入图片描述
2)求协方差矩阵的特征值与特征向量
求解后的特征值为在这里插入图片描述
对应的特征向量为
在这里插入图片描述
3)选k个最大的特征值对应的特征向量形成转移局正,获得降维后的表示
在这里插入图片描述
结果如图所示
在这里插入图片描述
3.python实现

##Python实现PCA
import numpy as np
def pca(X,k):#k is the components you want
  #mean of each feature
  n_samples, n_features = X.shape
  mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
  #normalization
  norm_X=X-mean
  #scatter matrix
  scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
  #Calculate the eigenvectors and eigenvalues
  eig_val, eig_vec = np.linalg.eig(scatter_matrix)
  eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
  # sort eig_vec based on eig_val from highest to lowest
  eig_pairs.sort(reverse=True)
  # select the top k eig_vec
  feature=np.array([ele[1] for ele in eig_pairs[:k]])
  #get new data
  data=np.dot(norm_X,np.transpose(feature))
  return data
 
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
 
print(pca(X,1))
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
主成分分析PCA)是一种经典的统计学方,可以通过线性变换将数据进行降维,用少数几个变量代替原始的很多变量。它的实现可以使用Python编程语言。\[1\]\[2\] 下面是一个使用Python实现PCA的示例代码: ```python import numpy as np from numpy.linalg import eig from sklearn.datasets import load_iris def pca(X, k): X = X - X.mean(axis=0) # 向量X去中心化 X_cov = np.cov(X.T, ddof=0) # 计算向量X的协方差矩阵,自由度可以选择0或1 eigenvalues, eigenvectors = eig(X_cov) # 计算协方差矩阵的特征值和特征向量 k_large_index = eigenvalues.argsort()\[-k:\]\[::-1\] # 选取最大的K个特征值及其特征向量 k_eigenvectors = eigenvectors\[k_large_index\] # 用X与特征向量相乘 return np.dot(X, k_eigenvectors.T) iris = load_iris() X = iris.data k = 2 X_pca = pca(X, k) print(X_pca) ``` 这段代码使用了NumPy库和scikit-learn库中的load_iris函数来加载鸢尾花数据集。然后,定义了一个pca函数来实现主成分分析。最后,将数据集X降维为k维,并打印出降维后的结果。\[2\] 需要注意的是,PCA的结果是一组新的变量,它们是原始变量的线性组合,因此失去了原有的含义。此外,PCA的解释性较差,主成分往往难以与实际情况中的特征对应,具有一定的模糊性。因此,在每个主成分的贡献率相差不多的情况下,不建议使用PCA。\[3\] 参考链接: \[1\] 如何理解主成分分析PCA)清风数学建模学习笔记——主成分分析(PCA)原理详解及案例分析PCA的数学原理【数据处理方主成分分析PCA原理分析协方差矩阵和矩阵相关系数的理解。 \[2\] 代码实现参考链接 \[3\] PCA的缺陷所在 #### 引用[.reference_title] - *1* [Python机器学习13——主成分分析](https://blog.csdn.net/weixin_46277779/article/details/125533173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [用python实现主成分分析PCA)](https://blog.csdn.net/ruoff/article/details/116568680)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [主成分分析PCA)的理解(附python代码案例)](https://blog.csdn.net/qq_45722196/article/details/127584340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值