赞
踩
先简单解释一下:
主成分分析(Principal Component Analysis,简称 PCA)是一种用于数据降维和特征提取的统计方法。它被广泛应用于数据分析、机器学习和图像处理等领域。PCA 的主要目标是通过线性变换将原始数据转化为一组新的坐标系,其中新坐标系的特点是数据在新坐标系上的方差最大,以便更好地描述数据的结构和变化。
以下是关于 PCA 的核心思想和步骤:
数据中心化:首先,对原始数据进行中心化处理,即减去数据的均值,使数据的均值为零。这是为了消除数据的平移影响。
协方差矩阵计算:计算中心化后的数据的协方差矩阵。协方差矩阵描述了数据之间的关联性和方差。
特征值分解:对协方差矩阵进行特征值分解。特征值分解得到了协方差矩阵的特征值和特征向量。
特征向量排序:将特征值按照从大到小的顺序排序,并对应地对特征向量排序。
选择主成分:选择最大的 k 个特征值对应的特征向量,其中 k 是希望保留的主成分个数。
投影到新空间:将原始数据投影到由选定的 k 个特征向量构成的新坐标系中,从而得到降维后的数据。
PCA 的主要应用包括:
降维:PCA 可以用于减少数据的维度,去除数据中的冗余信息,提高数据的计算效率,并有助于可视化数据。
特征提取:PCA 可以用于提取数据中的主要特征,减少特征的数量,同时保留数据的重要信息。
去噪:PCA 可以用于去除数据中的噪声,提高数据的质量。
可视化:PCA 可以用于将高维数据映射到低维空间,以便更容易可视化和理解数据。
总之,PCA 是一种强大的数据分析工具,用于数据降维、特征提取和数据去噪等任务。它通过线性变换将数据从原始坐标系映射到新坐标系,以便更好地理解和利用数据的结构和信息
大家可以去学习一些优秀的文档和视频
我对PCA算法这块代码,进行了详细的解释
- import pandas as pd
- import numpy as np
- from sklearn.datasets import load_iris
- import matplotlib.pyplot as plt
- from sklearn.preprocessing import StandardScaler
- iris = load_iris()
- df = pd.DataFrame(iris.data, columns=iris.feature_names)
- df['label'] = iris.target
- df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
- df.label.value_counts()
- df.tail()
- X = df.iloc[:, 0:4]
- y = df.iloc[:, 4]
- print("查看第一个数据: \n", X.iloc[0, 0:4])
- print("查看第一个标签: \n", y.iloc[0])
- class PCA():
- def __init__(self):
- pass
- def fit(self, X, n_components):
- n_samples = np.shape(X)[0]
- # 计算了特征矩阵X的协方差矩阵(协方差矩阵)
- # (1 / (n_samples - 1)):这一步将协支撑矩阵中的每个元素除以样本数量减少1,这是因为通常在计算协支撑时使用的是无偏估计
- covariance_matrix = (1 / (n_samples - 1)) * (X - X.mean(axis=0)).T.dot(X - X.mean(axis=0))
- # 对协方差矩阵进行特征值分解
- # NumPy 的linalg.eig函数计算了给定协天线矩阵covariance_matrix的特征值(特征值)和特征向量(特征向量)。
- eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
- # 对特征值(特征向量)从大到小排序
- # argsort()函数是用于排序的方法,不过它返回的是索引数组,而不是排序后的值
- # [::-1]:这部分代码将排序后的索引供给进行批发,以便获得特征值从大到小的顺序
- idx = eigenvalues.argsort()[::-1]
- # 该步骤是为了选择最重要的特征值,以降低数据的维度。n_components可以是一个整数,表示选择的主数成分数量。
- eigenvalues = eigenvalues[idx][:n_components]
- # 为了保证接下来与选择的特征值相对应的特征处理
- # eigenvectors[:, idx]返回一个矩阵,其中包含了按照idx顺序选择的特征管理。
- # np.atleast_1d(...):这是一个函数,为了保证返回的结果至少是一维的。
- eigenvectors = np.atleast_1d(eigenvectors[:, idx])[:, :n_components]
- # 得到低维表示
- X_transformed = X.dot(eigenvectors)
- return X_transformed
- model = PCA()
- Y = model.fit(X, 2)
- principalDf = pd.DataFrame(np.array(Y),columns=['principal component 1', 'principal component 2'])
- # concat函数将两个数据框(DataFrames)principalDf和y沿列的方向(axis=1)进行连接(合并)
- Df = pd.concat([principalDf, y], axis = 1)
- fig = plt.figure(figsize = (5,5))
- ax = fig.add_subplot(1,1,1)
- ax.set_xlabel('Principal Component 1', fontsize = 15)
- ax.set_ylabel('Principal Component 2', fontsize = 15)
- ax.set_title('2 component PCA', fontsize = 20)
- targets = [0, 1, 2]
- # ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
- colors = ['r', 'g', 'b']
- for target, color in zip(targets,colors):
- indicesToKeep = Df['label'] == target
- ax.scatter(Df.loc[indicesToKeep, 'principal component 1']
- , Df.loc[indicesToKeep, 'principal component 2']
- , c = color
- , s = 50)
- ax.legend(targets)
- ax.grid()
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。