一、常見的降維算法
- LDA線性判別
- PCA主成分分析
- t-sne降維
二、降維算法原理
2.1 LDA 線性判別
- 原理 :LDA(Linear Discriminant Analysis)線性判別分析是一種有監督的降維方法。它的目標是找到一個投影方向,使得不同類別的數據在投影后盡可能分開,同一類別的數據盡可能聚集。通過最大化類間散度與類內散度的比值,來確定最優的投影方向。
- 數學公式 :設 S b S_b Sb? 為類間散度矩陣, S w S_w Sw? 為類內散度矩陣,LDA 就是求解廣義特征值問題 S b w = λ S w w S_bw = \lambda S_ww Sb?w=λSw?w,其中 w w w 為投影方向, λ \lambda λ 為特征值。
2.2 PCA 主成分分析
- 原理 :PCA(Principal Component Analysis)主成分分析是一種無監督的降維方法。它通過對數據進行線性變換,將原始數據投影到一組新的正交坐標軸上,這些坐標軸稱為主成分。主成分按照方差大小排序,方差越大表示該主成分包含的信息越多。PCA 選擇前 k k k 個方差最大的主成分作為新的特征,從而實現降維。
- 數學公式 :首先計算數據的協方差矩陣 Σ \Sigma Σ,然后對 Σ \Sigma Σ 進行特征值分解 Σ = U Λ U T \Sigma = U\Lambda U^T Σ=UΛUT,其中 U U U 是特征向量矩陣, Λ \Lambda Λ 是特征值對角矩陣。選擇前 k k k 個特征向量組成投影矩陣 W W W,將原始數據 X X X 投影到新的空間 Y = X W Y = XW Y=XW。
2.3 t - SNE 降維
- 原理 :t - SNE(t - Distributed Stochastic Neighbor Embedding)是一種非線性降維方法,主要用于高維數據的可視化。它通過構建高維數據點和低維數據點之間的概率分布,使得高維空間中相似的數據點在低維空間中也盡可能相似。t - SNE 使用 t 分布來計算低維空間中的相似度,從而解決了傳統降維方法在處理局部結構時的不足。
- 數學公式 :t - SNE 定義了高維空間中數據點之間的相似度 p i j p_{ij} pij? 和低維空間中數據點之間的相似度 q i j q_{ij} qij?,通過最小化這兩個分布之間的 KL 散度 C = K L ( P ∣ ∣ Q ) = ∑ i ∑ j p i j log ? p i j q i j C = KL(P||Q) = \sum_{i}\sum_{j}p_{ij}\log\frac{p_{ij}}{q_{ij}} C=KL(P∣∣Q)=∑i?∑j?pij?logqij?pij?? 來找到最優的低維表示。
三、實驗過程
3.1 數據預處理
- 讀取 heart.csv 數據集,將特征數據和目標變量分離。
- 對特征數據進行標準化處理,使得每個特征的均值為 0,方差為 1,以避免特征尺度對降維結果的影響。
import pandas as pd
from sklearn.preprocessing import StandardScaler# 讀取數據
data = pd.read_csv('./csv/heart.csv')
X = data.drop('target', axis=1) # 特征數據
y = data['target'] # 目標變量# 數據標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
3.2 降維實驗
- LDA 線性判別 :使用 sklearn 庫中的 LinearDiscriminantAnalysis 類進行降維,將數據降維到 1 維(因為目標變量是二分類,LDA 最多可將數據降維到 C ? 1 C - 1 C?1 維, C C C 為類別數)。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda = LinearDiscriminantAnalysis(n_components=1)
X_lda = lda.fit_transform(X_scaled, y)
- PCA 主成分分析 :使用 sklearn 庫中的 PCA 類進行降維,將數據降維到 2 維,以便可視化。
from sklearn.decomposition import PCApca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
- t - SNE 降維 :使用 sklearn 庫中的 TSNE 類進行降維,將數據降維到 2 維,以便可視化。
from sklearn.manifold import TSNEtsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X_scaled)
3.3 結果可視化
- 分別繪制 LDA、PCA 和 t - SNE 降維后的數據散點圖,不同類別的數據用不同顏色表示,以便直觀觀察降維效果。
import matplotlib.pyplot as plt# LDA 可視化
plt.figure(figsize=(15, 5))
plt.subplot(131)
plt.scatter(X_lda, [0] * len(X_lda), c=y, cmap='viridis')
plt.title('LDA')# PCA 可視化
plt.subplot(132)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.title('PCA')# t - SNE 可視化
plt.subplot(133)
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='viridis')
plt.title('t - SNE')plt.show()
四、實驗結果分析
4.1 可視化結果分析
- 觀察 LDA 降維后的散點圖,分析不同類別數據在 1 維空間中的分離情況,判斷 LDA 是否能夠有效區分不同類別的數據。
- 觀察 PCA 降維后的散點圖,分析數據在 2 維空間中的分布情況,判斷 PCA 是否能夠保留數據的主要信息。
- 觀察 t - SNE 降維后的散點圖,分析數據在 2 維空間中的局部結構和聚類情況,判斷 t - SNE 是否能夠揭示數據的潛在分布。
4.2 降維效果評估
- 可以使用一些評估指標來量化降維效果,如保留的方差比例(PCA)、分類準確率(使用降維后的數據進行分類任務)等。
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 使用 PCA 降維后的數據進行分類
X_train_pca, X_test_pca, y_train, y_test = train_test_split(X_pca, y, test_size=0.2, random_state=42)
model_pca = LogisticRegression()
model_pca.fit(X_train_pca, y_train)
y_pred_pca = model_pca.predict(X_test_pca)
accuracy_pca = accuracy_score(y_test, y_pred_pca)# 同理可對 LDA 和 t - SNE 降維后的數據進行分類評估print(f"PCA 降維后分類準確率: {accuracy_pca}")
五、結論
總結三種降維算法在 heart.csv 數據集上的優缺點和適用場景。例如,LDA 作為有監督的降維方法,在分類任務中可能更能突出類別間的差異;PCA 是無監督的線性降維方法,計算效率高,適合處理大規模數據;t - SNE 作為非線性降維方法,在可視化方面表現較好,但計算復雜度較高。根據實驗結果,為不同的數據分析需求推薦合適的降維算法。