在sklearn库中可以使用哪个无监督聚类算法自定义距离?

0 投票
2 回答
1070 浏览
提问于 2025-04-18 18:11

我有一个函数,它接收两个样本作为输入,然后返回它们之间的距离。基于这个函数,我定义了一个度量标准。

def TwoPointsDistance(x1, x2):
    cord1 = f.rf.apply(x1)
    cord2 = f.rf.apply(x2)
    return 1 - (cord1==cord2).sum()/f.n_trees

metric = sk.neighbors.DistanceMetric.get_metric('pyfunc',
                                                     func=TwoPointsDistance)

现在我想根据这个度量标准对我的数据进行聚类。我想看看一些使用这个距离度量的无监督聚类算法的例子。

补充说明:我特别对这个算法感兴趣:http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html#sklearn.cluster.DBSCAN

补充说明:我尝试过

DBSCAN(metric=metric, algorithm='brute').fit(Xor)

但是我收到了一个错误:

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/dist-packages/sklearn/cluster/dbscan_.py", line 249, in fit
    clust = dbscan(X, **self.get_params())
  File "/usr/local/lib/python3.4/dist-packages/sklearn/cluster/dbscan_.py", line 100, in dbscan
    metric=metric, p=p)
  File "/usr/local/lib/python3.4/dist-packages/sklearn/neighbors/unsupervised.py", line 83, in __init__
    leaf_size=leaf_size, metric=metric, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/sklearn/neighbors/base.py", line 127, in _init_params
    % (metric, algorithm))
ValueError: Metric '<sklearn.neighbors.dist_metrics.PyFuncDistance object at 0x7ff5c299f358>' not valid for algorithm 'brute'
>>> 

2 个回答

0

今天,几年后,我在不同的情况下又遇到了这个问题。解决办法很简单:直接把这个函数当作一个指标传进去。

BSCAN(metric=TwoPointsDistance, algorithm='brute').fit(Xor)

0

我一直在想这个错误为什么会出现……我最开始以为 sklearn.neighbors.NearestNeighbors(DBSCAN就是基于这个的)只能使用 sklearn.neighbors.base.VALID_METRICS["brute"] 中列出的那些距离。但从源代码来看,任何可以调用的函数都应该可以使用,所以看起来你的距离函数不能被调用?

请试试这个:

DBSCAN(metric=TwoPointsDistance, algorithm='brute').fit(Xor)

也就是说,不要把你的距离函数包装成 neighbors.DistanceMetric。我觉得现在不允许这样使用有点不一致……

我自己用ELKI配合自定义距离函数取得了很好的效果,这里有一个简短的教程教你怎么写这些函数: http://elki.dbs.ifi.lmu.de/wiki/Tutorial/DistanceFunctions

撰写回答