重點是展示如何使用 PCA 對高維數據進行降維可視化,并通過邊緣密度圖等擴展方法豐富數據的表達效果,揭示樣本的聚類模式,以更直觀地理解數據的結構和潛在模式

代碼實現

數據準備

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
import warnings
warnings.filterwarnings("ignore")
from sklearn.datasets import load_iris
# 鳶尾花數據集
iris = load_iris()
df_iris = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df_iris['target'] = iris.target
df_iris

利用鳶尾花數據集進行文獻的高維數據可視化復現,鳶尾花數據集包含 4 個特征,原始數據在二維或三維空間中無法完整展示其結構特征,下面可以通過 PCA 降維 將數據維度降低,同時盡可能保留其信息,以便直觀呈現不同類別的數據分布

PCA降維

from sklearn.decomposition import PCA
df_selected = df_iris.iloc[:, 0:4]
# 創建PCA對象,設置提取2個主成分
pca = PCA(n_components=2)
# 進行PCA降維
pca_result = pca.fit_transform(df_selected)
# 獲取解釋方差比率(貢獻度)
explained_variance = pca.explained_variance_ratio_
# 將PCA結果保存為DataFrame,并用貢獻度標記列名
pca_df = pd.DataFrame(pca_result, columns=[f"PC1 ({explained_variance[0]*100:.2f}%)",
f"PC2 ({explained_variance[1]*100:.2f}%)"])
pca_df

使用 PCA(主成分分析) 將鳶尾花數據集的 4 個特征降維為 2 個主成分,并計算每個主成分的方差貢獻率,以便在二維空間中保留盡可能多的數據信息進行可視化展示

基礎PCA降維可視化

# 將PCA后的數據與原始的分類標簽合并
pca_df_with_label = pd.concat([pca_df, df_iris['target']], axis=1)
# 不同類別進行區分
categories = pca_df_with_label['target'].unique()
# 為不同類別設置顏色
colors = ['green', 'purple', 'blue']
# 創建散點圖
plt.figure(figsize=(9, 9),dpi=1200)
# 為每個類別繪制散點圖,使用不同顏色,透明度
for i, category in enumerate(categories):
subset = pca_df_with_label[pca_df_with_label['target'] == category]
plt.scatter(subset.iloc[:, 0], subset.iloc[:, 1], label=f'Category {category}', color=colors[i], alpha=0.3)
# 設置圖表標題和軸標簽
plt.title('PCA Scatter Plot by target')
plt.xlabel(pca_df.columns[0])
plt.ylabel(pca_df.columns[1])
plt.legend()
plt.savefig("1.pdf", format='pdf', bbox_inches='tight')
plt.show()

將 PCA 降維后的數據與鳶尾花數據集的標簽列(target)合并,并根據不同類別(0, 1, 2)繪制了二維散點圖,每個類別用不同顏色(綠色、紫色、藍色)表示,并設置了透明度以更清晰地展示數據的重疊情況,通過圖表,可以看到不同類別在二維空間中的分布,其中 PC1(92.46%) 和 PC2(5.31%) 是兩個主要的主成分,分別展示了數據中的主要和次要變異趨勢??梢暬Y果表明,不同類別的樣本在降維后的二維空間中形成了清晰的聚類,顯示出數據結構的內在模式和類別間的可分性

帶邊緣密度分布的 PCA 降維可視化

import seaborn as sns
# 設置調色板為綠、紫、藍三種顏色
palette = ['green', 'purple', 'blue']
# 創建 JointGrid 對象
g = sns.JointGrid(data=pca_df_with_label, x=pca_df.columns[0], y=pca_df.columns[1], hue='target', palette=palette)
# 繪制散點圖,移除圖例
g.plot_joint(sns.scatterplot, s=40, alpha=0.3, legend=False)
# 繪制 x 軸的邊緣密度圖,移除圖例
sns.kdeplot(data=pca_df_with_label, x=pca_df.columns[0], hue='target', ax=g.ax_marg_x, fill=True, common_norm=False, palette=palette, alpha=0.3, legend=False)
# 繪制 y 軸的邊緣密度圖,移除圖例
sns.kdeplot(data=pca_df_with_label, y=pca_df.columns[1], hue='target', ax=g.ax_marg_y, fill=True, common_norm=False, palette=palette, alpha=0.3, legend=False)
g.fig.suptitle('PCA Scatter Plot with Stacked Marginal Density')
plt.savefig("2.pdf", format='pdf', bbox_inches='tight', dpi=1200)
plt.show()

通過 Seaborn 將 PCA 降維后的數據繪制為散點圖,并在頂部和右側疊加了類別密度曲線,以展示各類數據在主成分軸上的分布趨勢與重疊情況,相比于單純的散點圖,這種可視化方式增加了每個類別的邊緣分布信息,使數據的分布特點更加直觀清晰,通過此實現,就成功復現了文獻中的高維數據降維可視化效果,這正是高維數據經過 PCA 降維后在二維空間中的優化展示

帶二維核密度估計的 PCA 降維可視化

# 不同類別進行區分
categories = pca_df_with_label['target'].unique()

# 為每個類別設置顏色,分別為黃、紫、藍
colors = ['green', 'purple', 'blue']

# 創建散點圖和邊緣密度圖
plt.figure(figsize=(9, 9), dpi=1200)

# 為每個類別繪制散點圖,使用不同顏色
for i, category in enumerate(categories):
subset = pca_df_with_label[pca_df_with_label['target'] == category]
plt.scatter(subset.iloc[:, 0], subset.iloc[:, 1], label=f'Category {category}', color=colors[i], alpha=0.3)

# 繪制邊緣密度圖(二維核密度估計),使用相同顏色
sns.kdeplot(x=subset.iloc[:, 0], y=subset.iloc[:, 1], color=colors[i], shade=True, thresh=0.05, alpha=0.3)

# 設置圖表標題和軸標簽
plt.title('PCA Scatter Plot with Marginal Density by target')
plt.xlabel(pca_df.columns[0])
plt.ylabel(pca_df.columns[1])
plt.legend(title='Categories')
plt.savefig("3.pdf", format='pdf', bbox_inches='tight')
plt.show()

結合散點圖和 二維核密度估計 (KDE),在展示數據點的同時,通過核密度輪廓進一步揭示了不同類別的分布趨勢和集中區域,幫助更清晰地觀察類別間的重疊與分離情況。這種可視化方式是 PCA 可視化的擴展,通過增加密度信息,使數據的分布特征在降維空間中得到更全面的表達

PCA 雙標圖 (Biplot) 降維可視化

labels = df_iris['target']  # 類別標簽列
# 定義類別的顏色映射
categories = labels.unique()
colors = ['green', 'purple', 'blue']
color_map = {category: color for category, color in zip(categories, colors)}
# 創建雙標圖
plt.figure(figsize=(10, 7), dpi=1200)
# 繪制樣本的散點圖,使用類別的顏色映射
for category in categories:
subset = pca_df[labels == category]
plt.scatter(subset.iloc[:, 0], subset.iloc[:, 1], alpha=0.5, color=color_map[category], label=f'Category {category}')
# 獲取PCA組件(特征向量)
components = pca.components_
# 繪制特征向量(箭頭)
for i, feature in enumerate(df_selected.columns):
plt.arrow(0, 0, components[0, i] * max(pca_result[:, 0]), components[1, i] * max(pca_result[:, 1]),
color='red', head_width=0.1, head_length=0.1)
plt.text(components[0, i] * max(pca_result[:, 0]) * 1.1,
components[1, i] * max(pca_result[:, 1]) * 1.1,
feature, color='black')

# 設置軸標簽,并調整標簽的位置
plt.xlabel(f"PC1 ({explained_variance[0]*100:.2f}%)", labelpad=180) # x軸標簽設置下方
plt.ylabel(f"PC2 ({explained_variance[1]*100:.2f}%)", labelpad=240) # y軸標簽設置左側
# 只顯示 x 軸和 y 軸,不顯示網格,并確保軸正確放置
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['bottom'].set_position('zero')
plt.gca().spines['left'].set_position('zero')
plt.legend()
plt.savefig("4.pdf", format='pdf', bbox_inches='tight')
plt.show()

PCA 雙標圖,在展示不同類別樣本散點分布的同時,用箭頭表示每個特征在主成分空間中的投影方向及其對主成分的貢獻大小,幫助理解各特征在數據降維中的作用。這種雙標圖進一步豐富了 PCA 可視化的表現力,是對基礎散點圖的擴展,揭示了特征與樣本之間的關系

總結

通過上述多種 PCA 可視化方法的展示,讀者可以根據自身的分析需求選擇合適的繪圖方式,同時,不同的可視化方法還可以靈活組合,例如在繪制 PCA 雙標圖的同時,疊加二維核密度估計或邊緣密度分布,以進一步豐富數據的表達效果,這些可視化不僅能夠幫助更直觀地理解數據結構,還能揭示特征與類別之間的潛在關系,此外,雖然 PCA 是常用的降維方法,但它并非唯一選擇,讀者還可以嘗試 t-SNE 等其他降維技術,根據數據特點和分析需求選擇最適合的方法進行可視化與解讀

本文章轉載微信公眾號@Python機器學習AI

上一篇:

SCI圖表:基于相關性和標準差的多模型評價——泰勒圖解析

下一篇:

從2D到3D:部分依賴圖(PDP)如何揭示特征組合對模型預測的綜合影響

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費