当前位置:   article > 正文

PCA的详细解释以及基于PCA实现鸢尾花数据集降维【源程序和效果图】_对花粉类型做pca

对花粉类型做pca

一、PCA的详细解释

先简单解释一下:

主成分分析(Principal Component Analysis,简称 PCA)是一种用于数据降维和特征提取的统计方法。它被广泛应用于数据分析、机器学习和图像处理等领域。PCA 的主要目标是通过线性变换将原始数据转化为一组新的坐标系,其中新坐标系的特点是数据在新坐标系上的方差最大,以便更好地描述数据的结构和变化。

以下是关于 PCA 的核心思想和步骤:

  1. 数据中心化:首先,对原始数据进行中心化处理,即减去数据的均值,使数据的均值为零。这是为了消除数据的平移影响。

  2. 协方差矩阵计算:计算中心化后的数据的协方差矩阵。协方差矩阵描述了数据之间的关联性和方差。

  3. 特征值分解:对协方差矩阵进行特征值分解。特征值分解得到了协方差矩阵的特征值和特征向量。

  4. 特征向量排序:将特征值按照从大到小的顺序排序,并对应地对特征向量排序。

  5. 选择主成分:选择最大的 k 个特征值对应的特征向量,其中 k 是希望保留的主成分个数。

  6. 投影到新空间:将原始数据投影到由选定的 k 个特征向量构成的新坐标系中,从而得到降维后的数据。

PCA 的主要应用包括:

  • 降维:PCA 可以用于减少数据的维度,去除数据中的冗余信息,提高数据的计算效率,并有助于可视化数据。

  • 特征提取:PCA 可以用于提取数据中的主要特征,减少特征的数量,同时保留数据的重要信息。

  • 去噪:PCA 可以用于去除数据中的噪声,提高数据的质量。

  • 可视化:PCA 可以用于将高维数据映射到低维空间,以便更容易可视化和理解数据。

总之,PCA 是一种强大的数据分析工具,用于数据降维、特征提取和数据去噪等任务。它通过线性变换将数据从原始坐标系映射到新坐标系,以便更好地理解和利用数据的结构和信息

大家可以去学习一些优秀的文档和视频

伴风望海 - 知乎 (zhihu.com)

用最直观的方式告诉你:什么是主成分分析PCA_哔哩哔哩_bilibili

二、基于PCA实现鸢尾花数据集降维 

我对PCA算法这块代码,进行了详细的解释

  1. import pandas as pd
  2. import numpy as np
  3. from sklearn.datasets import load_iris
  4. import matplotlib.pyplot as plt
  5. from sklearn.preprocessing import StandardScaler
  6. iris = load_iris()
  7. df = pd.DataFrame(iris.data, columns=iris.feature_names)
  8. df['label'] = iris.target
  9. df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
  10. df.label.value_counts()
  11. df.tail()
  12. X = df.iloc[:, 0:4]
  13. y = df.iloc[:, 4]
  14. print("查看第一个数据: \n", X.iloc[0, 0:4])
  15. print("查看第一个标签: \n", y.iloc[0])
  16. class PCA():
  17. def __init__(self):
  18. pass
  19. def fit(self, X, n_components):
  20. n_samples = np.shape(X)[0]
  21. # 计算了特征矩阵X的协方差矩阵(协方差矩阵)
  22. # (1 / (n_samples - 1)):这一步将协支撑矩阵中的每个元素除以样本数量减少1,这是因为通常在计算协支撑时使用的是无偏估计
  23. covariance_matrix = (1 / (n_samples - 1)) * (X - X.mean(axis=0)).T.dot(X - X.mean(axis=0))
  24. # 对协方差矩阵进行特征值分解
  25. # NumPy 的linalg.eig函数计算了给定协天线矩阵covariance_matrix的特征值(特征值)和特征向量(特征向量)。
  26. eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
  27. # 对特征值(特征向量)从大到小排序
  28. # argsort()函数是用于排序的方法,不过它返回的是索引数组,而不是排序后的值
  29. # [::-1]:这部分代码将排序后的索引供给进行批发,以便获得特征值从大到小的顺序
  30. idx = eigenvalues.argsort()[::-1]
  31. # 该步骤是为了选择最重要的特征值,以降低数据的维度。n_components可以是一个整数,表示选择的主数成分数量。
  32. eigenvalues = eigenvalues[idx][:n_components]
  33. # 为了保证接下来与选择的特征值相对应的特征处理
  34. # eigenvectors[:, idx]返回一个矩阵,其中包含了按照idx顺序选择的特征管理。
  35. # np.atleast_1d(...):这是一个函数,为了保证返回的结果至少是一维的。
  36. eigenvectors = np.atleast_1d(eigenvectors[:, idx])[:, :n_components]
  37. # 得到低维表示
  38. X_transformed = X.dot(eigenvectors)
  39. return X_transformed
  40. model = PCA()
  41. Y = model.fit(X, 2)
  42. principalDf = pd.DataFrame(np.array(Y),columns=['principal component 1', 'principal component 2'])
  43. # concat函数将两个数据框(DataFrames)principalDf和y沿列的方向(axis=1)进行连接(合并)
  44. Df = pd.concat([principalDf, y], axis = 1)
  45. fig = plt.figure(figsize = (5,5))
  46. ax = fig.add_subplot(1,1,1)
  47. ax.set_xlabel('Principal Component 1', fontsize = 15)
  48. ax.set_ylabel('Principal Component 2', fontsize = 15)
  49. ax.set_title('2 component PCA', fontsize = 20)
  50. targets = [0, 1, 2]
  51. # ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
  52. colors = ['r', 'g', 'b']
  53. for target, color in zip(targets,colors):
  54. indicesToKeep = Df['label'] == target
  55. ax.scatter(Df.loc[indicesToKeep, 'principal component 1']
  56. , Df.loc[indicesToKeep, 'principal component 2']
  57. , c = color
  58. , s = 50)
  59. ax.legend(targets)
  60. ax.grid()

运行结果:

 

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

闽ICP备14008679号