我使用DBSCAN来使用Scikit-Learn (Python2.7)对一些数据进行聚类:
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(random_state=0)
dbscan.fit(X)
但是,我发现没有内置函数(除了"fit_predict")可以将新的数据点Y分配给原始数据X中标识的集群。K-均值方法有一个“预测”函数,但我希望能够对DBSCAN进行同样的操作。就像这样:
dbscan.predict(X, Y)
因此,密度可以从X推断出来,但返回值(集群赋值/标签)只适用于Y。据我所知,这种能力在R中是可用的,所以我假设它在Python中也是可用的。我只是找不到这方面的任何文件。
此外,我还试图搜索为什么DBSCAN可能不被用于标记新数据的原因,但我没有找到任何理由。
发布于 2015-01-07 21:32:19
聚类不是分类。
聚类是未标记的。如果你想把它压缩到预测思维中(这不是最好的主意),那么它本质上是没有学习的预测。因为没有标记的训练数据可用于聚类。它必须根据所看到的情况为这些数据制作新的标签。但是您不能在单个实例上这样做,您只能“批量预测”。
但是DBSCAN是有问题的:
random_state
:numpy.RandomState,可选: 用于初始化中心的生成器。默认为numpy.random。
DBSCAN不“初始化中心”,因为DBSCAN中没有中心。
几乎可以将新的点分配给旧集群的唯一聚类算法是k均值(以及它的许多变体)。因为它使用以前的迭代聚类中心执行"1NN分类“,所以更新中心。但是大多数算法不像k-方法那样工作,所以你不能复制这个。
如果你想分类新的点,最好是对你的聚类结果进行分类器的训练。
R版本可能做的是,使用1NN分类器进行预测;如果1NN距离大于epsilon,则使用额外的规则分配点,如果它们的1NN距离大于epsilon,那么mabye也只使用核心点。也许不是。
得到DBSCAN的论文,它不讨论“预测”IIRC。
发布于 2018-07-25 10:12:46
在这里,一个稍微不同和更有效的实现。另外,不取eps半径内的第一个最佳核点,而是取最接近样本的核心点。
def dbscan_predict(model, X):
nr_samples = X.shape[0]
y_new = np.ones(shape=nr_samples, dtype=int) * -1
for i in range(nr_samples):
diff = model.components_ - X[i, :] # NumPy broadcasting
dist = np.linalg.norm(diff, axis=1) # Euclidean distance
shortest_dist_idx = np.argmin(dist)
if dist[shortest_dist_idx] < model.eps:
y_new[i] = model.labels_[model.core_sample_indices_[shortest_dist_idx]]
return y_new
发布于 2019-07-30 19:20:08
虽然它不是完全相同的算法,但您可以使用sklearn对新的点进行近似预测。见这里。
它的工作方式如下:
clusterer = hdbscan.HDBSCAN(min_cluster_size=15, prediction_data=True).fit(data)
test_labels, strengths = hdbscan.approximate_predict(clusterer, test_points)
https://stackoverflow.com/questions/27822752
复制相似问题