多層感知器 (Multi-Layer Perceptron, MLP) 是一種前饋神經網絡,並且是最基本的深度學習模型之一。MLP 由至少三層組成:一個 輸入層、一個或多個 隱藏層,以及一個 輸出層。MLP 能夠通過學習非線性決策邊界,解決複雜的分類與回歸問題。
輸入層 (Input Layer):直接接收特徵數據,與樣本的維度相同,每個節點代表一個特徵。
隱藏層 (Hidden Layer):MLP 至少有一個隱藏層,每個隱藏層中的神經元都通過加權求和和激活函數進行計算,從輸入層中提取特徵。隱藏層越多,模型就越能表達複雜的模式和非線性關係。
輸出層 (Output Layer):輸出層的神經元數取決於具體任務。如果是二元分類,輸出層有一個神經元;如果是多分類,則有對應的神經元數。輸出層中的激活函數通常是 softmax(用於多分類問題)或 sigmoid(用於二元分類問題)。
ReLU (Rectified Linear Unit):ReLU 是目前最常用的激活函數之一。
MLP 與單層感知器的區別
單層感知器 只能處理線性可分的數據,而 MLP 通過多層和非線性激活函數,可以學習和擬合非線性決策邊界。
MLP 的隱藏層越多,模型的表達能力越強,但也可能增加過擬合的風險。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
X, y = make_moons(n_samples=1000, noise=0.2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
mlp = MLPClassifier(hidden_layer_sizes=(10, 10), activation='relu', solver='adam', max_iter=2000)
mlp.fit(X_train, y_train)
y_pred = mlp.predict(X_test)
# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f"測試集準確率: {accuracy:.2f}")
# 混淆矩陣
conf_matrix = confusion_matrix(y_test, y_pred)
print("混淆矩陣:")
print(conf_matrix)
plt.figure(figsize=(10, 6))
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))
Z = mlp.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.8, cmap='coolwarm')
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap='coolwarm', edgecolor='k', s=50)
plt.title("MLP 的決策邊界")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
數據集:我們使用 make_moons 函數生成了一個非線性可分的二元分類數據集,這個數據集非常適合展示 MLP 的非線性分類能力。
模型訓練:我們使用 MLPClassifier 類來訓練一個含有兩個隱藏層的多層感知器模型,並將每個隱藏層設置為 10 個神經元。激活函數選擇 ReLU,優化算法使用 Adam。
預測與評估:模型在測試集上進行預測,並計算出準確率和混淆矩陣。結果顯示了模型的分類效果。
決策邊界:我們繪製了 MLP 模型的決策邊界,展示了模型如何學習到非線性邊界來區分兩個類別。
多層感知器 (MLP) 是一種強大的神經網絡模型,能夠處理非線性分類和回歸問題。通過隱藏層和非線性激活函數,MLP 可以學習複雜的決策邊界。這個範例展示了如何使用 Python 來構建和訓練 MLP 模型,並應用於非線性可分的分類問題。隨著網絡層數的增加和隱藏神經元的增多,MLP 能夠處理更加複雜的問題,並在不同的應用領域(如圖像識別、語音識別、自然語言處理)中廣泛使用。