当我运行scikit的dbscan算法时,我得到了内存错误.我的数据大约是20000*10000,它是一个二进制矩阵.
(也许它不适合使用带有这种矩阵的DBSCAN.我是机器学习的初学者.我只是想找到一个不需要初始簇号的簇方法)
无论如何,我发现scikit的稀疏矩阵和特征提取.
http://scikit-learn.org/dev/modules/feature_extraction.html http://docs.scipy.org/doc/scipy/reference/sparse.html
但我仍然不知道如何使用它.在DBSCAN的规范中,没有关于使用稀疏矩阵的指示.不允许吗?
如果有人知道如何在DBSCAN中使用稀疏矩阵,请告诉我.或者你可以告诉我一个更合适的集群方法.
cluster-analysis machine-learning data-mining dbscan scikit-learn
假设我将以下数据帧存储为称为坐标的变量,其中前几行如下所示:
business_lat business_lng business_rating
0 19.111841 72.910729 5.
1 19.111342 72.908387 5.
2 19.111342 72.908387 4.
3 19.137815 72.914085 5.
4 19.119677 72.905081 2.
5 19.119677 72.905081 2.
. . .
. . .
. . .
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,此数据是地理空间数据(具有纬度和经度),并且每行都有一个附加值business_ rating,它对应于该行中经纬度处的企业评级。我想对数据进行聚类,其中附近且具有相似评级的企业被分配到同一个集群中。本质上,我需要一个地理空间集群,并附加要求集群必须考虑评级列。
我在网上查看过,但找不到太多解决此问题的方法:只有严格的地理空间聚类(只有要聚类的特征是 latlng)或非空间聚类。
我在下面运行了一个简单的 DBSCAN,但是当我绘制聚类结果时,它似乎没有正确执行我想要的操作。
from sklearn.cluster import DBSCAN
import numpy as np
db = DBSCAN(eps=2/6371., min_samples=5, algorithm='ball_tree', metric='haversine').fit(np.radians(coordinates))
Run Code Online (Sandbox Code Playgroud)
尝试调整 DBSCAN 的参数、对数据进行一些额外的处理或同时使用不同的方法是否会更好?
我正在尝试为scikit-learn DBSCAN实现指定自定义群集功能:
def geodistance(latLngA, latLngB):
print latLngA, latLngB
return vincenty(latLngA, latLngB).miles
cluster_labels = DBSCAN(
eps=500,
min_samples=max(2, len(found_geopoints)/10),
metric=geodistance
).fit(np.array(found_geopoints)).labels_
Run Code Online (Sandbox Code Playgroud)
但是,当我打印出距离函数的参数时,它们完全不是我所期望的:
[ 0.53084126 0.19584111 0.99640966 0.88013373 0.33753788 0.79983037
0.71716144 0.85832664 0.63559538 0.23032912]
[ 0.53084126 0.19584111 0.99640966 0.88013373 0.33753788 0.79983037
0.71716144 0.85832664 0.63559538 0.23032912]
Run Code Online (Sandbox Code Playgroud)
这就是我的found_geopoints数组的样子:
[[ 4.24680600e+01 1.40868060e+02]
[ -2.97677600e+01 -6.20477000e+01]
[ 3.97550400e+01 2.90069000e+00]
[ 4.21144200e+01 1.43442500e+01]
[ 8.56111000e+00 1.24771390e+02]
...
Run Code Online (Sandbox Code Playgroud)
那么为什么不是距离函数纬度经度对的参数呢?
我想在Spark上做一些DBSCAN.我目前发现了2个实现:
我已经使用其github中给出的sbt配置测试了第一个但是:
jar中的函数与doc或github上的源代码中的函数不同.例如,我在jar中找不到列车功能
我设法使用fit函数(在jar中找到)运行测试,但是epsilon的错误配置(从小到大)将代码置于无限循环中.
代码:
val model = DBSCAN.fit(eps, minPoints, values, parallelism)
Run Code Online (Sandbox Code Playgroud)
有人设法与第一个图书馆合作吗?
有人测试过第二个吗?
scala cluster-analysis dbscan apache-spark apache-spark-mllib
阅读周围,我发现可以将预先计算的距离矩阵传递到SKLearn DBSCAN中。不幸的是,我不知道如何通过它进行计算。
假设我有一个包含 100 个元素的一维数组,其中只有节点的名称。然后我有一个 100x100 的 2D 矩阵,每个元素之间的距离(顺序相同)。
我知道我必须这样称呼它:
db = DBSCAN(eps=2, min_samples=5, metric="precomputed")
对于节点之间的距离为 2 且节点簇最少为 5 个的情况。另外,使用“预先计算”来指示使用二维矩阵。但是如何传递计算信息呢?
如果使用 RAPIDS CUML DBScan函数(GPU 加速) ,可能会出现同样的问题。
我在ELKI环境中使用OPTICS实现时遇到问题.我在DBSCAN实现中使用了相同的数据,它就像一个魅力.可能我错过了一些带参数的东西,但我无法弄明白,一切似乎都是正确的.
数据是一个简单的300х2矩阵,由3个簇组成,每个簇有100个点.
DBSCAN结果:
MinPts = 10,Eps = 1
光学结果:
MinPts = 10
我需要根据不同介词的分布(如agentive,instrumental,time,place等)找到自然发生的名词类.我尝试使用k-means聚类但帮助较少,但效果不好,我所寻找的类有很多重叠(可能是因为类的非球形形状和k-means中的随机初始化) ).
我现在正在使用DBSCAN,但我无法理解此聚类算法中的epsilon值和迷你点值.我可以使用随机值,还是需要计算它们.任何人都可以帮忙.特别是对于epsilon,至少如果我需要的话,如何计算它.
是否应该对sklearn.clustering.DBSCAN的输入进行预处理?
在示例http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#example-cluster-plot-dbscan-py中,计算输入样本X之间的距离并进行标准化:
D = distance.squareform(distance.pdist(X))
S = 1 - (D / np.max(D))
db = DBSCAN(eps=0.95, min_samples=10).fit(S)
Run Code Online (Sandbox Code Playgroud)
在v0.14(http://jaquesgrobler.github.io/online-sklearn-build/auto_examples/cluster/plot_dbscan.html)的另一个示例中,完成了一些缩放:
X = StandardScaler().fit_transform(X)
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
Run Code Online (Sandbox Code Playgroud)
我的代码基于后一个示例,并且通过此缩放使印象聚类更好地工作.但是,这种缩放"通过删除均值和缩放到单位方差来标准化特征".我试着找到2d集群.如果我将我的星团分布在一个平方区域 - 让我们说100x100我看到缩放没有问题.然而,如果分布在矩形区域(例如800x200)中,缩放"挤压"我的样本并在一个维度上改变它们之间的相对距离.这会使聚类恶化,不是吗?或者我理解某事.错误?我是否需要应用一些预处理,或者我可以简单地输入我的"原始"数据?
![在此输入图像描述][1]
\n\nfrom sklearn.cluster import DBSCAN\ndbscan = DBSCAN(eps=0.001, min_samples=10) \nclustering = dbscan.fit(X)\nRun Code Online (Sandbox Code Playgroud)\n\n示例向量\xef\xbc\x9a
\n\narray([[ 0.05811029, -1.089355 , -1.9143777 , ..., 1.235167 ,\n -0.6473859 , 1.5684978 ],\n [-0.7117326 , -0.31876346, -0.45949244, ..., 0.17786546,\n 1.9377285 , 2.190525 ],\n [ 1.1685177 , -0.18201494, 0.19475089, ..., 0.7026453 ,\n 0.3937522 , -0.78675956],\n ...,\n [ 1.4172379 , 0.01070347, -1.3984257 , ..., -0.70529956,\n 0.19471683, -0.6201791 ],\n [ 0.6171041 , -0.8058429 , 0.44837445, ..., 1.216958 ,\n -0.10003573, -0.19012968],\n [ 0.6433722 , 1.1571665 , -1.2123466 , ..., …Run Code Online (Sandbox Code Playgroud) K-means 的 Scikit-learn 实现具有predict()可应用于未见过的数据的功能。而DBSCAN和Agglomerative则没有这个predict()功能。
这三种算法都有fit_predict(),用于拟合模型然后进行预测。但是 k-meanspredict()可以直接用于未见过的数据,而其他算法则不然。
我非常清楚有聚类算法,并且根据我的观点,predict()K 均值也不应该存在。
这种差异背后可能的直觉/原因是什么?难道只是因为k-means进行了“1NN分类”,所以才有作用predict()?
cluster-analysis machine-learning k-means dbscan scikit-learn
dbscan ×10
scikit-learn ×7
data-mining ×4
python ×3
apache-spark ×1
elki ×1
geospatial ×1
k-means ×1
rapids ×1
scala ×1
word2vec ×1