Python: 如何找到分离两个不同聚类的值?

3

我正在应用无监督学习算法,使用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

嘿,@Justice_Lords。不完全是这样。它只给我们提供了参数。我想知道的是,在哪个y轴值处,两个聚类被分开。 - some_programmer
1
好的,我一直在搜索这个问题,问题在于文档存在于监督方法的线性核和非线性核的超平面绘制方面。而我们正在处理无监督方法。对于One class SVM,有一个名为decision_function()的函数,它给出了距离(不是绝对距离,因为我们使用的是非线性距离)从超平面开始的距离。通过使用该距离,您可以尝试确定超平面的位置。 - Justice_Lords
1个回答

0

@Justice_lords 的建议正是我所需要的。Decision_function() 对我很有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接