Python: Как найти значение, которое разделяет 2 разных кластера?

#python #python-3.x #matplotlib #svm #scatter-plot

#python #python-3.x #matplotlib #svm #точечный график

Вопрос:

Я применяю алгоритм обучения без учителя для построения обнаружения аномалий с использованием метода 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

Комментарии:

1. Привет, @Justice_Lords. Не совсем. Это просто дает нам параметры. Я хочу знать, при каком значении оси y оба кластера разделяются

2. Хорошо, я искал об этом, проблема в том, что существует документация для построения гиперплоскости линейных ядер и нелинейных ядер для контролируемых подходов. Здесь мы имеем дело с неконтролируемыми подходами. Для одного класса SVM есть функция decision_function() , она дает расстояние (не абсолютное, поскольку мы используем нелинейное) от гиперплоскости. Используя это расстояние, возможно, вы можете попытаться узнать, где находится гиперплоскость.

Ответ №1:

Предложение @Justice_lords было тем, что я искал. Decision_function() у меня сработало.