python - 蛇状簇的聚类算法
问题描述
我正在寻找一种好的算法来识别数据集群,其中集群往往是线性的,有点像蛇一样的集群。我尝试了一些标准的聚类算法,如 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])
解决方案
不要试图通过反复试验来解决这个问题。
了解您的问题,了解您的数据,然后选择算法。
- 您的 x 轴似乎是一个序列号
- 您的 y 轴似乎是一个测量值
(x,y) 上的欧几里得距离没有多大意义,是吗?
相反,您需要设置一些阈值。事实上,DBSCAN 的一种变体,称为广义 DBSCAN,对此类数据最有意义。
在以下情况下,您希望点位于集群中:
- 它们在 x 轴上最多相差
dx=100
- 它们在 y 轴上最多相差
dy=10
- 那里至少有10个点
由于您似乎正在使用 python,对此我不知道 GeneralizedDBSCAN 的任何实现,您将不得不“破解” DBSCAN 来模拟这种行为。尝试以下操作:按 dx/dy 缩放 y 轴(此处:10)。然后尝试使用 radiuseps=dx
和min_samples=10
Manhattan metric的 DBSCAN metric="l1"
。由于 sklearn 也没有最大范数,您也可以旋转 45 度并使用更大的半径来更接近 Generalized DBSCAN 在上述规则下给出的结果。但最重要的是调整两个特征的权重(不要使用启发式归一化,而是根据问题更喜欢可解释的值!)
推荐阅读
- node.js - 节点 12.14.1 端口问题。关闭服务器后也不占用端口
- .htaccess - 在 htaccess 中重定向以强制大写 URL
- php - 无法从php登录mysql
- java - @Inject 在无参数公共方法上
- css - 每第 N 个元素重复 CSS 样式
- c++ - CMake 在 Windows 上与 dll 链接 - 未定义的参考
- javascript - 使用 v-on:change 将特定对象元素传递给使用 Vue 和 Vuetify 的函数
- c# - 我可以通过网络流将位图文件从 csharp 应用程序发送到 android 应用程序吗?
- python - python sympy中对产品的期望
- javascript - 如何使用 nodejs 使用子进程运行命令?