LIBSVM 是一個廣泛使用的 SVM 函式庫,它支援多種核函數,包括 'linear'、'polynomial'、'rbf'、'sigmoid' 等。您可以在 LIBSVM 的文檔中查找核函數的詳細資訊。
XGBoost 是一個廣泛使用的梯度提升機函式庫,支援自定義的目標函數和核函數。您可以通過自定義函數的方式來實現 'triangular'、'gaussian' 和 'exponential' 核函數。
PyTorch 是一個用於構建深度學習模型的框架,它提供了靈活的自定義函數的方式。您可以使用 PyTorch 自定義核函數來實現 'triangular'、'gaussian' 和 'exponential' 核函數。
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
from sklearn import svm
from sklearn import metrics
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
X = iris.data
Y = iris.target
# 拆分成訓練集與測試集
X_train, X_test, Y_train, Y_test = train_test_split(
X, Y, test_size=0.3, random_state=0)
# 創建模型
model_svm = svm.SVC(kernel='rbf', C=1, gamma='auto')
# 訓練模型
model_svm.fit(X_train, Y_train)
# 預測
pred_svm = model_svm.predict(X_test)
# 衡量準確率
accuracy = metrics.accuracy_score(pred_svm, Y_test)
print("rbf")
print("徑向基函數(Radial Basis Function, RBF Kernel")
# K(x, y) = exp(-gamma * ||x - y||^2)
print(model_svm.predict(X_test)) # 印出測試的預測結果
print(Y_test) # 印出測試答案
print(accuracy) # 印出預測準度
# print(model_svm.score(X_test,Y_test))
# ------------------------------------------------------------------
# 創建模型
model_svm = svm.SVC(kernel='linear', C=1, gamma='auto')
# 訓練模型
model_svm.fit(X_train, Y_train)
# 預測
pred_svm = model_svm.predict(X_test)
# 衡量準確率
accuracy = metrics.accuracy_score(pred_svm, Y_test)
print(accuracy) # 輸出準確率
print("linear")
print("線性核函數(Linear Kernel)")
# K(x, y) = exp(-gamma * ||x - y||^2)
print(model_svm.predict(X_test)) # 印出測試的預測結果
print(Y_test) # 印出測試答案
print(accuracy) # 印出預測準度
# ------------------------------------------------------------------
# 創建模型
model_svm = svm.SVC(kernel='poly', C=1, gamma='auto')
# 訓練模型
model_svm.fit(X_train, Y_train)
# 預測
pred_svm = model_svm.predict(X_test)
# 衡量準確率
accuracy = metrics.accuracy_score(pred_svm, Y_test)
print("poly")
print("多項式核函數(Polynomial Kernel)")
# K(x, y) = exp(-gamma * ||x - y||^2)
print(model_svm.predict(X_test)) # 印出測試的預測結果
print(Y_test) # 印出測試答案
print(accuracy) # 印出預測準度
# ------------------------------------------------------------------
# 定義一個函數以繪製決策邊界
def plot_decision_boundary(X, y, model, title):
h = .02 # 網格的步長
# 創建色彩地圖
cmap_light = plt.cm.viridis
cmap_bold = plt.cm.viridis
# 繪製決策邊界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
# X 在第一個特徵上的最小值和最大值,然後分別減去1和加上1。
# 確保繪圖的邊界超出了數據點的範圍,以免數據點靠近圖的邊緣
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
# 將 xx 和 yy 中的二維網格轉換為一維
# np.c_將這些一維數組組合
Z = Z.reshape(xx.shape)
# Z 重新塑造成與 xx 相同形狀的二維
# 準備繪製決策邊界
plt.figure()
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
# 同時繪製訓練點
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold, edgecolor='k', s=20)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title(title)
# 使用PCA將數據降維至2D以進行視覺化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 為每個核函數繪製決策邊界
kernels = ['rbf', 'linear', 'poly']
for kernel in kernels:
model_svm = svm.SVC(kernel=kernel, C=1, gamma='auto')
model_svm.fit(X_pca, Y)
plot_decision_boundary(X_pca, Y, model_svm, f'SVM with {kernel} kernel')
plt.show()
#------------------------------------------------------------------
rbf
徑向基函數(Radial Basis Function, RBF Kernel
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
2 1 1 2 0 2 0 0]
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
1 1 1 2 0 2 0 0]
0.9777777777777777
0.9777777777777777
linear
線性核函數(Linear Kernel)
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
2 1 1 2 0 2 0 0]
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
1 1 1 2 0 2 0 0]
0.9777777777777777
poly
多項式核函數(Polynomial Kernel)
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 1 0 0 1 1 0 2 1 0 2 2 1 0
2 1 1 2 0 2 0 0]
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
1 1 1 2 0 2 0 0]
0.9555555555555556