隨著數(shù)據(jù)集的規(guī)模和復(fù)雜性的增長,特征或維度的數(shù)量往往變得難以處理,導(dǎo)致計(jì)算需求增加,潛在的過擬合和模型可解釋性降低。降維技術(shù)提供了一種補(bǔ)救方法,它捕獲數(shù)據(jù)中的基本信息,同時丟棄冗余或信息較少的特征。
這個過程不僅簡化了計(jì)算任務(wù),還有助于可視化數(shù)據(jù)趨勢,減輕維度詛咒的風(fēng)險,并提高機(jī)器學(xué)習(xí)模型的泛化性能。降維在各個領(lǐng)域都有應(yīng)用,從圖像和語音處理到金融和生物信息學(xué),在這些領(lǐng)域,從大量數(shù)據(jù)集中提取有意義的模式對于做出明智的決策和建立有效的預(yù)測模型至關(guān)重要。
本文將深入研究三種強(qiáng)大的降維技術(shù)——主成分分析(PCA)、線性判別分析(LDA)和奇異值分解(SVD)。我們不僅介紹這些方法的基本算法,而且提供各自的優(yōu)點(diǎn)和缺點(diǎn)。
主成分分析(PCA)
主成分分析(PCA)是一種廣泛應(yīng)用于數(shù)據(jù)分析和機(jī)器學(xué)習(xí)的降維技術(shù)。它的主要目標(biāo)是將高維數(shù)據(jù)轉(zhuǎn)換為低維表示,捕獲最重要的信息。
我們的目標(biāo)是識別數(shù)據(jù)集中的模式,所以希望數(shù)據(jù)分布在每個維度上,并且在這些維度之間是有獨(dú)立性的。方差作為可變性的度量標(biāo)準(zhǔn),本質(zhì)上量化了數(shù)據(jù)集分散的程度。用數(shù)學(xué)術(shù)語來說,它表示與平均的平均平方偏差。計(jì)算方差的公式用var(x)表示如下:
協(xié)方差量化了兩組有序數(shù)據(jù)中對應(yīng)元素相似的程度。用cov(x, y)表示變量x和y之間的協(xié)方差。xi表示第i維中x的值,而x柱和y柱表示它們各自的平均值。如果我們有一個維數(shù)為m*n的矩陣X,其中包含n個數(shù)據(jù)點(diǎn),每個數(shù)據(jù)點(diǎn)有m維,那么協(xié)方差矩陣可以計(jì)算如下:
協(xié)方差矩陣包括
- 以尺寸方差為主要對角線元素
- 維度的協(xié)方差作為非對角線元素
我們的目標(biāo)是確保數(shù)據(jù)廣泛分散,表明其維度之間的高方差,另外一個目標(biāo)是消除相關(guān)維度,這意味著維度之間的協(xié)方差應(yīng)為零(表明它們的線性無關(guān))。所以對數(shù)據(jù)進(jìn)行變換的目的是使其協(xié)方差矩陣具有以下特征:
- 作為主要對角線元素的顯著值。
- 零值作為非對角線元素。
所以必須對原始數(shù)據(jù)點(diǎn)進(jìn)行變換獲得類似于對角矩陣的協(xié)方差矩陣。將矩陣轉(zhuǎn)換成對角矩陣的過程稱為對角化,它構(gòu)成了主成分分析(PCA)背后的主要動機(jī)。
PCA的工作原理
1、標(biāo)準(zhǔn)化
當(dāng)特征以不同的單位度量時,對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化。這需要減去平均值,然后除以每個特征的標(biāo)準(zhǔn)差。對具有不同尺度特征的數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化的失敗可能導(dǎo)致誤導(dǎo)性的成分。
2、計(jì)算協(xié)方差矩陣
如前面討論的那樣計(jì)算協(xié)方差矩陣
3、計(jì)算特征向量和特征值
確定協(xié)方差矩陣的特征向量和特征值。
特征向量表示方向(主成分),特征值表示這些方向上的方差大小。
4、特征值排序
對特征值按降序排序。與最高特征值相對應(yīng)的特征向量是捕獲數(shù)據(jù)中最大方差的主成分。
5、選擇主成分
根據(jù)需要解釋的方差選擇前k個特征向量(主成分)。一般情況下會設(shè)定閾值,保留總方差的很大一部分,例如85%。
6、轉(zhuǎn)換數(shù)據(jù)
我們可以用特征向量變換原始數(shù)據(jù):
如果我們有m維的n個數(shù)據(jù)點(diǎn)X: m*n
P: k*m
Y = PX: (km)(mn) = (k*n)
新變換矩陣有n個數(shù)據(jù)點(diǎn),有k維。
優(yōu)點(diǎn)
降維:PCA有效地減少了特征的數(shù)量,這對遭受維數(shù)詛咒的模型是有益的。
特征獨(dú)立性:主成分是正交的(不相關(guān)的),這意味著它們捕獲獨(dú)立的信息,簡化了對約簡特征的解釋。
降噪:PCA可以通過專注于解釋數(shù)據(jù)中最顯著方差的成分來幫助減少噪聲。
可視化:降維數(shù)據(jù)可以可視化,有助于理解底層結(jié)構(gòu)和模式。
缺點(diǎn)
原始特征的可解釋性可能在變換后的空間中丟失,因?yàn)橹鞒煞质窃继卣鞯木€性組合。
PCA假設(shè)變量之間的關(guān)系是線性的,但并非在所有情況下都是如此。
PCA對特征的尺度比較敏感,因此常常需要標(biāo)準(zhǔn)化。
異常值可以顯著影響PCA的結(jié)果,因?yàn)樗鼈?cè)重于捕獲最大方差,這可能受到極值的影響。
何時使用
高維數(shù)據(jù):PCA在處理具有大量特征的數(shù)據(jù)集以減輕維度詛咒時特別有用。
共線的特點(diǎn):當(dāng)特征高度相關(guān)時,PCA可以有效地捕獲共享信息并用更少的組件表示它。
可視化:它將數(shù)據(jù)投射到一個較低維度的空間,可以很容易地可視化。
線性關(guān)系:當(dāng)變量之間的關(guān)系大多是線性的,主成分分析是一個合適的技術(shù)。
Python代碼示例
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# Load iris dataset as an example
iris = load_iris()
X = iris.data
y = iris.target
# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Standardize the data (important for PCA)
scaler = StandardScaler()
X_train_std = scaler.fit_transform(X_train)
X_test_std = scaler.transform(X_test)
# Apply PCA
pca = PCA()
X_train_pca = pca.fit_transform(X_train_std)
# Calculate the cumulative explained variance
cumulative_variance_ratio = np.cumsum(pca.explained_variance_ratio_)
# Determine the number of components to keep for 85% variance explained
n_components = np.argmax(cumulative_variance_ratio >= 0.85) + 1
# Apply PCA with the selected number of components
pca = PCA(n_components=n_components)
X_train_pca = pca.fit_transform(X_train_std)
X_test_pca = pca.transform(X_test_std)
# Display the results
print("Original Training Data Shape:", X_train.shape)
print("Reduced Training Data Shape (PCA):", X_train_pca.shape)
print("Number of Components Selected:", n_components)
上面代碼在最初應(yīng)用PCA()時沒有指定組件的數(shù)量,這意味著它將保留所有組件。然后使用np.cumsum(pca.explained_variance_ratio_)計(jì)算累計(jì)解釋方差。確定解釋至少85%方差所需的分量數(shù),并使用選定的分量數(shù)再次應(yīng)用PCA。請注意PCA只應(yīng)用于訓(xùn)練數(shù)據(jù),然后在測試數(shù)據(jù)應(yīng)用轉(zhuǎn)換方法即可。
線性判別分析(LDA)
線性判別分析(LDA)作為一種降維和分類技術(shù),目標(biāo)是優(yōu)化數(shù)據(jù)集中不同類別之間的區(qū)別。LDA在預(yù)先確定數(shù)據(jù)點(diǎn)類別的監(jiān)督學(xué)習(xí)場景中特別流行。PCA被認(rèn)為是一種“無監(jiān)督”算法,它忽略了類標(biāo)簽,專注于尋找主成分以最大化數(shù)據(jù)集方差,而LDA則采用“監(jiān)督”方法。LDA計(jì)算“線性判別器”,確定作為軸的方向,以最大限度地分離多個類。我們這里使用“Iris”數(shù)據(jù)集的示例來了解LDA是如何計(jì)算的。它包含了來自三個不同物種的150朵鳶尾花的尺寸。
Iris數(shù)據(jù)集中有三個類:
- Iris-setosa (n=50)
- Iris-versicolor (n=50)
- Iris-virginica (n=50)
有四個特征:
- sepal length in cm
- sepal width in cm
- petal length in cm
- petal width in cm
LDA的工作步驟
1、計(jì)算三種不同花類的平均向量mi, (i=1,2,3):
Mean Vector class 1: [ 5.006 3.418 1.464 0.244]
Mean Vector class 2: [ 5.936 2.77 4.26 1.326]
Mean Vector class 3: [ 6.588 2.974 5.552 2.026]
每個向量包含特定類的數(shù)據(jù)集中4個特征的平均值。
2、計(jì)算類內(nèi)散點(diǎn)矩陣(Sw),它表示每個類內(nèi)數(shù)據(jù)的分布
結(jié)果如下:
within-class Scatter Matrix:
[[ 38.9562 13.683 24.614 5.6556]
[ 13.683 17.035 8.12 4.9132]
[ 24.614 8.12 27.22 6.2536]
[ 5.6556 4.9132 6.2536 6.1756]]
3、計(jì)算類間散點(diǎn)矩陣(Sb), Sb表示不同類之間的分布,公式如下:
結(jié)果如下:
between-class Scatter Matrix:
[[ 63.2121 -19.534 165.1647 71.3631]
[ -19.534 10.9776 -56.0552 -22.4924]
[ 165.1647 -56.0552 436.6437 186.9081]
[ 71.3631 -22.4924 186.9081 80.6041]]
4、計(jì)算Sw-1Sb的特征值和特征向量(類似于PCA)。在我們的例子中,有4個特征值和特征向量
Eigenvector 1:
[[-0.2049]
[-0.3871]
[ 0.5465]
[ 0.7138]]
Eigenvalue 1: 3.23e+01
Eigenvector 2:
[[-0.009 ]
[-0.589 ]
[ 0.2543]
[-0.767 ]]
Eigenvalue 2: 2.78e-01
Eigenvector 3:
[[ 0.179 ]
[-0.3178]
[-0.3658]
[ 0.6011]]
Eigenvalue 3: -4.02e-17
Eigenvector 4:
[[ 0.179 ]
[-0.3178]
[-0.3658]
[ 0.6011]]
Eigenvalue 4: -4.02e-17
5、通過減少特征值對特征向量進(jìn)行排序,并選擇最上面的k。
通過減少特征值對特征對進(jìn)行排序后,基于2個信息量最大的特征對構(gòu)建d×k維度特征向量矩陣(稱之為W)。在下面的例子中,得到了下面的矩陣:
Matrix W:
[[-0.2049 -0.009 ]
[-0.3871 -0.589 ]
[ 0.5465 0.2543]
[ 0.7138 -0.767 ]]
6、使用矩陣W (4 × 2矩陣)通過方程將樣本轉(zhuǎn)換到新的子空間:Y = X*W,其中X是矩陣格式的原始數(shù)據(jù)(150 × 4矩陣),Y是轉(zhuǎn)換后的數(shù)據(jù)集(150 × 2矩陣)。
優(yōu)點(diǎn)
最大化類分離:LDA的目的是最大限度地分離不同的類,使其有效的分類任務(wù)。
降維:與PCA一樣,LDA也可用于降維,其優(yōu)點(diǎn)是考慮了類信息。
缺點(diǎn)
對異常值的敏感性:LDA對異常值非常敏感,異常值的存在會影響方法的性能。
正態(tài)性假設(shè):LDA假設(shè)每個類中的特征是正態(tài)分布的,如果違反了這個假設(shè),它可能無法很好地執(zhí)行。
需要足夠的數(shù)據(jù):LDA在每個類只有少量樣本的情況下可能表現(xiàn)不佳。擁有更多的樣本可以改善類參數(shù)的估計(jì)。
何時使用
分類任務(wù):當(dāng)目標(biāo)是將數(shù)據(jù)分類到預(yù)定義的類中時,LDA是有益的。
保存類信息:當(dāng)目標(biāo)是在降低維數(shù)的同時保留與區(qū)分類相關(guān)的信息時,LDA非常有用
正態(tài)性假設(shè)成立:當(dāng)類別內(nèi)的正態(tài)分布假設(shè)成立時,LDA表現(xiàn)良好。
監(jiān)督降維:當(dāng)任務(wù)需要在類標(biāo)簽的指導(dǎo)下進(jìn)行降維時,LDA是一個合適的選擇。
Python代碼示例
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler
# Generate a sample dataset
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Standardize the features (important for LDA)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Initialize LDA and fit on the training data
lda = LinearDiscriminantAnalysis()
X_train_lda = lda.fit_transform(X_train, y_train)
# Calculate explained variance ratio for each component
explained_variance_ratio = lda.explained_variance_ratio_
# Calculate the cumulative explained variance
cumulative_explained_variance = np.cumsum(explained_variance_ratio)
# Find the number of components that explain at least 75% of the variance
n_components = np.argmax(cumulative_explained_variance >= 0.75) + 1
# Transform both the training and test data to the selected number of components
X_train_lda_selected = lda.transform(X_train)[:, :n_components]
X_test_lda_selected = lda.transform(X_test)[:, :n_components]
# Print the number of components selected
print(f"Number of components selected: {n_components}")
奇異值分解(SVD)
奇異值分解是一種矩陣分解技術(shù),廣泛應(yīng)用于線性代數(shù)、信號處理和機(jī)器學(xué)習(xí)等領(lǐng)域。它將一個矩陣分解成另外三個矩陣,原始矩陣以簡化形式表示。
SVD的工作步驟
1、矩陣分解
給定大小為M × n的矩陣M(或有M行n列的數(shù)據(jù)),奇異值分解將其分解為三個矩陣:M = u *Σ *v *
其中U是一個m × m正交矩陣,Σ是一個m × r對角矩陣,V是一個r × n正交矩陣。r是矩陣M的秩。
Σ的對角線元素為原矩陣M的奇異值,按降序排列。U的列是m的左奇異向量,這些向量構(gòu)成了m的列空間的正交基,V的列是m的右奇異向量,這些向量構(gòu)成了m的行空間的正交基。
2、簡化形式(Truncated SVD)
對于降維,通常使用截?cái)喟姹镜钠娈愔捣纸狻_x擇Σ中前k個最大的奇異值。這些列可以從Σ中選擇,行可以從V 中選擇。由原矩陣M重構(gòu)出一個新的矩陣B,公式如下:
B = u *Σ,B = V *A
其中Σ只包含原始Σ中奇異值的前k列,V包含原始V中奇異值對應(yīng)的前k行。
優(yōu)點(diǎn)
降維:SVD允許通過只保留最重要的奇異值和向量來降低維數(shù)。
數(shù)據(jù)壓縮:SVD用于數(shù)據(jù)壓縮任務(wù),減少了矩陣的存儲需求。
降噪:通過只使用最顯著的奇異值,奇異值分解可以幫助減少數(shù)據(jù)中噪聲的影響。
數(shù)值穩(wěn)定性:奇異值分解在數(shù)值上是穩(wěn)定的,適合于求解病態(tài)系統(tǒng)中的線性方程。
正交性:SVD分解中的矩陣U和V是正交的,保留了原矩陣的行與列之間的關(guān)系。
推薦系統(tǒng)中的應(yīng)用:奇異值分解廣泛應(yīng)用于推薦系統(tǒng)的協(xié)同過濾。
缺點(diǎn)
計(jì)算復(fù)雜度:計(jì)算大型矩陣的完整SVD在計(jì)算上是非常昂貴的。
內(nèi)存需求:存儲完整的矩陣U、Σ和V可能會占用大量內(nèi)存,特別是對于大型矩陣。
對缺失值的敏感性:SVD對數(shù)據(jù)中的缺失值很敏感,處理缺失值需要專門的技術(shù)。
何時使用
降維:當(dāng)目標(biāo)是在保留數(shù)據(jù)基本結(jié)構(gòu)的同時降低數(shù)據(jù)的維數(shù)時。
推薦系統(tǒng):在基于協(xié)同過濾的推薦系統(tǒng)中,SVD用于識別捕獲用戶-物品交互的潛在因素。
數(shù)據(jù)壓縮:在需要壓縮或近似大型數(shù)據(jù)集的場景中。
信號處理:在信號處理中,采用奇異值分解進(jìn)行降噪和特征提取。
主題建模:SVD被用于主題建模技術(shù),如潛在語義分析(LSA)。
Python代碼示例
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.decomposition import TruncatedSVD
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler
# Generate a sample dataset
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Standardize the features (important for SVD)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Initialize SVD and fit on the training data
svd = TruncatedSVD(n_components=X_train.shape[1] - 1) # Use one less component than the feature count
X_train_svd = svd.fit_transform(X_train)
# Calculate explained variance ratio for each component
explained_variance_ratio = svd.explained_variance_ratio_
# Calculate the cumulative explained variance
cumulative_explained_variance = np.cumsum(explained_variance_ratio)
# Find the number of components that explain at least 75% of the variance
n_components = np.argmax(cumulative_explained_variance >= 0.75) + 1
# Transform both the training and test data to the selected number of components
X_train_svd_selected = svd.transform(X_train)[:, :n_components]
X_test_svd_selected = svd.transform(X_test)[:, :n_components]
# Print the number of components selected
print(f"Number of components selected: {n_components}")
總結(jié)
在主成分分析(PCA)、線性判別分析(LDA)和奇異值分解(SVD)之間的選擇取決于數(shù)據(jù)的具體目標(biāo)和特征。以下是關(guān)于何時使用每種技術(shù)的一般指導(dǎo)原則:
主成分分析:
- 當(dāng)目標(biāo)是降低數(shù)據(jù)集的維數(shù)時。
- 在捕獲數(shù)據(jù)中的全局模式和關(guān)系至關(guān)重要的場景中。
- 用于探索性數(shù)據(jù)分析和可視化。
線性判別分析:
- 在分類問題中,增強(qiáng)類之間的分離。
- 當(dāng)有一個標(biāo)記的數(shù)據(jù)集時,目標(biāo)是找到一個最大化階級歧視的投影。
- 當(dāng)正態(tài)分布類和等協(xié)方差矩陣的假設(shè)成立時,LDA特別有效。
奇異值分解:
- 當(dāng)處理稀疏數(shù)據(jù)或缺失值時。
- 推薦系統(tǒng)的協(xié)同過濾。
- 奇異值分解也適用于數(shù)據(jù)壓縮和去噪。
三個技術(shù)的對比:
無監(jiān)督vs有監(jiān)督學(xué)習(xí):PCA是無監(jiān)督的,而LDA是有監(jiān)督的。根據(jù)標(biāo)記數(shù)據(jù)的可用性進(jìn)行選擇。
類可分離性:如果目標(biāo)是改進(jìn)類可分離性,那么首選LDA。PCA和SVD關(guān)注的是總體方差。
數(shù)據(jù)特征:數(shù)據(jù)的特征,如線性、類別分布和異常值的存在,會影響選擇。
特定于應(yīng)用程序的需求:考慮應(yīng)用程序的特定需求,例如可解釋性、計(jì)算效率或?qū)G失數(shù)據(jù)的處理。
綜上所述,PCA適用于無監(jiān)督降維,LDA適用于關(guān)注類可分性的監(jiān)督問題,而SVD具有通用性,可用于包括協(xié)同過濾和矩陣分解在內(nèi)的各種應(yīng)用。
-
PCA
+關(guān)注
關(guān)注
0文章
89瀏覽量
29608 -
SVD
+關(guān)注
關(guān)注
0文章
21瀏覽量
12173 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8418瀏覽量
132635 -
LDA
+關(guān)注
關(guān)注
0文章
29瀏覽量
10608 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84689
發(fā)布評論請先 登錄
相關(guān)推薦
評論