機器學習中,高維度資料經常造成計算負擔和模型過擬合,降維技術能有效解決這些問題。線性判別分析(LDA)尋求最大化類別間分離的投影方向,適用於分類別任務。區域性線性嵌入(LLE)和 t-SNE 則著重保留資料的區域性結構,t-SNE 擅長處理非線性資料,常用於資料視覺化。主成分分析(PCA)則是一種無監督方法,找出資料變異最大的方向,適用於去除冗餘特徵和降低維度。

在實務應用上,選擇合適的降維技術取決於資料特性和目標。針對分類別問題,LDA 能有效區分不同類別;若需保留區域性結構,LLE 和 t-SNE 是較佳選擇,其中 t-SNE 更適合非線性資料。PCA 則適用於降低維度和去除冗餘特徵,提升模型效率。實際操作中,可根據 iris 和 digits 等資料集的實驗結果,評估不同降維方法的表現,選擇最符合需求的技術。

玄貓的機器學習之旅:LDA 分析 iris 資料集

在機器學習的世界中,線性判別分析(Linear Discriminant Analysis, LDA)是一種強大的工具,能夠幫助我們理解和分類別資料。今天,我們將探索如何使用 LDA 分析著名的 iris 資料集。

什麼是 LDA?

LDA 是一種監督式學習演算法,旨在尋找最能區分不同類別的特徵組合。它透過計算每個特徵的均值和方差,然後使用這些資訊來計算判別函式。這些函式可以用來預測新的、未知的資料屬於哪個類別。

iris 資料集

iris 資料集是一個經典的多變數資料集,包含 150 個樣本,每個樣本描述了一種鳶尾花的四個特徵:花萼長度、花萼寬度、花瓣長度和花瓣寬度。這些樣本分為三個類別:setosa、versicolor 和 virginica。

LDA 分析 iris 資料集

當我們對 iris 資料集進行 LDA 分析時,我們可以看到以下結果:

特徵值

  • 3
  • 2
  • 1
  • 0
  • –1
  • –2

特徵向量

  • –10.0
  • –7.5
  • –5.0
  • –2.5
  • 0.0
  • 2.5
  • 5.0
  • 7.5
  • 10.0

分類別結果

透過 LDA 分析,我們可以看到 setosa、versicolor 和 virginica 三個類別之間的明顯區別。這些結果表明 LDA 能夠有效地分類別 iris 資料集。

內容解密:

LDA 的核心思想是尋找最能區分不同類別的特徵組合。它透過計算每個特徵的均值和方差,然後使用這些資訊來計算判別函式。這些函式可以用來預測新的、未知的資料屬於哪個類別。在 iris 資料集的例子中,LDA 能夠有效地分類別 setosa、versicolor 和 virginica 三個類別。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.datasets import load_iris
import numpy as np

# 載入 iris 資料集
iris = load_iris()
X = iris.data
y = iris.target

# 建立 LDA 模型
lda = LDA(n_components=2)

# 對資料進行 LDA 轉換
X_lda = lda.fit_transform(X, y)

# 繪製 LDA 轉換後的資料
import matplotlib.pyplot as plt

plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y)
plt.xlabel('LDA 特徵 1')
plt.ylabel('LDA 特徵 2')
plt.title('LDA 分析 iris 資料集')
plt.show()

圖表翻譯:

上述程式碼使用 LDA 對 iris 資料集進行轉換,並繪製出轉換後的資料分佈。圖表顯示了 setosa、versicolor 和 virginica 三個類別之間的明顯區別,證明瞭 LDA 能夠有效地分類別不同的類別。

  flowchart TD
    A[載入 iris 資料集] --> B[建立 LDA 模型]
    B --> C[對資料進行 LDA 轉換]
    C --> D[繪製 LDA 轉換後的資料]
    D --> E[顯示結果]

圖表翻譯:

此流程圖描述了使用 LDA 分析 iris 資料集的步驟。從載入資料集開始,建立 LDA 模型,然後對資料進行轉換,最後繪製出轉換後的資料分佈。這個過程展示瞭如何使用 LDA 進行資料分析和視覺化。

使用PCA和LDA進行維度降低的比較

在進行機器學習任務時,維度降低是一個非常重要的步驟。維度降低可以幫助我們減少特徵之間的冗餘性,提高模型的效率和準確性。其中,PCA(主成分分析)和LDA(線性判別分析)是兩種常用的維度降低方法。

資料集介紹

我們將使用iris資料集和wine資料集來進行比較。iris資料集是一個經典的多類別分類別資料集,包含三個類別(setosa、versicolor和virginica),每個類別有50個樣本,每個樣本有4個特徵。wine資料集也是一個多類別分類別資料集,包含三個類別(class_0、class_1和class_2),每個類別有59、71和48個樣本,分別。

PCA和LDA的比較

首先,我們使用PCA和LDA對iris資料集進行維度降低。結果顯示,兩種方法都可以有效地分離資料。但是,如果我們將同樣的方法應用到wine資料集,我們會發現LDA具有更明顯的優勢。

iris資料集的PCA和LDA結果

  flowchart TD
    A[iris資料集] --> B[PCA]
    B --> C[分離資料]
    A --> D[LDA]
    D --> E[分離資料]

wine資料集的PCA和LDA結果

  flowchart TD
    F[wine資料集] --> G[PCA]
    G --> H[部分分離資料]
    F --> I[LDA]
    I --> J[完全分離資料]
圖表翻譯:

上述流程圖展示了PCA和LDA對iris資料集和wine資料集的效果。從圖中可以看出,LDA在wine資料集上具有更好的分離效果。

內容解密:

在上述程式碼中,我們使用了PCA和LDA對iris資料集和wine資料集進行維度降低。結果顯示,LDA在wine資料集上具有更明顯的優勢。這是因為LDA是一種監督式學習方法,它可以根據類別標籤對資料進行分離。而PCA是一種無監督式學習方法,它只能根據資料的分佈情況對資料進行降維。因此,在某些情況下,LDA可能具有更好的效果。

2.5.1.4 區域性線性嵌入(Locally Linear Embedding)

在討論LLE方法之前,我們需要了解非線性降維的方法。如前所述,我們可以使用監督和非監督的線性降維技術,例如PCA、ICA或LDA,來進行線性資料投影。這些方法的缺點是它們可能會忽略資料中的重要非線性結構。在非線性降維中,目標是從高維觀測空間中還原低維流形(見下文)的表示。線性技術主要採用線性代數的概念來進行降維,但在許多實際應用中,資料往往是非線性的。

LLE是一種無監督學習演算法,計算高維輸入的低維、鄰域保留嵌入。LLE根據流形學習,是一類別無監督估計器,旨在描述資料集為高維空間中嵌入的低維流形。例如,一張紙張是一個二維物體,存在於我們的三維環境中。如果我們對紙張進行線性操作,如旋轉、重新定向或拉伸,在三維空間中,我們不會改變紙張的平面幾何。但是,如果我們將紙張皺褶、彎曲或捲曲,我們仍然有一個二維流形,但其嵌入到三維空間的方式不再是線性的。

LLE利用區域性對稱性來發現高維資料中的非線性流形結構。要計算LLE並對映高維資料點(X_i)到低維嵌入向量(Y_i\,我們需要遵循以下步驟:

  1. 計算鄰域:首先,我們需要計算每個資料點(X_i)的鄰域,並計算權重(W_{ij}),使得每個資料點(X_i)從其鄰域最佳地重構,從而最小化以下方程的成本: [ \epsilon(W) = \sum_i \left| X_i - \sum_j W_{ij} X_j \right|^2 ] 其中(W_{ij})是描述第(j)個資料點對第(i)個重構貢獻的權重。

  2. 鄰域選擇:在最簡單的公式中,我們根據某種距離度量(如歐幾裡得距離)確定每個資料點的K個最近鄰域。我們也可以使用更複雜的方法,例如選擇半徑內的點來選擇鄰域。

  3. 權重計算:給定鄰域後,我們計算每個資料點的權重(W_{ij}),使得重構誤差最小化。這通常涉及解一個最佳化問題,以滿足兩個約束:每個資料點僅從其鄰域重構,而權重(W_{ij})應該是非負且歸一化的。

內容解密:

LLE演算法透過保留資料點之間的區域性鄰域關係,將高維資料對映到低維空間中。這種方法能夠捕捉到資料中的非線性結構,使其成為處理高維非線性資料的有效工具。

圖表翻譯:

  graph LR
    A[高維資料] -->|LLE演算法|> B[低維嵌入]
    B -->|保留區域性鄰域關係|> C[非線性結構]
    C -->|捕捉資料特徵|> D[有效降維]

這個圖表展示了LLE演算法如何將高維資料對映到低維空間中,並保留資料點之間的區域性鄰域關係,從而捕捉到資料中的非線性結構。

非線性降維技術:區域性線性嵌入(LLE)

區域性線性嵌入(Local Linear Embedding, LLE)是一種非線性降維技術,旨在保留高維資料的區域性結構。LLE 的基本思想是假設高維資料點可以被表示為其鄰近資料點的線性組合,並且這種線性關係可以被保留在低維空間中。

LLE 的步驟

  1. 計算鄰近矩陣:對於每個資料點,計算其與鄰近資料點之間的距離,並選擇前 $k$ 個鄰近資料點。
  2. 計算重構權重:計算每個資料點與其鄰近資料點之間的重構權重,目的是使得每個資料點可以被其鄰近資料點的線性組合所表示。
  3. 計算低維表示:使用重構權重計算每個資料點在低維空間中的表示。

LLE 的優點

  • LLE 可以保留高維資料的區域性結構,從而得到更好的降維效果。
  • LLE 不需要明確的距離度量,可以適用於不同型別的資料。

LLE 的缺點

  • LLE 的計算複雜度較高,尤其是在大規模資料集上。
  • LLE 需要選擇適當的鄰近資料點數目 $k$,否則可能會得到不佳的降維效果。

LLE 的應用

  • 資料視覺化:LLE 可以用於將高維資料降維到二維或三維空間,以便於視覺化和理解。
  • 特徵提取:LLE 可以用於提取高維資料的有用特徵,以便於後續的機器學習任務。

實驗結果

下圖展示了 LLE 在瑞士捲(Swiss Roll)資料集上的效果。瑞士捲是一個典型的非線性降維問題,LLE 可以有效地將其降維到二維空間中。

from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
import numpy as np
from sklearn.manifold import LocallyLinearEmbedding

# 載入數字資料集
digits = load_digits()

# 定義 LLE 引數
n_neighbors = 30
n_components = 2

# 執行 LLE
lle = LocallyLinearEmbedding(n_neighbors=n_neighbors, n_components=n_components)
X_lle = lle.fit_transform(digits.data)

# 繪製結果
plt.figure(figsize=(10, 10))
plt.scatter(X_lle[:, 0], X_lle[:, 1], c=digits.target)
plt.title("LLE on Digits Dataset")
plt.show()

使用LLE進行資料降維和視覺化

在進行資料分析時,瞭解資料的分佈和結構至關重要。其中一個常用的技術是區域性線性嵌入(Local Linear Embedding, LLE),它可以幫助我們將高維資料降維到低維空間中,以便更好地理解資料的內在結構。

LLE的原理

LLE是一種非線性降維技術,它試圖保留資料在高維空間中的區域性結構。在LLE中,每個資料點都被表示為其鄰近點的線性組合。這樣,LLE就可以學習到資料的區域性幾何結構,並將其對映到低維空間中。

實作LLE

要實作LLE,我們需要先定義一個函式來繪製嵌入結果。這個函式應該能夠顯示資料點在嵌入空間中的分佈,並且允許我們控制是否顯示資料點之間的關係。

import numpy as np
from matplotlib import offsetbox
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt

def plot_embedding_function(X, title, ax):
    # 對資料進行縮放
    X = MinMaxScaler().fit_transform(X)

    # 繪製每個資料點
    for digit in range(10):
        ax.scatter(
            *X[digit == y].T,
            marker=f"${digit}$",
            s=60,
            color=plt.cm.Dark2(digit),
            alpha=0.425,
            zorder=2,
        )

    # 顯示每個資料點的影像
    shown_images = np.array([[1.0, 1.0]])
    for i in range(X.shape[0]):
        dist = np.sum((X[i] - shown_images) ** 2, 1)
        if np.min(dist) < 0.04:
            continue

        imagebox = offsetbox.AnnotationBbox(
            offsetbox.OffsetImage(digits.images[i], cmap=plt.cm.gray_r), X[i]
        )
        imagebox.set(zorder=1)
        ax.add_artist(imagebox)

    ax.set_title(title)

應用LLE進行資料視覺化

使用上述函式,我們可以輕鬆地視覺化資料在嵌入空間中的分佈。這有助於我們瞭解資料的內在結構和模式。

# 載入資料
from sklearn.datasets import load_digits
digits = load_digits()

# 定義標籤
y = digits.target

# 建立子圖
fig, ax = plt.subplots(figsize=(10, 10))

# 繪製嵌入結果
plot_embedding_function(digits.data, "LLE Embedding", ax)

plt.show()

這樣,我們就可以使用LLE對資料進行降維和視覺化,從而更好地理解資料的內在結構和模式。

使用Scikit-learn實作區域性線性嵌入(LLE)

區域性線性嵌入(LLE)是一種非線性降維技術,能夠保留高維資料的區域性結構。以下是使用Scikit-learn實作LLE的步驟:

步驟1:匯入必要的函式庫

from sklearn.manifold import LocallyLinearEmbedding

步驟2:定義LLE引數

n_neighbors = 10  # 鄰居數量
n_components = 2  # 降維後的維度數量
method = "standard"  # LLE方法

步驟3:建立LLE物件

embeddings = {
    "Standard LLE": LocallyLinearEmbedding(
        n_neighbors=n_neighbors, n_components=n_components, method=method
    ),
}

步驟4:進行資料投影

from time import time

projections, timing = {}, {}

for name, transformer in embeddings.items():
    if name.startswith("Standard LLE"):
        data = X.copy()
        data.flat[:: X.shape[1] + 1] += 0.01
    else:
        data = X

    print(f"{name}...")

    start_time = time()
    projections[name] = transformer.fit_transform(data)
    timing[name] = time() - start_time

內容解密:

在上述程式碼中,我們首先匯入了Scikit-learn的LocallyLinearEmbedding類別,然後定義了LLE的引數,包括鄰居數量、降維後的維度數量和LLE方法。接下來,我們建立了LLE物件,並進行了資料投影。注意,在投影過程中,我們增加了一個小的隨機噪聲,以避免資料過度集中。

圖表翻譯:

以下是LLE投影過程的Mermaid圖表:

  flowchart TD
    A[原始資料] --> B[新增隨機噪聲]
    B --> C[進行LLE投影]
    C --> D[獲得降維資料]

在這個圖表中,我們可以看到原始資料首先增加了一個小的隨機噪聲,然後進行了LLE投影,最終獲得了降維資料。這個圖表幫助我們理解了LLE投影的過程和原理。

特徵萃取與選取

在機器學習中,特徵萃取與選取是一個非常重要的步驟。它可以幫助我們從原始資料中提取出有用的特徵,以提高模型的表現。在這個章節中,我們將探討一些常見的特徵萃取與選取方法,包括線性區域性嵌入(LLE)及其變體。

線性區域性嵌入(LLE)

LLE是一種非線性降維技術,它可以將高維度的資料對映到低維度的空間中。它的基本思想是假設資料點在高維度空間中是區域性線性的,即每個資料點都可以被其鄰近的資料點以線性的方式描述。然後,LLE會嘗試保留這些區域性線性的關係,並將資料點對映到低維度的空間中。

from sklearn.manifold import LocallyLinearEmbedding
from sklearn.preprocessing import MinMaxScaler

# 資料預處理
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)

# LLE引數設定
n_neighbors = 10
n_components = 2

# LLE實施
lle = LocallyLinearEmbedding(n_neighbors=n_neighbors, n_components=n_components)
embeddings = lle.fit_transform(data_scaled)

LLE變體

LLE有一些變體,包括Hessian區域性線性嵌入(HLLE)、修改區域性線性嵌入(MLLE)和區域性切面空間對齊(LTSA)。這些變體可以解決LLE的一些問題,例如正則化問題。

  • HLLE:使用Hessian根據二次形式在每個鄰近區域還原區域性線性結構。
  • MLLE:解決正則化問題。
  • LTSA:在鄰近區域上應用PCA以構建區域性線性補丁,作為點的切面空間的近似。
# HLLE實施
from sklearn.manifold import HessianLocallyLinearEmbedding
hlle = HessianLocallyLinearEmbedding(n_neighbors=n_neighbors, n_components=n_components)

# MLLE實施
from sklearn.manifold import ModifiedLocallyLinearEmbedding
mlle = ModifiedLocallyLinearEmbedding(n_neighbors=n_neighbors, n_components=n_components)

# LTSA實施
from sklearn.manifold import LocalTangentSpaceAlignment
ltsa = LocalTangentSpaceAlignment(n_neighbors=n_neighbors, n_components=n_components)

圖表翻譯:

  flowchart TD
    A[原始資料] --> B[資料預處理]
    B --> C[LLE或其變體]
    C --> D[降維結果]
    D --> E[視覺化]

在這個流程圖中,我們可以看到原始資料首先經過預處理,然後使用LLE或其變體進行降維,最後得到降維結果並進行視覺化。

2.5.1.5 t-分佈隨機鄰近嵌入技術

在視覺化高維度資料時,我們可以使用t-分佈隨機鄰近嵌入(t-SNE)技術,這是一種無監督且非線性的技術,將資料點之間的相似度轉換為聯合機率。Kullback-Leibler 散度被最小化於低維度嵌入和高維度資料之間的聯合機率。

t-SNE 方法使用一個維度不可知的機率分佈來模擬資料集,以找到一個低維度的近似值,其分佈與原始資料集相匹配(圖 2.13)。

與PCA嘗試保留大型配對距離以最大化變異數不同,t-SNE只關注保留小型配對距離。如果特徵數量很高,建議在應用t-SNE時使用PCA等降維方法來減少計算時間和抑制雜訊。

讓我們使用scikit-learn套件在digits資料集上應用PCA、LDA和t-SNE。以下是程式碼:

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.manifold import TSNE

# 載入digits資料集
digits = datasets.load_digits()

# 取得資料和標籤
X = digits.data
y = digits.target
target_digits = digits.target_names

# 使用PCA進行降維
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 使用LDA進行降維
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X, y)

# 使用t-SNE進行降維
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)

# 繪製結果
plt.figure(figsize=(12, 6))

plt.subplot(1, 3, 1)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)
plt.title("PCA")

plt.subplot(1, 3, 2)
plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y)
plt.title("LDA")

plt.subplot(1, 3, 3)
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y)
plt.title("t-SNE")

plt.show()

這段程式碼會載入digits資料集,然後使用PCA、LDA和t-SNE進行降維,最後繪製出三種方法的結果。

t-SNE演算法步驟詳解

t-SNE(t-distributed Stochastic Neighbor Embedding)是一種非線性降維技術,常用於高維度資料的視覺化。以下是t-SNE演算法的步驟詳解:

步驟1:初始化解

首先,我們需要初始化一個解。這個解可以是隨機生成的,也可以是根據某些初始假設。假設我們有一個高維度資料集(X = {x_1, x_2,…, x_n}),我們希望將其對映到一個低維度空間(Y = {y_1, y_2,…, y_n})。

步驟2:計算配對親和力

接下來,我們需要計算每個資料點之間的配對親和力(pairwise affinities)。這是使用以下公式計算的:

[p_{j|i} = \frac{\exp(-|x_i - x_j|^2 / 2\sigma_i^2)}{\sum_{k \neq i} \exp(-|x_i - x_k|^2 / 2\sigma_i^2)}]

其中,(\sigma_i)是資料點(x_i)的方差,(|x_i - x_j|)是資料點(x_i)和(x_j)之間的距離。

步驟3:設定perplexity

perplexity是一個超引數,控制著資料點之間的相似度。它的值通常在5到50之間。perplexity越大,表示資料點之間的相似度越低。

步驟4:計算低維度空間中的配對親和力

在低維度空間中,我們使用以下公式計算配對親和力:

[q_{ij} = \frac{(1 + |y_i - y_j|^2)^{-1}}{\sum_{k \neq i} (1 + |y_i - y_k|^2)^{-1}}]

步驟5:最佳化目標函式

t-SNE的目標函式是KL散度(Kullback-Leibler divergence) giữa高維度空間中的配對親和力和低維度空間中的配對親和力。最佳化目標函式可以使用梯度下降法等最佳化演算法。

步驟6:迭代最佳化

最後,我們需要迭代最佳化目標函式,直到收斂。每次迭代,我們更新低維度空間中的資料點位置,直到KL散度最小化。

內容解密:

上述步驟詳解了t-SNE演算法的工作原理。t-SNE是一種強大的非線性降維技術,可以有效地視覺化高維度資料。但是,t-SNE也有一些侷限性,例如計算複雜度高、難以解釋結果等。

圖表翻譯:

  graph LR
    A[高維度資料集] -->|初始化解|> B[低維度空間]
    B -->|計算配對親和力|> C[配對親和力矩陣]
    C -->|設定perplexity|> D[perplexity]
    D -->|計算低維度空間中的配對親和力|> E[低維度空間中的配對親和力矩陣]
    E -->|最佳化目標函式|> F[KL散度]
    F -->|迭代最佳化|> G[收斂]

上述圖表展示了t-SNE演算法的工作流程。從高維度資料集開始,初始化解,計算配對親和力,設定perplexity,計算低維度空間中的配對親和力,最佳化目標函式,迭代最佳化,直到收斂。

高維度資料降維技術

在資料分析和機器學習中,高維度資料常常會導致計算複雜度增加和模型過擬合。為瞭解決這個問題,研究人員和開發者們開發了多種降維技術。其中,PCA(主成分分析)、LDA(線性判別分析)和t-SNE(t-分佈鄰域嵌入)是三種常用的方法。

PCA(主成分分析)

PCA是一種無監督學習的降維技術,旨在找到原始資料中最能代表資料變異性的主成分。這些主成分是透過對原始資料進行正交變換得到的,保證了新生成的特徵之間無相關性。以下是使用PCA進行降維的Python程式碼範例:

from sklearn.decomposition import PCA
import numpy as np

# 假設X是原始資料
pca = PCA(n_components=2)  # 選擇保留2個主成分
X_pca = pca.fit_transform(X)

LDA(線性判別分析)

LDA是一種有監督學習的降維技術,旨在找到最佳的投影方向,使得不同類別的資料在新的特徵空間中分離度最大。LDA考慮了類別之間的差異,試圖找到最能區分不同類別的特徵。以下是使用LDA進行降維的Python程式碼範例:

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import numpy as np

# 假設X是原始資料,y是類別標籤
lda = LinearDiscriminantAnalysis(n_components=2)  # 選擇保留2個特徵
X_lda = lda.fit_transform(X, y)

t-SNE(t-分佈鄰域嵌入)

t-SNE是一種非線性降維技術,旨在保留原始資料中的區域性結構。它透過計算原始資料中每對點之間的相似度,並將其對映到低維度空間中,試圖保持原始資料中的鄰域關係。t-SNE常用於視覺化高維度資料。以下是使用t-SNE進行降維的Python程式碼範例:

from sklearn.manifold import TSNE
import numpy as np

# 假設X是原始資料
tsne = TSNE(n_components=2, learning_rate='auto', init='pca')  # 選擇保留2個特徵
X_tsne = tsne.fit_transform(X)

內容解密:

上述程式碼示範瞭如何使用PCA、LDA和t-SNE進行降維。這些方法都可以用來減少高維度資料的維度,從而簡化後續的分析和模型訓練過程。然而,每種方法都有其適用場景和限制,選擇哪種方法取決於具體的資料特徵和分析目標。

圖表翻譯:

  flowchart TD
    A[原始資料] --> B[PCA]
    A --> C[LDA]
    A --> D[t-SNE]
    B --> E[低維度資料]
    C --> E
    D --> E

這個流程圖描述了從原始資料到低維度資料的轉換過程,展示了PCA、LDA和t-SNE在此過程中的作用。

主題:降維技術在資料視覺化中的應用

1.

在資料分析和機器學習中,高維度資料往往給視覺化和模型訓練帶來挑戰。為了更好地理解和呈現這些資料,降維技術被廣泛應用。降維技術的目的是將高維度資料對映到低維度空間,同時保留資料的主要特徵。在本文中,我們將探討三種常見的降維技術:主成分分析(PCA)、線性判別分析(LDA)和t-分佈隨機鄰域嵌入(t-SNE),並展示如何使用Python的Matplotlib函式庫對資料進行視覺化。

2. 主成分分析(PCA)

PCA是一種無監督學習方法,旨在找到資料中變異性最大的方向,即主成分。透過投影到這些主成分上,高維度資料可以被降維到低維度空間。

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_digits

# 載入資料
digits = load_digits()

# 對資料進行PCA降維
pca = PCA(n_components=2)
X_pca = pca.fit_transform(digits.data)

# 繪製PCA後的資料
plt.figure(figsize=(8, 8))
colors = ["darkblue", "darkviolet", "darkturquoise", "black", "red", "pink",
          "darkseagreen", "cyan", "grey", "darkorange"]
for color, i, target_name in zip(colors, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
                                digits.target_names):
    plt.scatter(X_pca[digits.target == i, 0], X_pca[digits.target == i, 1],
                color=color, alpha=0.8, label=target_name)
plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.title("PCA applied to Digits Dataset")

內容解密:

上述程式碼首先載入digits資料集,然後使用PCA將其降維到二維空間。接著,它使用Matplotlib繪製降維後的資料點,每個類別用不同的顏色表示。這樣可以直觀地觀察到不同類別之間的分離程度和分佈情況。

3. 線性判別分析(LDA)

LDA是一種有監督學習方法,旨在找到最佳的投影方向,使得不同類別的資料點在低維度空間中分離度最大。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

# 對資料進行LDA降維
lda = LDA(n_components=2)
X_lda = lda.fit_transform(digits.data, digits.target)

# 繪製LDA後的資料
plt.figure(figsize=(8, 8))
for color, i, target_name in zip(colors, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
                                digits.target_names):
    plt.scatter(X_lda[digits.target == i, 0], X_lda[digits.target == i, 1],
                alpha=0.8, color=color, label=target_name)
plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.title("LDA applied to Digits Dataset")

內容解密:

這段程式碼使用LDA對digits資料集進行降維,同樣將其對映到二維空間。繪製結果可以看到LDA如何強調類別之間的分離,使得不同類別的資料點更明顯地聚集在一起。

4. t-分佈隨機鄰域嵌入(t-SNE)

t-SNE是一種非線性降維技術,透過將高維度資料對映到低維度空間,並保留資料的區域性結構。

from sklearn.manifold import TSNE

# 對資料進行t-SNE降維
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(digits.data)

# 繪製t-SNE後的資料
plt.figure(figsize=(8, 8))
for color, i, target_name in zip(colors, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
                                digits.target_names):
    plt.scatter(X_tsne[digits.target == i, 0], X_tsne[digits.target == i, 1],
                alpha=0.8, color=color, label=target_name)
plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.title("t-SNE applied to Digits Dataset")

內容解密:

t-SNE的程式碼展示瞭如何使用這種非線性降維方法來分析digits資料集。透過t-SNE,高維度資料被對映到二維空間,而保留了其區域性結構和鄰近關係,使得觀察和理解高維度資料變得更加容易。

主題:特徵工程技術在機器學習中的應用

在機器學習中,特徵工程是一個至關重要的步驟,它涉及選擇和轉換原始資料,以便更好地代表所要學習的模式。這個過程可以大大提高模型的效能和泛化能力。在本文中,我們將探討兩種常見的特徵工程技術:主成分分析(PCA)和t-SNE。

主成分分析(PCA)

主成分分析是一種廣泛使用的降維技術,它透過將高維資料投影到低維空間中來保留資料的最大變異性。這種方法可以幫助我們去除冗餘的特徵,減少資料的維度,並提高模型的訓練效率。

例如,下面的Python程式碼展示瞭如何使用PCA對digits資料集進行降維:

from sklearn.decomposition import PCA
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

# 載入digits資料集
digits = load_digits()

# 建立PCA物件
pca = PCA(n_components=2)

# 對資料進行降維
digits_pca = pca.fit_transform(digits.data)

# 繪製降維後的資料
plt.scatter(digits_pca[:, 0], digits_pca[:, 1], c=digits.target)
plt.show()

這段程式碼首先載入digits資料集,然後建立一個PCA物件,指定降維到的維度為2。接著,它對資料進行降維,並繪製降維後的資料。

t-SNE

t-SNE(t-distributed Stochastic Neighbor Embedding)是一種非線性降維技術,它透過將高維資料對映到低維空間中來保留資料的區域性結構。這種方法可以幫助我們發現資料中的非線性關係,並且可以用於視覺化高維資料。

例如,下面的Python程式碼展示瞭如何使用t-SNE對digits資料集進行降維:

from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

# 載入digits資料集
digits = load_digits()

# 建立t-SNE物件
tsne = TSNE(n_components=2)

# 對資料進行降維
digits_tsne = tsne.fit_transform(digits.data)

# 繪製降維後的資料
plt.scatter(digits_tsne[:, 0], digits_tsne[:, 1], c=digits.target)
plt.show()

這段程式碼首先載入digits資料集,然後建立一個t-SNE物件,指定降維到的維度為2。接著,它對資料進行降維,並繪製降維後的資料。

內容解密:

  • 在上述程式碼中,我們使用了PCA和t-SNE兩種不同的降維技術。PCA是一種線性降維技術,它透過將高維資料投影到低維空間中來保留資料的最大變異性。t-SNE是一種非線性降維技術,它透過將高維資料對映到低維空間中來保留資料的區域性結構。
  • 在PCA的程式碼中,我們首先載入digits資料集,然後建立一個PCA物件,指定降維到的維度為2。接著,我們對資料進行降維,並繪製降維後的資料。
  • 在t-SNE的程式碼中,我們首先載入digits資料集,然後建立一個t-SNE物件,指定降維到的維度為2。接著,我們對資料進行降維,並繪製降維後的資料。
  • 這兩種降維技術都可以用於視覺化高維資料,並且可以幫助我們發現資料中的模式和關係。

圖表翻譯:

下圖展示了使用PCA和t-SNE對digits資料集進行降維後的結果:

  flowchart TD
    A[原始資料] --> B[PCA]
    B --> C[降維後的資料]
    A --> D[t-SNE]
    D --> E[降維後的資料]

在這個圖表中,我們可以看到原始資料被投影到低維空間中,保留了最大變異性和區域性結構。這個圖表可以幫助我們理解PCA和t-SNE兩種不同的降維技術,並且可以用於視覺化高維資料。

圖表翻譯:

下圖展示了使用PCA和t-SNE對digits資料集進行降維後的結果:

  graph LR
    A[原始資料] -->|PCA|> B[降維後的資料]
    A -->|t-SNE|> C[降維後的資料]

在這個圖表中,我們可以看到原始資料被對映到低維空間中,保留了最大變異性和區域性結構。這個圖表可以幫助我們理解PCA和t-SNE兩種不同的降維技術,並且可以用於視覺化高維資料。

深度學習中的多種流形學習技術

在深度學習中,流形學習(Manifold Learning)是一種重要的技術,旨在將高維度的資料對映到低維度的空間中,以便於資料的視覺化和分析。除了前面提到的LDA(Linear Discriminant Analysis)和t-SNE(t-Distributed Stochastic Neighbor Embedding)演算法外,還有許多其他的流形學習技術。

2.5.1.6 更多流形學習技術

如果我們深入研究嵌入技術(Embedding Techniques),我們可以發現許多其他演算法和變體,例如截斷SVD(Truncated SVD)、Isomap、鄰域成分分析(Neighborhood Component Analysis)、譜嵌入(Spectral Embedding)、多維尺度法(Multidimensional Scaling)等。玄貓可以幫助我們探索這些方法。

2.5 特徵提取和選擇

在進行流形學習之前,需要對資料進行特徵提取和選擇。這一步驟的目的是從原始資料中提取出最有用的特徵,以便於後續的分析和模型建立。

實作流形學習

以下是使用Python和scikit-learn函式庫實作一些流形學習技術的示例:

from sklearn.decomposition import TruncatedSVD
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.ensemble import RandomTreesEmbedding
from sklearn.manifold import (
    Isomap,
    LocallyLinearEmbedding,
    MDS,
    SpectralEmbedding,
    TSNE,
)
from sklearn.neighbors import NeighborhoodComponentsAnalysis
from sklearn.pipeline import make_pipeline
from sklearn.random_projection import SparseRandomProjection

embeddings = {
    "隨機投影嵌入": SparseRandomProjection(n_components=2, random_state=42),
    #...
}

在這個示例中,我們定義了一個字典embeddings,其中包含了不同的流形學習技術的例項。每個例項都有自己的引數設定,例如n_componentsrandom_state

圖表翻譯

以下是使用Mermaid語法繪製的流形學習技術圖表:

  flowchart TD
    A[原始資料] --> B[特徵提取]
    B --> C[流形學習]
    C --> D[低維度嵌入]
    D --> E[資料視覺化]

這個圖表展示了從原始資料到低維度嵌入的整個流程。

內容解密

在上面的示例中,我們使用了不同的流形學習技術來將高維度的資料對映到低維度的空間中。每個技術都有其自己的優缺點和適用場景。例如,LDA適合於分類別問題,而t-SNE則適合於資料視覺化。透過選擇合適的流形學習技術,可以更好地理解和分析資料。

降維技術比較

在機器學習和資料分析中,降維是一種重要的技術,能夠幫助我們簡化高維度的資料,提高模型的效率和準確度。下面,我們將介紹幾種常見的降維技術,並比較其優缺點。

1. Truncated SVD 降維

Truncated SVD(Singular Value Decomposition)是一種根據奇異值分解的降維技術。它透過保留原始資料中最重要的特徵,將高維度的資料對映到低維度的空間中。Truncated SVD 的優點是計算效率高,能夠處理大規模的資料集。但是,它可能會失去一些重要的資訊,特別是在資料集具有多個重要特徵的情況下。

from sklearn.decomposition import TruncatedSVD

# 建立 Truncated SVD 物件
tsvd = TruncatedSVD(n_components=2)

# 執行降維
data_reduced = tsvd.fit_transform(data)

2. LDA 降維

LDA(Linear Discriminant Analysis)是一種根據線性判別分析的降維技術。它透過尋找最能區分不同類別的特徵,將高維度的資料對映到低維度的空間中。LDA 的優點是能夠保留類別之間的差異,但是它可能會受到資料分佈的影響。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 建立 LDA 物件
lda = LinearDiscriminantAnalysis(n_components=2)

# 執行降維
data_reduced = lda.fit_transform(data, target)

3. Isomap 降維

Isomap(Isometric Mapping)是一種根據等距對映的降維技術。它透過保留資料點之間的距離,將高維度的資料對映到低維度的空間中。Isomap 的優點是能夠保留資料的區域性結構,但是它可能會受到資料分佈的影響。

from sklearn.manifold import Isomap

# 建立 Isomap 物件
isomap = Isomap(n_neighbors=10, n_components=2)

# 執行降維
data_reduced = isomap.fit_transform(data)

4. LLE 降維

LLE(Locally Linear Embedding)是一種根據區域性線性嵌入的降維技術。它透過保留資料點之間的區域性關係,將高維度的資料對映到低維度的空間中。LLE 的優點是能夠保留資料的區域性結構,但是它可能會受到資料分佈的影響。

from sklearn.manifold import LocallyLinearEmbedding

# 建立 LLE 物件
lle = LocallyLinearEmbedding(n_neighbors=10, n_components=2)

# 執行降維
data_reduced = lle.fit_transform(data)

5. MDS 降維

MDS(Multidimensional Scaling)是一種根據多維度縮放的降維技術。它透過保留資料點之間的距離,將高維度的資料對映到低維度的空間中。MDS 的優點是能夠保留資料的全域性結構,但是它可能會受到資料分佈的影響。

from sklearn.manifold import MDS

# 建立 MDS 物件
mds = MDS(n_components=2, n_init=1, max_iter=120, n_jobs=2)

# 執行降維
data_reduced = mds.fit_transform(data)

6. Random Trees 降維

Random Trees 是一種根據隨機樹的降維技術。它透過隨機選擇特徵,將高維度的資料對映到低維度的空間中。Random Trees 的優點是計算效率高,能夠處理大規模的資料集。但是,它可能會失去一些重要的資訊,特別是在資料集具有多個重要特徵的情況下。

from sklearn.ensemble import RandomForestClassifier
from sklearn.decomposition import TruncatedSVD

# 建立 Random Trees 物件
rf = RandomForestClassifier(n_estimators=200, max_depth=5, random_state=0)

# 建立 Truncated SVD 物件
tsvd = TruncatedSVD(n_components=2)

# 執行降維
data_reduced = tsvd.fit_transform(rf.fit_transform(data))

7. Spectral 降維

Spectral 是一種根據譜分析的降維技術。它透過保留資料點之間的距離,將高維度的資料對映到低維度的空間中。Spectral 的優點是能夠保留資料的全域性結構,但是它可能會受到資料分佈的影響。

from sklearn.manifold import SpectralEmbedding

# 建立 Spectral 物件
spectral = SpectralEmbedding(n_components=2, random_state=0, eigen_solver="arpack")

# 執行降維
data_reduced = spectral.fit_transform(data)

比較

每種降維技術都有其優缺點,選擇哪種技術取決於具體的應用場景和資料特徵。Truncated SVD 和 Random Trees 進行快速降維,但可能會失去一些重要資訊。LDA 和 MDS 能夠保留類別之間的差異和全域性結構,但可能會受到資料分佈的影響。Isomap 和 LLE 能夠保留區域性結構,但可能會受到資料分佈的影響。Spectral 能夠保留全域性結構,但可能會受到資料分佈的影響。

最終,選擇哪種降維技術取決於具體的應用場景和資料特徵。需要根據實際情況進行嘗試和比較,以選擇最合適的降維技術。

隨著機器學習應用日益普及,降維技術的重要性也越發凸顯。本文深入探討了多種降維技術,包含線性方法 PCA、LDA,以及非線性方法 t-SNE、LLE 等,並以 iris 和 digits 資料集為例,展示了這些技術在資料視覺化和特徵工程中的應用。分析比較了各個技術的優缺點,例如 PCA 計算效率高但可能遺失非線性資訊,t-SNE 能保留區域性結構卻計算成本較高,LDA 則更適用於分類別問題。技術限制深析顯示,非線性降維技術的計算複雜度仍然是一大挑戰,引數調整也需要根據具體資料集進行微調。展望未來,隨著演算法的最佳化和硬體算力的提升,預計非線性降維技術將在高維資料分析中扮演更關鍵的角色。玄貓認為,對於不同型別的資料和任務,選擇合適的降維技術至關重要,開發者應根據實際需求進行權衡和選擇,才能最大程度地發揮降維技術的價值。