Python:如何找到分隔 2 个不同集群的值?

Posted

技术标签:

【中文标题】Python:如何找到分隔 2 个不同集群的值?【英文标题】:Python: How to find the value that separates 2 different clusters? 【发布时间】:2019-08-19 07:58:21 【问题描述】:

我正在应用一种无监督学习算法来使用 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 轴值

【问题讨论】:

嘿,@Justice_Lords。不完全是。它只是给了我们参数。我想知道在 y 轴的哪个值处,两个集群都会分开 好的,我一直在搜索这个问题,问题是存在用于绘制线性核超平面和非线性核用于监督方法的文档。在这里,我们正在处理无监督的方法。一类支持向量机有函数decision_function(),它给出了与超平面的距离(不是绝对的,因为我们使用非线性)。使用这个距离也许你可以尝试知道超平面的位置。 【参考方案1】:

@Justice_lords 的建议正是我想要的。 Decision_function() 为我工作。

【讨论】:

以上是关于Python:如何找到分隔 2 个不同集群的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Linux中对齐包含不同分隔符的文本文件的不同部分? [关闭]

如何在逗号分隔的字符串行中找到不同的元素?

如何在python中找到高于第二个标准差的值的百分比?

Cassandra 多个连接保存,不工作 [Python]

SQLite如何从分隔列文本中对另一个表中的值求和?

汇编程序如何处理在 2 个寄存器上分隔的值(例如 EDX:EAX)?