我正在应用无监督学习算法,使用OneClass SVM方法来构建异常检测,并绘制图表以可视化它的外观。
我得到了2个集群:一个红色的和另一个蓝色的。红色集群对应于1(不是异常),而蓝色集群的值为-1(异常)。
我想要的是得到两个集群分离的确切值。
我的代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import preprocessing
data = pd.read_excel('gpmd.xlsx', header = 0)
X = data.loc[:, ['ContextID','BacksGas_Flow_sccm']]
min_max_scaler = preprocessing.MinMaxScaler()
X_minmax = min_max_scaler.fit_transform(X.values[:,[1]])
from sklearn.svm import OneClassSVM
ocsvm = OneClassSVM(nu = 0.05, kernel = 'rbf', gamma = 'scale')
y_ocsvm1 = ocsvm.fit_predict(X_minmax[:,[0]])
plt.scatter(X.values[y_ocsvm1 == 1, 0], X_minmax[y_ocsvm1 == 1, 0], c = 'red', label = 'cluster1')
plt.scatter(X.values[y_ocsvm1 == -1, 0], X_minmax[y_ocsvm1 == -1, 0], c = 'blue', label = 'cluster2')
plt.ticklabel_format(useOffset=False)
plt.yticks(np.arange(min(X_minmax[:,[0]]), max(X_minmax[:,[0]]), 0.03))
plt.legend()
plt.show()
我运行此代码后得到的图形如下: 仅从图片中我们可以大致地说,红色聚类与蓝色聚类在0.72和0.75之间的某个值处分开。我想知道是否有一种方法可以知道这两个聚类被分开的确切值。 编辑1 在下面的图片中,我们可以看到绿线(大致上)分离了两个聚类,我想找到这样一条线及其相应的y轴值。
![图片2](https://istack.dev59.com/DRJqU.webp)
decision_function()
的函数,它给出了距离(不是绝对距离,因为我们使用的是非线性距离)从超平面开始的距离。通过使用该距离,您可以尝试确定超平面的位置。 - Justice_Lords