如何在 DBSCAN 中将包含分类数据和连续数据的数据集放入用户定义的度量函数中?

Posted

技术标签:

【中文标题】如何在 DBSCAN 中将包含分类数据和连续数据的数据集放入用户定义的度量函数中?【英文标题】:How to get a dataset that contains both the categorical data and continuous data into user defined metric function in DBSCAN? 【发布时间】:2019-02-05 05:37:27 【问题描述】:

我有一个包含连续值和分类值的数据集。我想编写一个函数作为 DBSCAN 中的度量标准,它使用相同的欧几里得距离连续并处理分类值,它必须将整个字符串值与其他字符串值标识。如果这 2 个值相等,则必须将距离设为 0,如果它们不相等,则结果应为 1。当我尝试为度量编写用户定义的函数时,它根本没有将数据传递给我的函数。它会抛出类似“无法将字符串转换为浮点数:”'second'“”之类的错误?有没有办法将数据传递给我的函数?

数据框如下所示:

        sundar call      raju   ram     sony  tintu  banti
points                                                    
x1         0.6  '0'   'first'  0.93   'lion'   0.34   0.98
x2         0.7  '1'  'second'  0.47    'cat'   0.43   0.76
x3         0.4  '0'   'third'  0.87  'tiger'   0.24   0.10
x4         0.6  '0'   'first'  0.93   'lion'   0.34   0.98
x5         0.5  '1'   'first'  0.32  'tiger'   0.09   0.99
x6         0.4  '0'   'third'  0.78  'tiger'   0.18   0.17
x7         0.5  '1'  'second'  0.98    'cat'   0.47   0.78 

【问题讨论】:

【参考方案1】:

我猜你应该使用“预计算”指标初始化 DBSCAN:

dbscan = sklearn.cluster.DBSCAN(metric="precomputed")

(其他参数省略)。然后计算所有样本之间的度量,得到形状为[n_samples, n_samples]的矩阵。

X = user_defined_metric(data, data)

然后使用此数据拟合 DBSCAN:

labels = dbscan.fit_predict(X)

根据sklearn文档,

fit_predict(X, y=None, sample_weight=None)

Performs clustering on X and returns cluster labels.
Parameters: 
X : array or sparse (CSR) matrix of shape (n_samples, n_features), or array of shape (n_samples, n_samples)
    A feature array, or array of distances between samples if metric='precomputed'.

第二种情况 - 形状数组 [n_samples, n_samples] 是你的。

【讨论】:

但是字符串数据又没有被传递到我的函数中(在你的例子中是它的 user_defined_metric(data, data))。它会引发另一个错误:输入包含 NaN、无穷大或对于 dtype('float64') 而言太大的值。 @Vamshi 您能否提供一个数据示例,即数据框中的一两行,以及您的指标(代码)的定义? 感谢您的回复。我认为我没有完全实施它而犯了一些错误。因此,当 DBSCAN 尝试查找我尚未实现的距离矩阵并返回错误时。 @Vamshi 我很高兴知道 :)

以上是关于如何在 DBSCAN 中将包含分类数据和连续数据的数据集放入用户定义的度量函数中?的主要内容,如果未能解决你的问题,请参考以下文章

使用带测试训练拆分的 DBSCAN 进行分类

使用 sklearn DBSCAN 模型对新条目进行分类

密度聚类算法DBSCAN实战及可视化分析

如何检查连续变量和分类变量之间的相关性?

如何用 DBSCAN 聚类算法做数据分析?

我们如何在 SQL 中将连续数据分组为单个日期跨度?