蛇类簇的聚类算法
Clustering algorithm for snake like clusters
我正在寻找一种好的算法来识别数据集群,其中的集群往往是线性的,有点像蛇形集群。我已经尝试了一些标准的聚类算法,如 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])
您也可以尝试 Spectral Clustering or Gaussian Mixture 个模型。另外,我现在还不会放弃 DBSCAN,也许你只需要多玩玩参数。
不要试图通过反复试验来解决这个问题。
了解你的问题,了解你的数据,然后选择算法。
- 您的 x 轴似乎是一个序列号
- 您的 y 轴似乎是一个测量值
(x,y) 上的欧氏距离没有多大意义,是吗?
相反,您需要设置一些阈值。事实上,DBSCAN 的一种变体,称为广义 DBSCAN,对此类数据最有意义。
如果满足以下条件,您希望点位于一个簇中:
- 它们在 x 轴上最多相差
dx=100
- 它们在 y 轴上最多相差
dy=10
- 那里至少有10分
由于您似乎正在使用 python,为此我不知道 GeneralizedDBSCAN 的任何实现,您将不得不 "hack" DBSCAN 来模拟此行为。尝试以下操作:将 y 轴缩放 dx/dy(此处:10)。然后尝试使用半径 eps=dx
、min_samples=10
和曼哈顿度量 metric="l1"
的 DBSCAN。由于 sklearn 也没有最大范数,您也可以旋转 45 度并使用更大的半径来更接近广义 DBSCAN 根据上述规则给出的结果。但最重要的是调整两个特征的权重(做不使用启发式归一化,而是更喜欢基于问题的可解释值!)
我正在寻找一种好的算法来识别数据集群,其中的集群往往是线性的,有点像蛇形集群。我已经尝试了一些标准的聚类算法,如 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])
您也可以尝试 Spectral Clustering or Gaussian Mixture 个模型。另外,我现在还不会放弃 DBSCAN,也许你只需要多玩玩参数。
不要试图通过反复试验来解决这个问题。
了解你的问题,了解你的数据,然后选择算法。
- 您的 x 轴似乎是一个序列号
- 您的 y 轴似乎是一个测量值
(x,y) 上的欧氏距离没有多大意义,是吗?
相反,您需要设置一些阈值。事实上,DBSCAN 的一种变体,称为广义 DBSCAN,对此类数据最有意义。
如果满足以下条件,您希望点位于一个簇中:
- 它们在 x 轴上最多相差
dx=100
- 它们在 y 轴上最多相差
dy=10
- 那里至少有10分
由于您似乎正在使用 python,为此我不知道 GeneralizedDBSCAN 的任何实现,您将不得不 "hack" DBSCAN 来模拟此行为。尝试以下操作:将 y 轴缩放 dx/dy(此处:10)。然后尝试使用半径 eps=dx
、min_samples=10
和曼哈顿度量 metric="l1"
的 DBSCAN。由于 sklearn 也没有最大范数,您也可以旋转 45 度并使用更大的半径来更接近广义 DBSCAN 根据上述规则给出的结果。但最重要的是调整两个特征的权重(做不使用启发式归一化,而是更喜欢基于问题的可解释值!)