【归纳总结】如何为数据样本绘制PCA图及其置信椭圆? 附Python代码

前言

在机器学习特征可视化过程中,经常将数据样本通过PCA降维进行展示,并绘制其置信椭圆描述分布特点。本文通过随机生成三类数据样本进行PCA降维分析,并计算每个类别的协方差矩阵和椭圆参数,最后绘制样本分布和置信椭圆,附Python代码。


一、实现过程

要随机生成三类样本数据,并根据这些数据绘制不同的置信椭圆,可以按照以下步骤进行操作:

  1. 生成三个类别的样本数据:对于每个类别,使用 np.random.multivariate_normal 函数生成符合特定均值和协方差矩阵的样本数据。

  2. 执行主成分分析(PCA):将生成的样本数据进行主成分分析,以获取数据在主成分空间中的表示。

  3. 计算每个类别的协方差矩阵和椭圆参数:对于每个类别,计算其在主成分空间中的协方差矩阵。然后,通过计算特征值和特征向量,确定每个类别的椭圆的中心、角度、长轴和短轴的长度。

  4. 绘制样本分布和置信椭圆:使用 matplotlib 库的 scatter 函数绘制样本分布的散点图。然后,使用 Ellipse 类绘制每个类别的置信椭圆,并使用不同的颜色和参数来区分类别。

下面为示例代码,演示了如何随机生成三类样本数据,并根据数据绘制不同的置信椭圆。

二、使用步骤

代码如下(示例):

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from matplotlib.patches import Ellipse
from scipy.stats import chi2

# 设置随机种子
np.random.seed(42)

# 定义三个类别的均值和协方差矩阵
mean1 = [0, 1]
cov1 = [[1, 0.3], [0.3, 1]]

mean2 = [3, 3]
cov2 = [[1, -0.2], [-0.2, 3]]

mean3 = [-2, 4]
cov3 = [[1, 0], [0, 3]]

# 生成三个类别的样本数据
data1 = np.random.multivariate_normal(mean1, cov1, 100)
data2 = np.random.multivariate_normal(mean2, cov2, 100)
data3 = np.random.multivariate_normal(mean3, cov3, 100)

# 将三个类别的数据合并
data = np.concatenate((data1, data2, data3))

# 执行主成分分析
pca = PCA(n_components=2)
pca.fit(data)
transformed_data = pca.transform(data)

# 确定置信水平
confidence_level = 0.95

# 计算每个类别的椭圆参数并绘制图形
fig, ax = plt.subplots()
colors = ['red', 'green', 'blue']
labels = ['Class A', 'Class B', 'Class C']

for i, dataset in enumerate([data1, data2, data3]):
    # 计算每个类别的协方差矩阵和椭圆参数
    covariance_matrix = np.cov(pca.transform(dataset).T)
    center = np.mean(pca.transform(dataset), axis=0)
    eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
    angle = np.degrees(np.arctan2(*eigenvectors[:, 0][::-1]))
    width = 2 * np.sqrt(eigenvalues[0]) * np.sqrt(chi2.ppf(confidence_level, df=2))
    height = 2 * np.sqrt(eigenvalues[1]) * np.sqrt(chi2.ppf(confidence_level, df=2))

    # 绘制样本分布的散点图,并使用自定义的颜色和标签
    ax.scatter(pca.transform(dataset)[:, 0], pca.transform(dataset)[:, 1], c=colors[i], label=labels[i])

    # 绘制置信椭圆
    ellipse = Ellipse(xy=center, width=width, height=height, angle=angle, edgecolor=colors[i], facecolor='none')
    ax.add_patch(ellipse)

# 设置图例和标题
ax.legend()
ax.set_xlabel('PC1')
ax.set_ylabel('PC2')
ax.set_title('Sample Distribution and Confidence Ellipses')

plt.show()

在这个示例中,定义了三个类别的均值和协方差矩阵,并使用 np.random.multivariate_normal 函数生成了每个类别的样本数据。然后,执行了主成分分析(PCA)并将数据转换到主成分空间中。接下来,计算了每个类别在主成分空间中的协方差矩阵,并使用 chi2.ppf 函数计算了椭圆的参数。最后,使用 scatter 函数绘制了样本分布的散点图,并使用 Ellipse 类绘制了每个类别的置信椭圆。

另外,可以根据需要调整均值、协方差矩阵和其他参数来生成不同的样本数据,并通过修改颜色和标签来区分不同的类别。运行示例代码后,可以看到样本分布和每个类别的置信椭圆如下。
在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坊间小木匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值