主成分分析解讀處理維數的詛咒

主成分分析解讀處理維數的詛咒

主成分分析解讀處理維數的詛咒

機器學習中,我們經常要處理高維數據。但並非我們在模型中使用的所有特徵實際上都與響應變量無關。希望我們的模型能夠更好地學習並提供準確的結果,我們添加許多特徵,這通常會導致我們稱之為“ 維度詛咒 ”的問題,該問題指出:

隨著特徵或維度數量的增加,我們需要準確概括的數據量呈指數級增長。

為了克服這個問題,我們需要確定數據集中最重要的特徵。一種用於從數據集中識別主要特徵從而減少數據集的維數的方法是主成分分析(PCA)。

究竟什麼是PCA?

PCA接受大量變量,使用這些變量之間的依賴關係更易於管理的、低維的形式表示它,而不會丟失太多信息。PCA是數據探索的良好工具,通常作為探索性數據分析(EDA)的一部分。

假設我們的數據集中有n個觀察值和d個變量,我們希望作為EDA的一部分研究不同變量之間的關係。對於更大的

d值,假設為60,我們得到d(d-1)/ 2個二維散點圖。如此大量的圖(在本例中為1770)使得確定特徵之間的關係變得很困難。此外,這些2D圖僅包含數據集中存在的所有信息的一小部分。

這時候就需要用到PCA了。PCA是一種特徵提取技術—它以特定的方式組合輸入變量,然後去掉“最不重要”的變量,同時保留所有變量中最有價值的部分(或主要成分)!

主要成分是什麼?

主成分是數據集中原始特徵的歸一化線性組合。假設我們從d維向量開始並希望通過向下投影到k維子空間來總結它們,這樣新的子空間的軸就指向數據的最大方差的方向。我們的最終結果是將原始向量投影到k方向,稱為主成分(PC)。

主成分分析解讀處理維數的詛咒

圖1:從100個城市的廣告數據(ISLR)子集中獲取的廣告支出(1000s)和人口(10,000s)之間的關係圖。藍點表示平均值(μ)。從圖中可以看出,第一主成分(綠色實線)方向具有最大數據方差,並且它還定義了最接近所有n個觀測值的直線。第一主成分捕獲特徵中包含的大部分信息,使得第一主成分捕獲的可變性越大,成分捕獲的信息越大。

主成分分析解讀處理維數的詛咒

圖2:廣告數據子集(ISLR)中的第一和第二主成分。第二主成分的方向由藍色虛線給出(圖2)。它也是原始特徵的線性組合,其捕獲數據集中的剩餘方差,使得​​第一和第二主成分之間的相關性為零,因此它們的方向彼此正交或垂直。

同樣,對於數據集中的d個特徵,我們可以構造多達d個不同的主成分。

但是我們需要多少主成分?

選擇正確數量的主成分對於確保PCA有效至關重要。包含n個觀察值和d個特徵的數據集佔min(n - 1,d)個不同的主成分。但是我們只對前幾個足以解釋數據集中大量變化的主成分感興趣。

確定這一點的一種方法是查看累積

解釋的方差比,該方差比是成分數量的函數。scree plot描繪了該比值由每個主成分的說明。圖的彎曲部分表示主成分的最佳數量。

主成分分析解讀處理維數的詛咒

圖3:在LFW人臉識別數據集上的PCA之後的累積解釋方差比。圖3中所示的曲線量化了總數中的多少,200維方差包含在前n個分量中。例如,我們看到,面對前40個成分包含超過80%的方差,而我們需要大約150個成分來描述接近100%的方差。

在哪裡使用PCA?

PCA已廣泛用於許多領域,例如計算機視覺和圖像壓縮。它主要用於以下應用:

  • 數據可視化: PCA允許您將高維對象可視化為低維圖像。
  • 偏最小二乘: PCA特徵可以作為偏最小二乘線性模型的基礎。
  • 維度降低:降低特徵維度,僅丟失少量信息。
  • 異常值檢測(提高數據質量):以較少的維度投影一組變量並突出顯示無關的值。

PCA如何表述呢?

給定的矩陣X,其對應於n的觀測與

d特徵以及輸入ķ PCA的主要目的是將矩陣X分解成兩個較小的矩陣,ZW,使得X = ZW,其中z具有維度N * kW的維度為k * d(見圖4)。Z的每一行都是因素加載。W的每一行稱為主成分。

主成分分析解讀處理維數的詛咒

圖4:PCA將矩陣 X分解成兩個較小的矩陣 ZW。在PCA中,我們最小化以下目標函數的平方誤差:

主成分分析解讀處理維數的詛咒

解決PCA有三種常見方法,我們將在下面介紹。

1、奇異值分解(SVD)

這種方法首先使用奇異值分解(SVD)算法求出正交W。然後使用正交W來計算Z如下。

主成分分析解讀處理維數的詛咒

2、交替最小化

這是一種迭代方法,可以在以下兩種情況下交替使用:

  • 固定Z,找到W的最優值
主成分分析解讀處理維數的詛咒

  • 固定W,找到Z的最優值
主成分分析解讀處理維數的詛咒

3、隨機梯度下降

這是一種迭代方法,適用於矩陣X非常大的情況。在每次迭代中,它選擇一個隨機的例子i並以j為特徵更新W

Z

主成分分析解讀處理維數的詛咒

PCA的作用:減少特徵

我們已經知道,根據定義,PCA消除了不太重要的特徵,並幫助生成這些特徵的可視化表示。讓我們看看這在實踐中如何真正應用於特徵縮減問題。在本例中,我們將使用Iris數據集。

數據包含四個屬性:萼片長度,萼片寬度,花瓣長度,

三個物種的花瓣寬度,Setosa,Versicolor,Virginica

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
def plot_slice(X, tX, itX=None, axis_i=0, axis_j=1):
"""
Define a helper function.
"""

species = X.target
n_plots = 2
if itX is not None:
n_plots = 3

plt.figure(figsize=(4 * n_plots, 4))
plt.subplot(1, n_plots, 1)
plt.title('Data')
plt.plot(X.data[species == 0, axis_i], X.data[species == 0, axis_j], "o", color='navy')
plt.plot(X.data[species == 1, axis_i], X.data[species == 1, axis_j], "o", color='turquoise')
plt.plot(X.data[species == 2, axis_i], X.data[species == 2, axis_j], "o", color='darkorange')
plt.xlabel("$X_{" + str(axis_i + 1) + "}$")
plt.ylabel("$X_{" + str(axis_j + 1) + "}$")

plt.subplot(1, n_plots, 2)
plt.title('PCA Transform')
plt.plot(tX[species == 0, axis_i], tX[species == 0, axis_j], "o", color='navy')
plt.plot(tX[species == 1, axis_i], tX[species == 1, axis_j], "o", color='turquoise')
plt.plot(tX[species == 2, axis_i], tX[species == 2, axis_j], "o", color='darkorange')
plt.xlabel("$PC_{" + str(axis_i + 1) + "}$")
plt.ylabel("$PC_{" + str(axis_j + 1) + "}$")

if itX is not None:
plt.subplot(1, n_plots, 3)
plt.title('PCA Inverse Transform')
plt.plot(itX[species == 0, axis_i], itX[species == 0, axis_j], "o", color='navy')
plt.plot(itX[species == 1, axis_i], itX[species == 1, axis_j], "o", color='turquoise')
plt.plot(itX[species == 2, axis_i], itX[species == 2, axis_j], "o", color='darkorange')
plt.xlabel("$X_{" + str(axis_i + 1) + "}$")
plt.ylabel("$X_{" + str(axis_j + 1) + "}$")
plt.show()

# Load Iris Data
iris = load_iris()
# PCA
pca = PCA(n_components=0.95).fit(iris.data)

print("PCA model fit: {:0.0f}% variance captured by {:d} principal components".format(100 * pca.n_components, pca.components_.shape[0]))
components = pca.transform(iris.data)
主成分分析解讀處理維數的詛咒

主成分分析解讀處理維數的詛咒

應用PCA後,2個主要成分捕獲95%的差異。

PCA的作用:特徵提取

在前面的示例中,我們瞭解了PCA如何成為可視化和特徵減少的有用工具。在此示例中,我們將探索PCA作為特徵提取技術。為此,我們將使用LFW人臉識別數據集。

圖像包含大量信息,處理從這些圖像中提取的所有特徵通常需要大量的計算資源。我們通過識別準確描述數據集的重要特徵的組合來解決此問題。

下載並查看數據

我們將從sklearn.datasets.fetch_lfw_people加載faces數據。該數據集由1867張圖像組成,每個圖像的分辨率為62x47。

import numpy as np
import matplotlib.pyplot as plt
import warnings
from sklearn.datasets import fetch_lfw_people
# Download dataset
with warnings.catch_warnings():
warnings.filterwarnings("ignore",category=DeprecationWarning)
faces = fetch_lfw_people(min_faces_per_person=40)
# plot images

fig, axes = plt.subplots(3, 10, figsize=(12, 4),
subplot_kw={'xticks':[], 'yticks':[]},
gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i, ax in enumerate(axes.flat):
ax.imshow(faces.data[i].reshape(62, 47), cmap='bone')
主成分分析解讀處理維數的詛咒

主成分分析解讀處理維數的詛咒

在數據集上應用PCA

為了生成快速演示,我們只需使用scikit-learn的PCA模塊對人臉數據集執行降維,並選擇150個成分(特徵臉),以便最大化數據集的方差。

from sklearn.decomposition import PCA
faces_pca = PCA(n_components=150, svd_solver=’randomized’).fit(faces.data)
# Plot principal components
fig, axes = plt.subplots(3, 10, figsize=(12, 4),
subplot_kw={'xticks':[], 'yticks':[]},
gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i, ax in enumerate(axes.flat):
ax.imshow(faces_pca.components_[i].reshape(62, 47), cmap='bone')
主成分分析解讀處理維數的詛咒

主成分分析解讀處理維數的詛咒

現在我們將使用主成分來形成人臉的投影圖像,並將其與原始數據集進行比較。

components = faces_pca.transform(faces.data)
projected = faces_pca.inverse_transform(components)
# Plot the results
fig, ax = plt.subplots(2, 15, figsize=(15, 2.5),
subplot_kw={‘xticks’:[], ‘yticks’:[]},
gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i in range(15):
ax[0, i].imshow(faces.data[i].reshape(62, 47), cmap=’binary_r’)
ax[1, i].imshow(projected[i].reshape(62, 47), cmap=’binary_r’)

ax[0, 0].set_ylabel(‘complete\nresolution’)
ax[1, 0].set_ylabel(‘150-D\nprojections’);
主成分分析解讀處理維數的詛咒

主成分分析解讀處理維數的詛咒

我們可以看到使用PCA提取的主要特徵捕獲了數據集中的大部分方差,因此,這150個主成分形成的投影非常接近原始數據集中的圖像。

要記住的事情

以下是在進行PCA時應記住的一些要點:

  1. 在進行PCA之前,應首先對數據進行歸一化。這很重要,因為數據集中的不同變量可以用不同的單位來測量。非歸一化數據集上的PCA導致具有對應於其第一PC的特徵向量的最大方差的變量的更高特徵值。
  2. PCA只能應用於數值數據。因此,如果數據也具有分類變量,則必須將它們轉換為數值。這些變量可以使用1-of-N編碼方案來表示而不強加人工排序。
  3. 但是,當大多數獨立特徵是分類時,不會進行PCA。相反CATPCA可以通過優化縮放將類別轉換為數值。


分享到:


相關文章: