#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
Комментарии:
1. Привет, @Justice_Lords. Не совсем. Это просто дает нам параметры. Я хочу знать, при каком значении оси y оба кластера разделяются
2. Хорошо, я искал об этом, проблема в том, что существует документация для построения гиперплоскости линейных ядер и нелинейных ядер для контролируемых подходов. Здесь мы имеем дело с неконтролируемыми подходами. Для одного класса SVM есть функция
decision_function()
, она дает расстояние (не абсолютное, поскольку мы используем нелинейное) от гиперплоскости. Используя это расстояние, возможно, вы можете попытаться узнать, где находится гиперплоскость.
Ответ №1:
Предложение @Justice_lords было тем, что я искал. Decision_function()
у меня сработало.