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 个不同集群的值?的主要内容,如果未能解决你的问题,请参考以下文章