PCA降维方法的python实现

本文介绍如何使用主成分分析(PCA)算法对MNIST手写数字数据集进行降维,并通过三维散点图可视化不同数字类别。该过程包括计算协方差矩阵、特征值分解以及选取主要特征向量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考《机器学习实战》,使用MNIST数据集

首先给出PCA的算法


输入:样本集 D=\{x_1,x_2,...,x_m\}

           低维空间维数 d‘

过程:

  1. 对所有样本进行中心化:x_i\leftarrow x_i-\frac{1}{m}\sum_{i=1}^{m}x_i
  2. 计算样本的协方差矩阵XX^T
  3. 对协方差矩阵XX^T做特征值分解
  4. 取最大的d'个特征值所对应的特征向量w_1,w_2,...,w_{d'}

输出:投影矩阵W^*=(w_1,w_2,...,w_{d'})


# -*- coding: utf-8 -*-
"""
Created on Sun Jul 22 15:38:03 2018

@author: Li Qingquan
"""

import chainer
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

# with reference to "Machine Learning in Action"
def PCA(dataMat, topNfeat=9999999):
    meanVals = np.mean(dataMat, axis = 0)  # calculate mean
    meanRemoved = dataMat - meanVals  # minus mean
    covMat = np.cov(meanRemoved, rowvar=0)  # calculate the covariance matrix
    eigVals, eigVects = np.linalg.eig(np.mat(covMat))  # calculate eigenvalues
    # sort eigenvalues
    eigValInd = np.argsort(eigVals)
    eigValInd = eigValInd[: -(topNfeat + 1) : -1]
    redEigVects = eigVects[:, eigValInd]
    # dimensionality reduction
    lowDDataMat = meanRemoved * redEigVects
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat

if __name__ == "__main__":
    train, test = chainer.datasets.get_mnist()
    img = []
    label = []
    for i in range(10000):  # get numbers 3, 6, 8
        if train[i][1] == 3 or train[i][1] == 6 or train[i][1] == 8:
            img.append(train[i][0])
            label.append(train[i][1])
    lowDDataMat, reconMat = PCA(np.array(img), 3)
    # draw
    fig = plt.figure()
    axes = fig.add_subplot(111, projection='3d')
    for i in range(len(label)):
        if label[i] == 3:
            axes.scatter(np.array(lowDDataMat[i, 0]), np.array(lowDDataMat[i, 1]), np.array(lowDDataMat[i, 2]), color='red')
        if label[i] == 6:
            axes.scatter(np.array(lowDDataMat[i, 0]), np.array(lowDDataMat[i, 1]), np.array(lowDDataMat[i, 2]), color='green')
        if label[i] == 8:
            axes.scatter(np.array(lowDDataMat[i, 0]), np.array(lowDDataMat[i, 1]), np.array(lowDDataMat[i, 2]), color='blue')
    plt.title("PCA")
    plt.show()

 

要使用 Python 绘制 PCA 散点图,可以通过以下方法实现。这通常涉及加载数据、应用主成分分析(PCA)、提取前两个主成分,并将其可视化为二散点图。 ### 加载必要的库 ```python from sklearn.decomposition import PCA import matplotlib.pyplot as plt import numpy as np ``` ### 准备数据 假设我们有一组数据 `X` 需要进行主成分分析。这里以随机生成的数据为例: ```python # 示例数据 np.random.seed(42) # 设置随机种子以便结果可重复 X = np.random.rand(100, 2) * 10 - 5 # 创建一个形状为 (100, 2) 的数组 ``` ### 应用 PCA 并转换数据 通过设置 `n_components=2` 提取前两个主成分。 ```python pca = PCA(n_components=2) principal_components = pca.fit_transform(X) ``` 此时,`principal_components` 是一个 `(100, 2)` 形状的数组,表示每个样本在前两个主成分上的投影坐标[^1]。 ### 绘制 PCA 散点图 我们可以使用 Matplotlib 将这些主成分绘制成散点图。 ```python plt.figure(figsize=(8, 6)) plt.scatter(principal_components[:, 0], principal_components[:, 1], c='blue', alpha=0.7, edgecolors='w') plt.title('PCA Scatter Plot of the First Two Principal Components') plt.xlabel('Principal Component 1') # 第一主成分作为 x 轴 plt.ylabel('Principal Component 2') # 第二主成分作为 y 轴 plt.grid(True) plt.show() ``` #### 解释 - **`scatter()` 方法**:用于绘制散点图,其中 `c='blue'` 表示颜色,`alpha=0.7` 控制透明度[^3]。 - **标签和标题**:分别设置了图表的标题以及 x 和 y 轴的名称,使图形更具解释性。 --- ### 实际案例:基于鸢尾花数据集的 PCA 散点图 下面是一个完整的例子,演示如何对 UCI 鸢尾花数据集进行 PCA 并绘制其散点图。 ```python from sklearn.datasets import load_iris # 加载鸢尾花数据集 data = load_iris() X = data.data y = data.target # 执行 PCA pca = PCA(n_components=2) principal_components = pca.fit_transform(X) # 绘制散点图 plt.figure(figsize=(8, 6)) for target_class in set(y): # 对不同类别着色 indices = y == target_class plt.scatter( principal_components[indices, 0], principal_components[indices, 1], label=data.target_names[target_class], alpha=0.7, edgecolors='w' ) plt.title('PCA Scatter Plot on Iris Dataset') plt.xlabel('Principal Component 1') plt.ylabel('Principal Component 2') plt.legend(title="Species") # 添加图例 plt.grid(True) plt.show() ``` 在这个例子中,不同的鸢尾花种类被赋予了不同的颜色标记,从而能够直观地区分它们之间的差异[^2]。 --- ### 总结 以上展示了两种情况下的 PCA 散点图绘制过程:一种是对自定义数据的应用;另一种则是实际数据集(如鸢尾花)的情况。无论是哪种情形,核心步骤都是先调用 `PCA` 类完成操作,再利用 Matplotlib 展现结果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值