0

我正在寻找一种好的算法来识别数据集群,其中集群往往是线性的,有点像蛇一样的集群。我尝试了一些标准的聚类算法,如 DBSCAN、OPTICS、HDBSCAN 和 RobustSingleLinkage,但它们看起来都像下图一样,在蛇形簇和常规簇之间混淆了。有谁知道一个好的聚类算法来解决这个问题?

在此处输入图像描述

Anony-Mousse 的回答很有帮助。我将添加一些细节来展示我是如何应用它的。我使用了 DBSCAN,调整了 X 轴的比例和 DBSCAN eps 值,直到它开始拾取更多的水平簇。这非常有效,足以满足我的目的。

scan = cluster.DBSCAN(eps=20, min_samples=10, metric="l1", n_jobs=-1)
X_val[:, 0] = X_val[:, 0]/20000
scan.fit(X_val)
y_pred = scan.labels_.astype(np.int) + 1
# y_pred = np.where(y_pred > 0, 1, 0)
plt.scatter(X.iloc[:, 0]/20000, X.iloc[:, 1], color=colors[y_pred])

在此处输入图像描述

4

2 回答 2

2

不要试图通过反复试验来解决这个问题。

了解您的问题,了解您的数据,然后选择算法。

  1. 您的 x 轴似乎是一个序列号
  2. 您的 y 轴似乎是一个测量值

(x,y) 上的欧几里得距离没有多大意义,是吗?

相反,您需要设置一些阈值。事实上,DBSCAN 的一种变体,称为广义 DBSCAN,对此类数据最有意义。

在以下情况下,您希望点位于集群中:

  1. 它们在 x 轴上最多相差dx=100
  2. 它们在 y 轴上最多相差dy=10
  3. 那里至少有10个点

由于您似乎正在使用 python,对此我不知道 GeneralizedDBSCAN 的任何实现,您将不得不“破解” DBSCAN 来模拟这种行为。尝试以下操作:按 dx/dy 缩放 y 轴(此处:10)。然后尝试使用 radiuseps=dxmin_samples=10Manhattan metric的 DBSCAN metric="l1"。由于 sklearn 也没有最大范数,您也可以旋转 45 度并使用更大的半径来更接近 Generalized DBSCAN 在上述规则下给出的结果。但最重要的是调整两个特征的权重(不要使用启发式归一化,而是根据问题更喜欢可解释的值!)

于 2019-10-02T16:46:23.453 回答
0

您还可以尝试光谱聚类高斯混合模型。另外,我现在还不会放弃 DBSCAN,也许你只需要更多地使用参数。

于 2019-10-02T15:49:17.217 回答