Scikit-Learn DBSCAN 聚类不产生聚类
Scikit-Learn DBSCAN clustering yielding no clusters
我有一个包含十几个维度(列)和大约 200 个观察值(行)的数据集。此数据集已使用 quantile_transform_normalize
归一化。 (编辑:我尝试 运行 没有归一化的聚类,但仍然没有运气,所以我不认为这是原因。)现在我想将数据聚类成几个聚类。直到现在我一直在使用 KMeans,但我了解到它在更高的维度上可能不准确并且不能很好地处理异常值,所以我想与 DBSCAN 进行比较以查看我是否得到不同的结果。
但是,当我尝试使用马氏距离度量通过 DBSCAN 对数据进行聚类时,每个项目都聚类为 -1。根据文档:
Noisy samples are given the label -1.
我不太确定这意味着什么,但我用 KMeans 得到了一些不错的聚类,所以我知道那里有一些东西可以聚类——它不仅仅是随机的。
这是我用于聚类的代码:
covariance = np.cov(data.values.astype("float32"), rowvar=False)
clusterer = sklearn.cluster.DBSCAN(min_samples=6, metric="mahalanobis", metric_params={"V": covariance})
clusterer.fit(data)
仅此而已。我确定 data
是一个数字 Pandas DataFrame,因为我在调试器中检查过它。
什么可能导致此问题?
您还需要选择参数 eps
。
DBSCAN 结果非常依赖这个参数。你可以在文献中找到一些估计它的方法。
恕我直言,sklearn
应该 不 为这个参数提供默认值,因为它很少起作用(在规范化的玩具数据上通常没问题,但仅此而已).
200 个实例可能太小而无法可靠地测量密度,尤其是在有十几个变量的情况下。
我有一个包含十几个维度(列)和大约 200 个观察值(行)的数据集。此数据集已使用 quantile_transform_normalize
归一化。 (编辑:我尝试 运行 没有归一化的聚类,但仍然没有运气,所以我不认为这是原因。)现在我想将数据聚类成几个聚类。直到现在我一直在使用 KMeans,但我了解到它在更高的维度上可能不准确并且不能很好地处理异常值,所以我想与 DBSCAN 进行比较以查看我是否得到不同的结果。
但是,当我尝试使用马氏距离度量通过 DBSCAN 对数据进行聚类时,每个项目都聚类为 -1。根据文档:
Noisy samples are given the label -1.
我不太确定这意味着什么,但我用 KMeans 得到了一些不错的聚类,所以我知道那里有一些东西可以聚类——它不仅仅是随机的。
这是我用于聚类的代码:
covariance = np.cov(data.values.astype("float32"), rowvar=False)
clusterer = sklearn.cluster.DBSCAN(min_samples=6, metric="mahalanobis", metric_params={"V": covariance})
clusterer.fit(data)
仅此而已。我确定 data
是一个数字 Pandas DataFrame,因为我在调试器中检查过它。
什么可能导致此问题?
您还需要选择参数 eps
。
DBSCAN 结果非常依赖这个参数。你可以在文献中找到一些估计它的方法。
恕我直言,sklearn
应该 不 为这个参数提供默认值,因为它很少起作用(在规范化的玩具数据上通常没问题,但仅此而已).
200 个实例可能太小而无法可靠地测量密度,尤其是在有十几个变量的情况下。