返回文章列表

多維資料降維與視覺化技術

本文探討多維資料降維技術,包含主成分分析 (PCA)、多維尺度分析 (MDS) 以及區域性線性嵌入 (LLE) 等方法,並結合 Python 程式碼與視覺化圖表,深入解析這些技術如何有效地將高維資料轉換至低維空間,同時保留資料的重要特徵與結構。文章也探討了 MDS 在處理線性與非線性嵌入資料的侷限性,並提供使用

機器學習 資料視覺化

高維資料在機器學習和資料分析中很常見,但高維資料的處理和視覺化往往具有挑戰性。因此,降維技術在資料預處理和特徵工程中扮演著重要的角色。本文將介紹幾種常見的降維技術,包括主成分分析 (PCA)、多維尺度分析 (MDS) 以及區域性線性嵌入 (LLE),並探討它們的應用場景和侷限性。此外,我們還將使用 Python 程式碼和視覺化圖表來更直觀地理解這些技術的原理和效果。針對 MDS 無法有效處理非線性嵌入資料的缺點,我們將介紹如何使用 LLE 演算法來解決這個問題,並提供實際的程式碼範例。

段落標題:主成分分析簡介

主成分分析(Principal Component Analysis, PCA)是一種常用的降維技術,能夠將高維度的資料轉換為低維度的資料,而保留原始資料的主要特徵。PCA 的主要目的是找出資料中最重要的特徵,並將其轉換為新的座標系統。

內容解密:PCA 的工作原理

PCA 的工作原理是透過計算資料的協方差矩陣,然後對其進行特徵值分解,得到一組主成分。這些主成分代表了資料中最重要的特徵,並且彼此之間是正交的。透過選擇前 k 個主成分,可以將原始資料投影到低維度的空間中。

段落標題:流形學習簡介

流形學習(Manifold Learning)是一種非監督式學習方法,旨在將高維度的資料對映到低維度的空間中,而保留資料的內在結構。流形學習假設資料分佈在一個低維度的流形上,並且這個流形嵌入在高維度的空間中。

圖表翻譯:流形學習示意圖

段落標題:多維尺度分析

多維尺度分析(Multidimensional Scaling, MDS)是一種流形學習方法,旨在將高維度的資料對映到低維度的空間中,而保留資料之間的距離關係。MDS 的主要目的是找出一組最能夠代表原始資料距離關係的低維度座標。

內容解密:MDS 的工作原理

MDS 的工作原理是透過計算資料之間的距離矩陣,然後對其進行降維。MDS 有兩種主要方法:一種是根據距離的 MDS,另一種是根據相似性的 MDS。根據距離的 MDS 尋找一組最能夠代表原始距離關係的低維度座標,而根據相似性的 MDS 尋找一組最能夠代表原始相似性關係的低維度座標。

段落標題:區域性線性嵌入

區域性線性嵌入(Locally Linear Embedding, LLE)是一種流形學習方法,旨在將高維度的資料對映到低維度的空間中,而保留資料的區域性結構。LLE 的主要目的是找出一組最能夠代表原始資料區域性結構的低維度座標。

圖表翻譯:LLE 示意圖

自然語言處理與視覺化技術應用

在進行自然語言處理和視覺化技術應用時,常需要建立特定的圖形以呈現所需的資訊。以下是一個示例程式碼,展示如何使用Python的Matplotlib函式庫來生成一個包含特定文字的圖片,並將其儲存為PNG格式。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.image import imread

def generate_hello_image():
    # 建立一個新的圖形
    fig, ax = plt.subplots(figsize=(4, 1))
    fig.subplots_adjust(left=0, right=1, bottom=0, top=1)

    # 關閉軸線
    ax.axis('off')

    # 在圖形中新增文字
    ax.text(0.5, 0.4, 'HELLO', va='center', ha='center', weight='bold', size=85)

    # 儲存圖形為PNG格式
    fig.savefig('hello.png')
    plt.close(fig)

# 執行函式生成圖片
generate_hello_image()

# 讀取生成的PNG圖片
data = imread('hello.png')[::-1, :, 0].T

# 設定隨機種子
rseed = 42
rng = np.random.RandomState(rseed)

# 生成隨機點
N = 1000
X = rng.rand(4 * N, 2)

# 對點進行遮罩處理
i, j = (X * data.shape).astype(int).T
mask = (data[i, j] < 1)
X = X[mask]

# 調整點的座標
X[:, 0] *= (data.shape[0] / data.shape[1])

# 篩選點數量
X = X[:N]

# 對點進行排序
X = X[np.argsort(X[:, 0])]

# 進行視覺化
plt.scatter(X[:, 0], X[:, 1])
plt.show()

圖表翻譯:

上述程式碼首先建立了一個包含“HELLO”文字的圖片,並將其儲存為PNG格式。接著,程式碼讀取了這個PNG圖片,並從中生成了一系列隨機點。這些點的位置是根據圖片中的畫素值來決定,從而形成了一個與原始文字相似的形狀。最後,程式碼對這些點進行了排序和視覺化,形成了一個散點圖。

內容解密:

  1. 圖片生成:程式碼使用Matplotlib函式庫來建立一個包含“HELLO”文字的圖片,並將其儲存為PNG格式。
  2. 隨機點生成:程式碼使用NumPy函式庫來生成一系列隨機點,點的位置是根據圖片中的畫素值來決定。
  3. 點的遮罩處理:程式碼對生成的點進行遮罩處理,以確保只有圖片中文字部分的點被選擇。
  4. 點的座標調整:程式碼調整了點的座標,以確保點的分佈與原始圖片中的文字相似。
  5. 視覺化:程式碼對篩選後的點進行了排序和視覺化,形成了一個散點圖。

多維尺度縮放(Multidimensional Scaling)

多維尺度縮放是一種用於分析高維度資料的技術,旨在將高維度空間中的點對映到低維度空間中,以便更容易地視覺化和理解資料的結構。在這個例子中,我們使用了一個特殊的資料集,它的形狀像單詞「HELLO」。這個資料集由 1000 個點組成,每個點都有一個 x 和 y 座標。

資料視覺化

首先,我們使用 matplotlib 將資料視覺化為二維散點圖。為了使圖片更有趣,我們使用了一個彩色對映來根據每個點的 x 座標對其進行著色。

import matplotlib.pyplot as plt
import numpy as np

# 生成資料
X = make_hello(1000)

# 設定彩色對映
colorize = dict(c=X[:, 0], cmap=plt.cm.get_cmap('rainbow', 5))

# 繪製散點圖
plt.scatter(X[:, 0], X[:, 1], **colorize)
plt.axis('equal')

旋轉和平移

接下來,我們定義了一個函式 rotate,用於旋轉資料。這個函式使用 NumPy 的 dot 函式將資料乘以一個旋轉矩陣。然後,我們使用這個函式將資料旋轉 20 度,並將結果視覺化。

def rotate(X, angle):
    theta = np.deg2rad(angle)
    R = np.array([[np.cos(theta), -np.sin(theta)],
                  [np.sin(theta), np.cos(theta)]])
    return np.dot(X, R)

X2 = rotate(X, 20) + 5

plt.scatter(X2[:, 0], X2[:, 1], **colorize)
plt.axis('equal')

距離矩陣

多維尺度縮放的核心思想是使用距離矩陣來表示資料的結構。距離矩陣是一個方陣,其中每個元素代表兩個點之間的距離。Scikit-Learn 的 pairwise_distances 函式提供了一種高效的方法來計算距離矩陣。

from sklearn.metrics import pairwise_distances

D = pairwise_distances(X)
print(D.shape)

視覺化距離矩陣

最後,我們使用 imshow 函式將距離矩陣視覺化為一張圖片。

plt.imshow(D, zorder=2, cmap='viridis', interpolation='nearest')

圖表翻譯:

此圖示為距離矩陣的視覺化,顯示了每對點之間的距離。距離矩陣是一個重要的工具,用於分析高維度資料的結構。透過視覺化距離矩陣,我們可以更容易地理解資料的分佈和關係。

多維尺度分析法(MDS)簡介

多維尺度分析法(Multidimensional Scaling, MDS)是一種資料分析技術,旨在根據資料之間的距離矩陣還原出資料的座標表示。這種方法可以用於高維資料的降維和視覺化。

MDS 的工作原理

MDS 的基本思想是給定一個距離矩陣,然後還原出一個低維的座標表示,使得原始距離矩陣與還原出的座標表示之間的差異最小。這樣可以保留資料之間的相對位置和距離關係。

使用 MDS 進行資料視覺化

在上面的例子中,我們使用 MDS 將二維資料投影到二維平面上。結果如圖 46-4 所示,MDS 還原出了原始資料的座標表示。

from sklearn.manifold import MDS
import numpy as np
import matplotlib.pyplot as plt

# 定義距離矩陣
D = np.array([[0, 1, 2], [1, 0, 3], [2, 3, 0]])

# 建立 MDS 模型
model = MDS(n_components=2, dissimilarity='precomputed', random_state=1701)

# 執行 MDS
out = model.fit_transform(D)

# 繪製結果
plt.scatter(out[:, 0], out[:, 1])
plt.axis('equal')
plt.show()

MDS 在高維資料上的應用

MDS 不僅可以用於二維資料,也可以用於高維資料。例如,我們可以將三維資料投影到二維平面上,以便視覺化。

def random_projection(X, dimension=3, rseed=42):
    assert dimension >= X.shape[1]
    rng = np.random.RandomState(rseed)
    C = rng.randn(dimension, dimension)
    e, V = np.linalg.eigh(np.dot(C, C.T))
    return np.dot(X, V[:X.shape[1]])

X3 = random_projection(np.array([[1, 2], [3, 4], [5, 6]]), 3)
print(X3.shape)

多維資料降維技術:從線性到非線性嵌入

在探索高維資料時,降維技術是一種強大的工具,能夠幫助我們理解和視覺化複雜的資料結構。其中,多維尺度分析(MDS)是一種常用的線性降維方法,它透過計算資料點之間的距離矩陣,然後將其對映到一個低維空間中,以保留原始資料的相似性。

線性嵌入:MDS 的應用

首先,我們來看一個簡單的例子。假設我們有一組三維資料,想要將其降維到二維空間中。使用 MDS,我們可以計算出原始三維資料的距離矩陣,然後找到最佳的二維嵌入,以保留原始資料的相似性。

import numpy as np
from sklearn.manifold import MDS
import matplotlib.pyplot as plt

# 生成三維資料
np.random.seed(0)
X3 = np.random.rand(1000, 3)

# 使用 MDS 對三維資料進行降維
model = MDS(n_components=2, random_state=1701)
out3 = model.fit_transform(X3)

# 繪製原始三維資料和降維後的二維資料
fig = plt.figure(figsize=(12, 6))

ax1 = fig.add_subplot(121, projection='3d')
ax1.scatter3D(X3[:, 0], X3[:, 1], X3[:, 2])

ax2 = fig.add_subplot(122)
ax2.scatter(out3[:, 0], out3[:, 1])
ax2.axis('equal')

plt.show()

非線性嵌入:MDS 的侷限性

然而,MDS 只能處理線性嵌入,如果資料的嵌入是非線性的,MDS 就會失敗。為了演示這一點,我們可以生成一組非線性嵌入的三維資料。

def make_hello_s_curve(X):
    t = (X[:, 0] - 2) * 0.75 * np.pi
    x = np.sin(t)
    y = X[:, 1]
    z = X[:, 2]
    return np.vstack((x, y, z)).T

XS = make_hello_s_curve(X3)

# 繪製非線性嵌入的三維資料
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(XS[:, 0], XS[:, 1], XS[:, 2])
plt.show()

如果我們嘗試使用 MDS 對這組非線性嵌入的資料進行降維,結果將會失敗,因為 MDS 無法捕捉到非線性嵌入的複雜結構。

# 使用 MDS 對非線性嵌入的資料進行降維
model = MDS(n_components=2, random_state=1701)
outXS = model.fit_transform(XS)

# 繪製降維後的二維資料
plt.scatter(outXS[:, 0], outXS[:, 1])
plt.axis('equal')
plt.show()

這個例子表明,MDS 只能處理線性嵌入,如果資料的嵌入是非線性的,需要使用其他非線性降維方法,如 t-SNE 或 Isomap 等。

非線性流形:區域性線性嵌入

當我們面臨非線性流形的嵌入問題時,傳統的多維尺度法(MDS)可能無法有效地還原底層結構。這是因為MDS嘗試保留遠距離點之間的距離,而這在非線性流形中往往是不可能的。為瞭解決這個問題,我們可以使用區域性線性嵌入(LLE)演算法。

LLE的基本思想

LLE的基本思想是隻保留鄰近點之間的距離,而不是嘗試保留所有點之間的距離。這樣可以使得嵌入更接近於原始流形的底層結構。具體來說,LLE演算法會計算每個點與其鄰近點之間的距離,並嘗試保留這些距離。

LLE的優點

LLE演算法有幾個優點:

  • 它可以有效地還原非線性流形的底層結構。
  • 它不需要明確地定義流形的維度。
  • 它可以處理高維度資料。

LLE的實作

在Python中,我們可以使用scikit-learn函式庫中的LocallyLinearEmbedding類別來實作LLE演算法。以下是範例程式碼:

from sklearn.manifold import LocallyLinearEmbedding
import matplotlib.pyplot as plt

# 載入資料
XS =...

# 建立LLE模型
model = LocallyLinearEmbedding(n_neighbors=100, n_components=2, method='modified', eigen_solver='dense')

# 執行LLE演算法
out = model.fit_transform(XS)

# 繪製結果
fig, ax = plt.subplots()
ax.scatter(out[:, 0], out[:, 1])
ax.set_ylim(0.15, -0.15)
plt.show()

結果分析

LLE演算法可以有效地還原非線性流形的底層結構。然而,結果可能仍然有些扭曲,但它可以捕捉到資料中的基本關係。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 多維資料降維與視覺化技術

package "資料視覺化流程" {
    package "資料準備" {
        component [資料載入] as load
        component [資料清洗] as clean
        component [資料轉換] as transform
    }

    package "圖表類型" {
        component [折線圖 Line] as line
        component [長條圖 Bar] as bar
        component [散佈圖 Scatter] as scatter
        component [熱力圖 Heatmap] as heatmap
    }

    package "美化輸出" {
        component [樣式設定] as style
        component [標籤註解] as label
        component [匯出儲存] as export
    }
}

load --> clean --> transform
transform --> line
transform --> bar
transform --> scatter
transform --> heatmap
line --> style --> export
bar --> label --> export

note right of scatter
  探索變數關係
  發現異常值
end note

@enduml

在這個圖表中,我們可以看到原始資料被輸入到LLE演算法中,然後產生嵌入結果。最後,我們對結果進行分析,以瞭解其底層結構。

從技術架構視角來看,本文介紹了多種降維技術,包含主成分分析(PCA)、流形學習(Manifold Learning)以及多維尺度分析(MDS)等,並深入探討了局部線性嵌入(LLE)的應用。藉由比較分析,我們可以發現,線性降維技術如 PCA 和 MDS 適用於線性結構的資料,而對於非線性結構的資料,流形學習方法如 LLE 則更具優勢。技術限制深析顯示,MDS 在處理非線性嵌入的資料時會失效,而 LLE 則能有效捕捉資料的區域性結構,更精確地還原資料的低維表示。然而,LLE 的引數選擇,例如鄰近點數量,會顯著影響結果,需要仔細調整。展望未來,隨著深度學習的發展,根據深度學習的降維技術,例如自動編碼器,將會扮演更重要的角色,能更有效地處理高維和複雜結構的資料。對於需要處理非線性嵌入資料的應用,玄貓建議優先考慮 LLE 等流形學習方法,並仔細調整引數以獲得最佳效果。隨著技術的演進,我們預見根據深度學習的降維技術將會帶來更多突破,值得持續關注。