标签: dbscan

Scikit-Learn:使用DBSCAN预测新点数

我使用DBSCAN使用Scikit-Learn(Python 2.7)聚集一些数据:

from sklearn.cluster import DBSCAN
dbscan = DBSCAN(random_state=0)
dbscan.fit(X)
Run Code Online (Sandbox Code Playgroud)

但是,我发现没有内置函数(除了"fit_predict"之外)可以将新数据点Y分配给原始数据中标识的簇X.K-means方法有一个"预测"功能,但我希望能够对DBSCAN做同样的事情.像这样的东西:

dbscan.predict(X, Y)
Run Code Online (Sandbox Code Playgroud)

因此密度可以从X推断,但返回值(集群分配/标签)仅适用于Y.从我所知道的,这个功能在R中可用,所以我假设它在某种程度上也可用于Python.我似乎无法找到任何相关的文档.

此外,我已经尝试搜索为什么DBSCAN不能用于标记新数据的原因,但我没有找到任何理由.

cluster-analysis data-mining predict dbscan scikit-learn

30
推荐指数
3
解决办法
1万
查看次数

为DBSCAN(R)选择eps和minpts?

我一直在寻找这个问题的答案,所以我希望有人可以帮助我.我在R中的fpc库中使用dbscan.例如,我正在查看USArrests数据集,并在其上使用dbscan,如下所示:

library(fpc)
ds <- dbscan(USArrests,eps=20)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,选择eps仅仅是通过反复试验.但是,我想知道是否有可用于自动选择最佳eps/minpts的功能或代码.我知道有些书建议制作一个与最近邻居的第k个分类距离的图.也就是说,x轴表示"根据到第k个最近邻居的距离排序的点",并且y轴表示"第k个最近邻居距离".

这种类型的绘图有助于为eps和minpts选择合适的值.我希望我已经为某人提供了足够的信息来帮助我.我想张贴一张我的意思,但我仍然是新手,所以暂不发布图像.

r cluster-analysis data-mining dbscan

28
推荐指数
4
解决办法
5万
查看次数

scikit-learn DBSCAN内存使用情况

更新:最后,我选择用于聚类我的大型数据集的解决方案是Anony-Mousse在下面提出的解决方案.也就是说,使用ELKI的DBSCAN实现我的聚类而不是scikit-learn.它可以从命令行运行,并通过适当的索引,在几个小时内完成此任务.使用GUI和小样本数据集来计算您想要使用的选项,然后前往城镇.值得研究.Anywho,请继续阅读我原始问题的描述和一些有趣的讨论.

我有一个包含大约250万个样本的数据集,每个样本都有35个特征(浮点值),我正在尝试聚类.我一直在尝试使用scikit-learn的DBSCAN实现,使用曼哈顿距离度量和从数据中提取的一些小随机样本估计的epsilon值.到现在为止还挺好.(这里是摘录,供参考)

db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)
Run Code Online (Sandbox Code Playgroud)

我现在的问题是我很容易耗尽内存.(我目前正在使用16 GB RAM的机器)

我的问题是,DBSCAN是否在运行时动态计算成对距离矩阵,那是什么在吞噬我的记忆?(250万^ 2)*8字节显然是愚蠢的大,我会理解.我应该不使用这种fit()方法吗?更一般地说,有没有办法绕过这个问题,或者我一般在这里咆哮错误的树?

如果答案结果明显,请道歉.我已经困惑了几天.谢谢!

附录:如果有人能更明确地解释我fit(X)fit_predict(X)我之间的区别,我也会感激 - 我担心我不太明白.

附录#2:可以肯定的是,我只是在一台拥有~550 GB RAM的机器上尝试了这个并且它仍然爆炸,所以我觉得DBSCAN可能会尝试制作成对距离矩阵或者我明显不想要的东西去做.我想现在最大的问题是如何阻止这种行为,或找到更适合我需要的其他方法.谢谢你在这里与我合作.

附录#3(!):我忘了附上追溯,就在这里,

Traceback (most recent call last):
  File "tDBSCAN.py", line 34, in <module>
    db = DBSCAN(eps=float(sys.argv[2]), min_samples=10, metric='cityblock').fit(mydata)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/base.py", line 329, in fit_predict
    self.fit(X)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 186, in fit
    **self.get_params())
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 69, in dbscan
    D = pairwise_distances(X, metric=metric)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 651, in pairwise_distances
    return func(X, Y, **kwds)
  File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line …
Run Code Online (Sandbox Code Playgroud)

python cluster-analysis data-mining dbscan scikit-learn

20
推荐指数
3
解决办法
1万
查看次数

scikit-learn:使用DBSCAN聚类文本文档

我正在尝试使用scikit-learn来集群文本文档.总的来说,我找到了解决办法,但我遇到了具体问题.我发现的大多数例子都说明了使用scikit-learn和k-means作为聚类算法的聚类.在我的设置中采用k-means这些例子原则上是有效的.但是,k-means不适合,因为我不知道簇的数量.从我到目前为止所读到的内容 - 如果需要请在这里纠正我 - 在我的情况下,DBSCAN或MeanShift似乎更合适.scikit-learn网站提供了每个群集算法的示例.现在的问题是,对于DBSCAN和MeanShift,我得到了我无法理解的错误,更不用解决了.

我的最小代码如下:

docs = []
for item in [database]:
    docs.append(item)

vectorizer = TfidfVectorizer(min_df=1)
X = vectorizer.fit_transform(docs)

X = X.todense() # <-- This line was needed to resolve the isse

db = DBSCAN(eps=0.3, min_samples=10).fit(X)
...
Run Code Online (Sandbox Code Playgroud)

(我的文档已经处理完毕,即已删除了停用词并且已应用了Porter Stemmer.)

当我运行此代码时,我在实例化DBSCAN并调用时收到以下错误fit():

...
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 248, in fit
clust = dbscan(X, **self.get_params())
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 86, in dbscan
n = X.shape[0]
IndexError: tuple index out of range
Run Code Online (Sandbox Code Playgroud)

单击该行dbscan_.py引发错误,我注意到以下行

...
X = np.asarray(X)
n = X.shape[0]
... …
Run Code Online (Sandbox Code Playgroud)

cluster-analysis machine-learning data-mining dbscan scikit-learn

20
推荐指数
2
解决办法
9676
查看次数

DBSCAN用于聚类地理位置数据

我有一个纬度和经度对的数据框.

这是我的数据帧外观.

    order_lat  order_long
0   19.111841   72.910729
1   19.111342   72.908387
2   19.111342   72.908387
3   19.137815   72.914085
4   19.119677   72.905081
5   19.119677   72.905081
6   19.119677   72.905081
7   19.120217   72.907121
8   19.120217   72.907121
9   19.119677   72.905081
10  19.119677   72.905081
11  19.119677   72.905081
12  19.111860   72.911346
13  19.111860   72.911346
14  19.119677   72.905081
15  19.119677   72.905081
16  19.119677   72.905081
17  19.137815   72.914085
18  19.115380   72.909144
19  19.115380   72.909144
20  19.116168   72.909573
21  19.119677   72.905081
22  19.137815   72.914085
23  19.137815   72.914085
24  19.112955   72.910102
25 …
Run Code Online (Sandbox Code Playgroud)

python cluster-analysis dbscan

20
推荐指数
3
解决办法
3万
查看次数

DBSCAN scikit-learn of Python:将聚类点保存在数组中

以下示例Scikit Learning 的DBSCAN聚类算法示例我试图在数组中存储每个聚类类的x,y

import numpy as np
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs
from sklearn.preprocessing import StandardScaler
from pylab import *

# Generate sample data
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=0)
X = StandardScaler().fit_transform(X) 

xx, yy = zip(*X)
scatter(xx,yy)
show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

db = DBSCAN(eps=0.3, min_samples=10).fit(X)
core_samples = db.core_sample_indices_
labels = db.labels_
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
print n_clusters_
3 …
Run Code Online (Sandbox Code Playgroud)

python cluster-analysis dbscan scikit-learn

18
推荐指数
1
解决办法
2万
查看次数

Python聚类算法

我一直在寻找scipy和sklearn来解决我遇到的特定问题的聚类算法.我需要某种方法将N个粒子的特征表征为k个组,其中k不一定是已知的,除此之外,没有先验的链接长度是已知的(类似于这个问题).

我已经尝试了kmeans,如果你知道你想要多少个簇,那么效果很好.我已经尝试过dbscan,除非你告诉它一个特征性的长度尺度来停止寻找(或开始寻找)群集,否则它会很糟糕.问题是,我可能有成千上万的这些粒子簇,我不能花时间告诉kmeans/dbscan算法他们应该做些什么.

以下是dbscan找到的示例: dbscanfail

你可以看到这里确实存在两个不同的种群,虽然调整了epsilon因子(相邻簇参数之间的最大距离),但我根本无法看到这两个粒子群.

有没有其他算法可以在这里工作?我预先寻找最少的信息 - 换句话说,我希望算法能够做出关于什么可能构成单独集群的"智能"决策.

cluster-analysis k-means dbscan

13
推荐指数
1
解决办法
1万
查看次数

dbscan - 最大簇跨度的设置限制

通过我的DBSCAN的理解,有可能为你指定的,比如说一个小量,100米-因为DBSCAN考虑到密度可达性 直接密度可达发现群集时-与群集最终在其中的最大距离任意两点之间> 100米.在更极端的可能性,似乎有可能,你可以设置为100米ε和1公里集群结束: 参见[2] [6]这阵图像从scikit在学习的时候可能发生的例子.(我非常愿意被告知我是一个完全白痴,并且误解了DBSCAN,如果这就是这里发生的事情.)

是否存在基于密度的算法,如DBSCAN,但是考虑到群集中任意两点之间的最大距离的某种阈值?

python algorithm cluster-analysis data-mining dbscan

11
推荐指数
1
解决办法
4737
查看次数

如何在DBSCAN sklearn中获取质心?

我正在使用 DBSCAN 进行聚类。然而,现在我想从每个簇中选取一个点来代表它,但我意识到 DBSCAN 没有像 kmeans 中那样具有质心。

然而,我观察到 DBSCAN 有一个叫做core points. 我在想是否可以使用这些核心点或任何其他替代方案来从每个簇中获取代表点。

我在下面提到了我使用过的代码。

import numpy as np
from math import pi
from sklearn.cluster import DBSCAN

#points containing time value in minutes
points = [100, 200, 600, 659, 700]

def convert_to_radian(x):
    return((x / (24 * 60)) * 2 * pi)

rad_function = np.vectorize(convert_to_radian)
points_rad = rad_function(points)

#generate distance matrix from each point
dist = points_rad[None,:] - points_rad[:, None]

#Assign shortest distances from each point
dist[((dist > pi) & (dist …
Run Code Online (Sandbox Code Playgroud)

python cluster-analysis dbscan scikit-learn

10
推荐指数
1
解决办法
1万
查看次数

如何使用Weka的DBSCAN对实例进行聚类?

我一直在尝试使用Weka的DBSCAN聚类器来集群实例.根据我的理解,我应该使用这个clusterInstance()方法,但令我惊讶的是,当看一下该方法的代码时,看起来实现忽略了参数:

/**
 * Classifies a given instance.
 *
 * @param instance The instance to be assigned to a cluster
 * @return int The number of the assigned cluster as an integer
 * @throws java.lang.Exception If instance could not be clustered
 * successfully
 */
public int clusterInstance(Instance instance) throws Exception {
    if (processed_InstanceID >= database.size()) processed_InstanceID = 0;
    int cnum = (database.getDataObject(Integer.toString(processed_InstanceID++))).getClusterLabel();
    if (cnum == DataObject.NOISE)
        throw new Exception();
    else
        return cnum;
}
Run Code Online (Sandbox Code Playgroud)

这似乎不对.这应该怎么样?我应该使用不同的方法进行聚类吗?如果我想从中获取任何有用的信息,是否必须按特定顺序在所有实例上按顺序运行此方法?

java cluster-analysis weka dbscan

9
推荐指数
2
解决办法
8577
查看次数