重點(diǎn)是展示如何使用 PCA 對(duì)高維數(shù)據(jù)進(jìn)行降維可視化,并通過邊緣密度圖等擴(kuò)展方法豐富數(shù)據(jù)的表達(dá)效果,揭示樣本的聚類模式,以更直觀地理解數(shù)據(jù)的結(jié)構(gòu)和潛在模式
數(shù)據(jù)準(zhǔn)備
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
# 鳶尾花數(shù)據(jù)集
iris = load_iris()
df_iris = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df_iris['target'] = iris.target
df_iris
利用鳶尾花數(shù)據(jù)集進(jìn)行文獻(xiàn)的高維數(shù)據(jù)可視化復(fù)現(xiàn),鳶尾花數(shù)據(jù)集包含 4 個(gè)特征,原始數(shù)據(jù)在二維或三維空間中無法完整展示其結(jié)構(gòu)特征,下面可以通過 PCA 降維 將數(shù)據(jù)維度降低,同時(shí)盡可能保留其信息,以便直觀呈現(xiàn)不同類別的數(shù)據(jù)分布
PCA降維
from sklearn.decomposition import PCA
df_selected = df_iris.iloc[:, 0:4]
# 創(chuàng)建PCA對(duì)象,設(shè)置提取2個(gè)主成分
pca = PCA(n_components=2)
# 進(jìn)行PCA降維
pca_result = pca.fit_transform(df_selected)
# 獲取解釋方差比率(貢獻(xiàn)度)
explained_variance = pca.explained_variance_ratio_
# 將PCA結(jié)果保存為DataFrame,并用貢獻(xiàn)度標(biāo)記列名
pca_df = pd.DataFrame(pca_result, columns=[f"PC1 ({explained_variance[0]*100:.2f}%)",
f"PC2 ({explained_variance[1]*100:.2f}%)"])
pca_df
使用 PCA(主成分分析) 將鳶尾花數(shù)據(jù)集的 4 個(gè)特征降維為 2 個(gè)主成分,并計(jì)算每個(gè)主成分的方差貢獻(xiàn)率,以便在二維空間中保留盡可能多的數(shù)據(jù)信息進(jìn)行可視化展示
基礎(chǔ)PCA降維可視化
# 將PCA后的數(shù)據(jù)與原始的分類標(biāo)簽合并
pca_df_with_label = pd.concat([pca_df, df_iris['target']], axis=1)
# 不同類別進(jìn)行區(qū)分
categories = pca_df_with_label['target'].unique()
# 為不同類別設(shè)置顏色
colors = ['green', 'purple', 'blue']
# 創(chuàng)建散點(diǎn)圖
plt.figure(figsize=(9, 9),dpi=1200)
# 為每個(gè)類別繪制散點(diǎn)圖,使用不同顏色,透明度
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)
# 設(shè)置圖表標(biāo)題和軸標(biāo)簽
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 降維后的數(shù)據(jù)與鳶尾花數(shù)據(jù)集的標(biāo)簽列(target)合并,并根據(jù)不同類別(0, 1, 2)繪制了二維散點(diǎn)圖,每個(gè)類別用不同顏色(綠色、紫色、藍(lán)色)表示,并設(shè)置了透明度以更清晰地展示數(shù)據(jù)的重疊情況,通過圖表,可以看到不同類別在二維空間中的分布,其中 PC1(92.46%) 和 PC2(5.31%) 是兩個(gè)主要的主成分,分別展示了數(shù)據(jù)中的主要和次要變異趨勢。可視化結(jié)果表明,不同類別的樣本在降維后的二維空間中形成了清晰的聚類,顯示出數(shù)據(jù)結(jié)構(gòu)的內(nèi)在模式和類別間的可分性
帶邊緣密度分布的 PCA 降維可視化
import seaborn as sns
# 設(shè)置調(diào)色板為綠、紫、藍(lán)三種顏色
palette = ['green', 'purple', 'blue']
# 創(chuàng)建 JointGrid 對(duì)象
g = sns.JointGrid(data=pca_df_with_label, x=pca_df.columns[0], y=pca_df.columns[1], hue='target', palette=palette)
# 繪制散點(diǎn)圖,移除圖例
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 降維后的數(shù)據(jù)繪制為散點(diǎn)圖,并在頂部和右側(cè)疊加了類別密度曲線,以展示各類數(shù)據(jù)在主成分軸上的分布趨勢與重疊情況,相比于單純的散點(diǎn)圖,這種可視化方式增加了每個(gè)類別的邊緣分布信息,使數(shù)據(jù)的分布特點(diǎn)更加直觀清晰,通過此實(shí)現(xiàn),就成功復(fù)現(xiàn)了文獻(xiàn)中的高維數(shù)據(jù)降維可視化效果,這正是高維數(shù)據(jù)經(jīng)過 PCA 降維后在二維空間中的優(yōu)化展示
帶二維核密度估計(jì)的 PCA 降維可視化
# 不同類別進(jìn)行區(qū)分
categories = pca_df_with_label['target'].unique()
# 為每個(gè)類別設(shè)置顏色,分別為黃、紫、藍(lán)
colors = ['green', 'purple', 'blue']
# 創(chuàng)建散點(diǎn)圖和邊緣密度圖
plt.figure(figsize=(9, 9), dpi=1200)
# 為每個(gè)類別繪制散點(diǎn)圖,使用不同顏色
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)
# 繪制邊緣密度圖(二維核密度估計(jì)),使用相同顏色
sns.kdeplot(x=subset.iloc[:, 0], y=subset.iloc[:, 1], color=colors[i], shade=True, thresh=0.05, alpha=0.3)
# 設(shè)置圖表標(biāo)題和軸標(biāo)簽
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()
結(jié)合散點(diǎn)圖和 二維核密度估計(jì) (KDE),在展示數(shù)據(jù)點(diǎn)的同時(shí),通過核密度輪廓進(jìn)一步揭示了不同類別的分布趨勢和集中區(qū)域,幫助更清晰地觀察類別間的重疊與分離情況。這種可視化方式是 PCA 可視化的擴(kuò)展,通過增加密度信息,使數(shù)據(jù)的分布特征在降維空間中得到更全面的表達(dá)
PCA 雙標(biāo)圖 (Biplot) 降維可視化
labels = df_iris['target'] # 類別標(biāo)簽列
# 定義類別的顏色映射
categories = labels.unique()
colors = ['green', 'purple', 'blue']
color_map = {category: color for category, color in zip(categories, colors)}
# 創(chuàng)建雙標(biāo)圖
plt.figure(figsize=(10, 7), dpi=1200)
# 繪制樣本的散點(diǎn)圖,使用類別的顏色映射
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')
# 設(shè)置軸標(biāo)簽,并調(diào)整標(biāo)簽的位置
plt.xlabel(f"PC1 ({explained_variance[0]*100:.2f}%)", labelpad=180) # x軸標(biāo)簽設(shè)置下方
plt.ylabel(f"PC2 ({explained_variance[1]*100:.2f}%)", labelpad=240) # y軸標(biāo)簽設(shè)置左側(cè)
# 只顯示 x 軸和 y 軸,不顯示網(wǎng)格,并確保軸正確放置
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 雙標(biāo)圖,在展示不同類別樣本散點(diǎn)分布的同時(shí),用箭頭表示每個(gè)特征在主成分空間中的投影方向及其對(duì)主成分的貢獻(xiàn)大小,幫助理解各特征在數(shù)據(jù)降維中的作用。這種雙標(biāo)圖進(jìn)一步豐富了 PCA 可視化的表現(xiàn)力,是對(duì)基礎(chǔ)散點(diǎn)圖的擴(kuò)展,揭示了特征與樣本之間的關(guān)系
通過上述多種 PCA 可視化方法的展示,讀者可以根據(jù)自身的分析需求選擇合適的繪圖方式,同時(shí),不同的可視化方法還可以靈活組合,例如在繪制 PCA 雙標(biāo)圖的同時(shí),疊加二維核密度估計(jì)或邊緣密度分布,以進(jìn)一步豐富數(shù)據(jù)的表達(dá)效果,這些可視化不僅能夠幫助更直觀地理解數(shù)據(jù)結(jié)構(gòu),還能揭示特征與類別之間的潛在關(guān)系,此外,雖然 PCA 是常用的降維方法,但它并非唯一選擇,讀者還可以嘗試 t-SNE 等其他降維技術(shù),根據(jù)數(shù)據(jù)特點(diǎn)和分析需求選擇最適合的方法進(jìn)行可視化與解讀
本文章轉(zhuǎn)載微信公眾號(hào)@Python機(jī)器學(xué)習(xí)AI
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)