Ale*_*lex 7 cluster-analysis data-mining dbscan scikit-learn
是否应该对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)中,缩放"挤压"我的样本并在一个维度上改变它们之间的相对距离.这会使聚类恶化,不是吗?或者我理解某事.错误?我是否需要应用一些预处理,或者我可以简单地输入我的"原始"数据?
Ano*_*sse 15
这取决于你想要做什么.
如果您在地理数据上运行DBSCAN,并且距离以米为单位,您可能不希望对任何内容进行标准化,而是将您的epsilon阈值设置为米.
是的,特别是非均匀缩放会扭曲距离.虽然非扭曲缩放等同于仅使用不同的epsilon值!
注意,在第一个例子中,显然处理了相似性而不是距离矩阵.S = (1 - D / np.max(D))是一种将相似性矩阵转换为相异度矩阵的启发式算法.然后,Epsilon 0.95实际上最多意味着"观察到的最大不相似度的0.05".应该产生相同结果的替代版本是:
D = distance.squareform(distance.pdist(X))
S = np.max(D) - D
db = DBSCAN(eps=0.95 * np.max(D), min_samples=10).fit(S)
Run Code Online (Sandbox Code Playgroud)
而在第二个示例中,fit(X)实际上处理原始输入数据,而不是距离矩阵.恕我直言,这是一个丑陋的黑客,以这种方式重载方法.它很方便,但有时会导致误解甚至误用.
总的来说,我不会把sklearn的DBSCAN作为参考.整个API似乎主要受分类驱动,而不是集群驱动.通常,您不fit进行聚类,只对受监督的方法执行此操作.另外,sklearn目前不使用索引进行加速,并且需要O(n^2)内存(DBSCAN通常不会这样).
通常,您需要确保距离有效.如果你的距离功能不起作用没有基于距离的算法会产生预期的效果.在某些数据集上,当您首次规范化数据时,像欧几里得这样的天真距离会更好.在其他数据集上,您可以很好地了解距离是什么(例如地理数据.对此进行标准化是没有意义的,欧几里德的距离也不大!)
| 归档时间: |
|
| 查看次数: |
6390 次 |
| 最近记录: |