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

时间:2018-08-30 09:59:40

标签: python python-3.x cluster-analysis data-mining dbscan

我有一个具有连续和分类值的数据集。我想在DBSCAN中编写一个作为度量的函数,该函数使用相同的欧几里得距离进行连续运算,并且要处理分类值,它必须将整个字符串值与其他字符串值标识在一起。如果这两个值相等,则如果距离不相等,则必须将距离设为0,然后结果应为一。当我尝试为度量编写用户定义的函数时,它根本没有将数据传递给我的函数。它抛出类似“无法将字符串转换为浮点型的错误:“'second'””?有什么方法可以将数据传递给我的函数吗? enter image description here

数据框如下:

        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 个答案:

答案 0 :(得分:2)

我想您应该使用“预计算”指标来初始化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]的数组是您的。