One-Class SVM(Support Vector Machine)是一种无监督学习算法,用于异常检测和离群点检测。它的目标是通过仅使用正常数据来建模,识别出与正常模式不同的异常数据点。
One-Class SVM的工作原理如下:
One-Class SVM的关键在于如何选择合适的超平面,以使得正常数据被尽可能包围,而异常数据则被远离。这是通过优化一个目标函数来实现的,其中包括最小化超平面到最近正常数据点的距离和最大化超平面与正常数据之间的间隔。
在One-Class SVM中,还有两个重要的参数需要设置:
One-Class SVM的优点包括:
然而,One-Class SVM也有一些限制:
One-Class SVM广泛应用于异常检测、离群点检测、网络安全、图像处理等领域。它可以帮助识别潜在的异常情况,对于保护系统的安全和发现异常行为具有重要的作用。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
# 生成训练样本
rng = np.random.RandomState(42)
n_samples = 200
X = 0.3 * rng.randn(n_samples, 2)
X_train = np.r_[X + 2, X - 2]
# 训练OneClassSVM模型
clf = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.1)
clf.fit(X_train)
# 生成测试样本
X_test = np.r_[rng.uniform(low=-6, high=6, size=(50, 2))]
# 预测样本的异常情况
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
n_error_train = y_pred_train[y_pred_train == -1].size
n_error_test = y_pred_test[y_pred_test == -1].size
print(n_error_train) # 打印出训练集中异常值的个数为40 40/400=0.1 对应nu参数
print(n_error_test)
# 绘制训练样本和测试样本的散点图
plt.scatter(X_train[:, 0], X_train[:, 1], color='black', label='train_sample')
plt.scatter(X_test[:, 0], X_test[:, 1], color='red', label='test_sample')
# 绘制异常样本的边界
xmin, xmax = X_test[:, 0].min() - 1, X_test[:, 0].max() + 1
ymin, ymax = X_test[:, 1].min() - 1, X_test[:, 1].max() + 1
xx, yy = np.meshgrid(np.linspace(xmin, xmax, 500), np.linspace(ymin, ymax, 500))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='blue')
# 设置图形标题和图例
plt.title("OneClassSVM")
plt.legend()
plt.show()
该示例演示了如何使用OneClassSVM进行异常检测。首先,使用随机生成的数据生成训练样本X_train。然后,创建并训练OneClassSVM模型clf。接下来,生成测试样本X_test,并使用训练好的模型预测样本的异常情况。最后,通过绘制训练样本、测试样本和异常边界,展示了异常检测的结果。
请注意,示例中使用了rbf(径向基函数)作为核函数,nu=0.1表示异常点的比例约为10%。你可以根据具体问题和数据集调整这些参数来适应不同的场景。
One-Class SVM常见方法解释: