Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scikit learn DBS可以学习记忆问题_Scikit Learn_Dbscan - Fatal编程技术网

Scikit learn DBS可以学习记忆问题

Scikit learn DBS可以学习记忆问题,scikit-learn,dbscan,Scikit Learn,Dbscan,我正在尝试使用DBSCAN sklearn实现进行异常检测。它适用于小型数据集(500 x 6)。但是,当我尝试使用大型数据集(180000 x 24)时,它会遇到内存问题。我能做些什么来克服这个问题吗 from sklearn.cluster import DBSCAN import pandas as pd from sklearn.preprocessing import StandardScaler import numpy as np data = pd.read_csv("data

我正在尝试使用DBSCAN sklearn实现进行异常检测。它适用于小型数据集(500 x 6)。但是,当我尝试使用大型数据集(180000 x 24)时,它会遇到内存问题。我能做些什么来克服这个问题吗

from sklearn.cluster import DBSCAN
import pandas as pd
from sklearn.preprocessing import StandardScaler
import numpy as np

data = pd.read_csv("dataset.csv")
# Drop non-continuous variables
data.drop(["x1", "x2"], axis = 1, inplace = True)
df = data

data = df.as_matrix().astype("float32", copy = False)

stscaler = StandardScaler().fit(data)
data = stscaler.transform(data)

print "Dataset size:", df.shape

dbsc = DBSCAN(eps = 3, min_samples = 30).fit(data)

labels = dbsc.labels_
core_samples = np.zeros_like(labels, dtype = bool)
core_samples[dbsc.core_sample_indices_] = True

# Number of clusters in labels, ignoring noise if present.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)

print('Estimated number of clusters: %d' % n_clusters_)

df['Labels'] = labels.tolist()

#print df.head(10)

print "Number of anomalies:", -1 * (df[df.Labels < 0]['Labels'].sum())
从sklearn.cluster导入DBSCAN
作为pd进口熊猫
从sklearn.preprocessing导入StandardScaler
将numpy作为np导入
data=pd.read\u csv(“dataset.csv”)
#删除非连续变量
数据删除([“x1”,“x2”],轴=1,在位=True)
df=数据
data=df.as_matrix().astype(“float32”,copy=False)
stscaler=StandardScaler().fit(数据)
data=stscaler.transform(数据)
打印“数据集大小:”,df.shape
dbsc=DBSCAN(eps=3,最小样本数=30)。拟合(数据)
labels=dbsc.labels_
岩芯样本=np.zeros_like(标签,dtype=bool)
岩芯样本[dbsc.岩芯样本指数]=真
#标签中的簇数,忽略噪波(如果存在)。
n_clusters_uu=len(设置(标签))-(如果标签中的-1,则为1,否则为0)
打印('估计的群集数:%d'%n\u群集\u)
df['Labels']=Labels.tolist()
#打印测向头(10)
打印“异常数:”,-1*(df[df.Labels<0]['Labels'].sum())

根据您要解决的问题类型,可以在DBSCAN构造函数中绕过此参数:

leaf\u size
:int,可选(默认值=30) 传递给BallTree或cKDTree的叶大小。这可能会影响构造和查询的速度,以及存储树所需的内存。最佳值取决于问题的性质


如果这不符合您的需要,这个问题已经解决了,您可以尝试使用ELKI的DBSCAN实现。

很遗憾,sklearn实现可能是最坏情况下的O(n^2)(这不是标准的DBSCAN,但由于sklearn的矢量化;例如,ELKI只使用O(n)内存)。您可以使用低内存实现,添加更多内存,然后尝试使用更小的eps。3关于标准化的数据看起来太大了!可以让我试试不同的参数。谢谢你的回复。在我尝试ELKI或R之前,我希望有一些python实现是有效的。我将参数更改为:dbsc=DBSCAN(eps=1,min_samples=15)。fit(data)它需要10GB内存和25分钟,但工作正常。再次感谢,谢谢。我确实看到了另一个堆栈溢出问题,但希望这个问题在最新的scikit learn.leaf_大小对内存成本的影响很小。sklearn问题是因为它首先计算并存储所有点的所有邻居,然后运行DBSCAN。这就是大型eps存在问题的原因。ELKI需要改进文档。