内容概要:
利用sklearn和NumPy两种方法设计实现主成分分析。将设计的主成分分析对鸢尾花数据集进行处理,将数据降维为二维,并在平面中画出样本点的分布。
主成分分析:
PCA(principal components analysis)即主成分分析技术,又称主分量分析,旨在利用降维的思想,把多指标转化为少数几个综合指标。
该数据集中原来有五个特征,故为五维。降维算法中的“降维”,指的是降低特征矩阵中特征的数量。降维的目的是为了让算法运算更快,效果更好,但其实还有另一种需求:数据可视化。图像和特征矩阵的维度是可以相互对应的,即一个特征对应一个特征向量,对应一条坐标轴。所以,三维及以下的特征矩阵,是可以被可视化的,这可以帮助我们很快地理解数据的分布,而三维以上特征矩阵的则不能被可视化,数据的性质也就比较难理解。
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
import numpy as np
# 获取鸢尾花的数据
iris = datasets.load_iris()
iris_Y = iris.target
iris_X = iris.data
# 创建PCA对象,指定降维后的主成分数目为2
pca = PCA(n_components=2)
# 对数据进行PCA降维(Scikit-learn方法)
iris_X_pca = pca.fit_transform(iris_X)
# 标准化数据(将数据的均值调整为0,方差调整为1)
mean = np.mean(iris_X, axis=0)
std_dev = np.std(iris_X, axis=0)
iris_X_std = (iris_X - mean) / std_dev
# 计算协方差矩阵
cov_matrix = np.cov(iris_X_std.T)
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
# 将特征值和特征向量按特征值降序排列
sorted_indices = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[sorted_indices]
eigenvectors = eigenvectors[:, sorted_indices]
# 选择前两个特征向量作为新的特征空间
top_eigenvectors = eigenvectors[:, :2]
# 通过特征向量将数据投影到新的特征空间(NumPy方法)
iris_X_pca_manual = np.dot(iris_X_std, top_eigenvectors)
# 创建一个图形
plt.figure(figsize=(12, 5))
# 在图形中创建子图
plt.subplot(1, 2, 1)
plt.scatter(iris_X_pca[:, 0], iris_X_pca[:, 1], c=iris_Y, cmap='viridis')
plt.xlabel('Principal Component 1 (Scikit-learn)')
plt.ylabel('Principal Component 2 (Scikit-learn)')
plt.title('PCA of Iris Dataset (Scikit-learn)')
plt.colorbar(label='Iris Species')
plt.subplot(1, 2, 2)
plt.scatter(iris_X_pca_manual[:, 0], iris_X_pca_manual[:, 1], c=iris_Y, cmap='viridis')
plt.xlabel('Principal Component 1 (Manual)')
plt.ylabel('Principal Component 2 (Manual)')
plt.title('PCA of Iris Dataset (Manual)')
plt.colorbar(label='Iris Species')
plt.tight_layout()
plt.show()
解析:
iris_Y = iris.target # 鸢尾花的目标标签
iris_X = iris.data # 鸢尾花的特征数据