前言
在机器学习特征可视化过程中,经常将数据样本通过PCA降维进行展示,并绘制其置信椭圆描述分布特点。本文通过随机生成三类数据样本进行PCA降维分析,并计算每个类别的协方差矩阵和椭圆参数,最后绘制样本分布和置信椭圆,附Python代码。
一、实现过程
要随机生成三类样本数据,并根据这些数据绘制不同的置信椭圆,可以按照以下步骤进行操作:
-
生成三个类别的样本数据:对于每个类别,使用 np.random.multivariate_normal 函数生成符合特定均值和协方差矩阵的样本数据。
-
执行主成分分析(PCA):将生成的样本数据进行主成分分析,以获取数据在主成分空间中的表示。
-
计算每个类别的协方差矩阵和椭圆参数:对于每个类别,计算其在主成分空间中的协方差矩阵。然后,通过计算特征值和特征向量,确定每个类别的椭圆的中心、角度、长轴和短轴的长度。
-
绘制样本分布和置信椭圆:使用 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 类绘制了每个类别的置信椭圆。
另外,可以根据需要调整均值、协方差矩阵和其他参数来生成不同的样本数据,并通过修改颜色和标签来区分不同的类别。运行示例代码后,可以看到样本分布和每个类别的置信椭圆如下。