Python 蛇形聚类的聚类算法

Python 蛇形聚类的聚类算法,python,cluster-analysis,dbscan,optics-algorithm,Python,Cluster Analysis,Dbscan,Optics Algorithm,我正在寻找一个好的算法来识别数据集群,这些集群往往是线性的,有点像蛇一样的集群。我尝试过许多标准的聚类算法,如DBSCAN、OPTICS、HDBSCAN和RobustSingleLink,但它们看起来都像下图,在snake聚类和常规聚类之间变得混乱。有人知道一个好的聚类算法来解决这个问题吗 Anony Mouse的回答很有帮助。我将添加一些细节来说明我是如何应用它的。我使用了DBSCAN,调整了X轴的比例和DBSCAN eps值,直到它开始拾取更多的水平簇。这很有效,离我的目标足够近了 sca

我正在寻找一个好的算法来识别数据集群,这些集群往往是线性的,有点像蛇一样的集群。我尝试过许多标准的聚类算法,如DBSCAN、OPTICS、HDBSCAN和RobustSingleLink,但它们看起来都像下图,在snake聚类和常规聚类之间变得混乱。有人知道一个好的聚类算法来解决这个问题吗

Anony Mouse的回答很有帮助。我将添加一些细节来说明我是如何应用它的。我使用了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])

您也可以尝试或选择其他型号。另外,我现在还不想放弃DBSCAN,也许你只需要多使用一些参数。

你也可以尝试使用或模型。另外,我现在还不想放弃DBSCAN,也许你只需要多使用一些参数。

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

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

  • 您的x轴似乎是一个序列号
  • y轴似乎是一个测量值
  • (x,y)上的欧几里德距离没有多大意义,是吗

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

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

  • 它们在x轴上最多相差
    dx=100
  • 它们在y轴上最多相差
    dy=10
  • 至少有10分

  • 由于您似乎正在使用python(我不知道它的任何实现),您将不得不“黑客”DBSCAN来模拟这种行为。尝试以下操作:按dx/dy缩放y轴(此处:10)。然后尝试使用半径为eps=dx、最小采样数为10和曼哈顿公制的DBSCAN。因为sklearn也没有最大范数,所以您也可以旋转45度,并使用更大的半径来更接近广义DBSCAN使用上述规则所给出的结果。但最重要的是调整这两个特征的权重(不要使用启发式规范化,而是根据问题选择可解释的值!)

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

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

  • 您的x轴似乎是一个序列号
  • y轴似乎是一个测量值
  • (x,y)上的欧几里德距离没有多大意义,是吗

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

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

  • 它们在x轴上最多相差
    dx=100
  • 它们在y轴上最多相差
    dy=10
  • 至少有10分
  • 由于您似乎正在使用python(我不知道它的任何实现),您将不得不“黑客”DBSCAN来模拟这种行为。尝试以下操作:按dx/dy缩放y轴(此处:10)。然后尝试使用半径为eps=dx、最小采样数为10和曼哈顿公制的DBSCAN。因为sklearn也没有最大范数,所以您也可以旋转45度,并使用更大的半径来更接近广义DBSCAN使用上述规则所给出的结果。但最重要的是调整两个特征的权重(不要使用启发式规范化,而是更喜欢基于问题的可解释值!)