当前位置:   article > 正文

主成分分析(PCA):代码级实战_pca代码和数据集

pca代码和数据集

我们需要明白PCA的目的是什么。PCA是一种降维技术,它的目的是将高维的数据投影到低维的空间中,同时保留数据的最大变化信息¹。PCA的原理是通过找到一组正交的基向量,使得数据在这组基向量上的投影方差最大²。

PCA的关键在于对特征向量和特征值的求解,通常有两种方式:

  1. 通过求解协方差矩阵的特征向量来获得
  2. 直接对数据矩阵进行SVD分解

对于大规模数据,方法2更为高效。我们可以直接对1500 x 786432的图像数据矩阵进行SVD分解:

[U, S, V] = svd(images_matrix)

然后V的前200列就是我们要的纹理空间的基向量组成的矩阵。

算法讲解部分

https://www.youtube.com/watch?v=iwh5o_M4BNU&list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49&index=22&ab_channel=Hung-yiLee

实战部分

方法一

具体来说,假设我们有一个n维的数据集X,其中每一行是一个样本,每一列是一个特征。我们想要将X降维到k维(k<n),那么我们可以按照以下步骤进行:

为了演示这个过程,我给出一个简单的例子。假设我们有以下四个样本,每个样本有三个特征(x,y,z),我们想要将它们降维到二维:

xyz
123
234
345
456

那么我们可以用以下代码来实现PCA:

  1. import numpy as np
  2. from sklearn.preprocessing import StandardScaler
  3. # 原始数据
  4. X = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])
  5. print("原始数据:")
  6. print(X)
  7. # 中心化和标准化
  8. scaler = StandardScaler()
  9. Z = scaler.fit_transform(X)
  10. print("中心化和标准化后的数据:")
  11. print(Z)
  12. # 协方差矩阵
  13. C = np.cov(Z.T)
  14. print("协方差矩阵:")
  15. print(C)
  16. # 特征值和特征向量
  17. eig_val, eig_vec = np.linalg.eig(C)
  18. print("特征值:")
  19. print(eig_val)
  20. print("特征向量:")
  21. print(eig_vec)
  22. # 选择前两个最大的特征值对应的特征向量
  23. k = 2
  24. W = eig_vec[:,np.argsort(-eig_val)[:k]]
  25. print("选择的特征向量:")
  26. print(W)
  27. # 降维后的数据
  28. Y = Z.dot(W)
  29. print("降维后的数据:")
  30. print(Y)

运行结果如下:

  1. 原始数据:
  2. [[1 2 3]
  3. [2 3 4]
  4. [3 4 5]
  5. [4 5 6]]
  6. 中心化和标准化后的数据:
  7. [[-1.34164079 -1.34164079 -1.34164079]
  8. [-0.4472136 -0.4472136 -0.4472136 ]
  9. [ 0.4472136 0.4472136 0.4472136 ]
  10. [ 1.34164079 1.34164079 1.34164079]]
  11. 协方差矩阵:
  12. [[1.33333333 1.33333333 1.33333333]
  13. [1.33333333 1.33333333 1.33333333]
  14. [1.33333333 1.33333333 1.33333333]]
  15. 特征值:
  16. [4.00000000e+00 2.22044605e-16 2.22044605e-16]
  17. 特征向量:
  18. [[-0.57735027 -0.81649658 -0.15430335]
  19. [-0.57735027 -0.40824829 0.6172134 ]
  20. [-0.57735027 0.40824829 -0.6172134 ]]
  21. 选择的特征向量:
  22. [[-0.57735027 -0.81649658]
  23. [-0.57735027 -0.40824829]
  24. [-0.57735027 0.40824829]]
  25. 降维后的数据:
  26. [[-2.30940108 -1.41421356]
  27. [-0.76980036 -0.47140452]
  28. [ 0.76980036 0.47140452]
  29. [ 2.30940108 1.41421356]]

从结果中我们可以看出,原始的三维数据被成功地降维到了二维,而且保留了数据的最大变化信息。这就是PCA的基本过程和效果。

方法二

  1. import numpy as np
  2. from sklearn.decomposition import PCA
  3. import matplotlib.pyplot as plt
  4. # 生成一组三维数据
  5. np.random.seed(0)
  6. n_samples = 100
  7. mean = [0, 0, 0]
  8. cov = [[1, 0.8, 0.8], [0.8, 1, 0.8], [0.8, 0.8, 1]]
  9. data = np.random.multivariate_normal(mean, cov, n_samples)
  10. # 创建PCA模型,指定降维到2
  11. pca = PCA(n_components=2)
  12. # 拟合数据并进行降维
  13. pca.fit(data)
  14. data_2d = pca.transform(data)
  15. ##########################
  16. # 奇异值和奇异向量
  17. u, s, vh = np.linalg.svd(data)
  18. print("奇异值:")
  19. print(s)
  20. print("左奇异向量:")
  21. print(u)
  22. print("右奇异向量:")
  23. print(vh)
  24. # 选择前两个最大的奇异值对应的右奇异向量
  25. k = 2
  26. W = vh[:k,:].T
  27. print("选择的右奇异向量:")
  28. print(W)
  29. # 降维后的数据
  30. Y = data.dot(W)
  31. print("降维后的数据:")
  32. print(Y)
  33. ##########################
  34. # 绘制原始数据和降维后的数据
  35. plt.figure(figsize=(10, 4))
  36. plt.subplot(1, 3, 1)
  37. plt.scatter(data[:, 0], data[:, 1])
  38. plt.title("Original 3D Data")
  39. plt.xlabel("Feature 1")
  40. plt.ylabel("Feature 2")
  41. plt.subplot(1, 3, 2)
  42. plt.scatter(data_2d[:, 0], data_2d[:, 1])
  43. plt.title("2D Data after PCA")
  44. plt.xlabel("Principal Component 1")
  45. plt.ylabel("Principal Component 2")
  46. plt.subplot(1, 3, 3)
  47. plt.scatter(Y[:, 0], Y[:, 1])
  48. plt.title("2D Data after PCA")
  49. plt.xlabel("Principal Component 1")
  50. plt.ylabel("Principal Component 2")
  51. plt.tight_layout()
  52. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/127202
推荐阅读
相关标签
  

闽ICP备14008679号