评估向量距离度量

Posted

技术标签:

【中文标题】评估向量距离度量【英文标题】:Evaluating vector distance measures 【发布时间】:2016-09-27 11:20:20 【问题描述】:

我正在使用词频向量并尝试Scikit Learns Pairwise Distances 中提供的一些不同的距离度量。我想将这些距离用于聚类和分类。

我通常有一个约 30,000 x 100 的特征矩阵。我的想法是选择一个距离度量,通过在具有距离度量 available in Scipy(例如欧几里得、Cityblock 等)的同一数据集上运行成对差异来最大化成对距离.) 以及每个指标

将为数据集计算的距离转换为 zscores 以跨指标进行标准化

获取这些 zscores 的范围,即距离的分布

使用可以提供最广泛距离的距离度量,因为它显然为我提供了在我的数据集上的最大分布和最大的方差。 (参见下面的代码)

我的问题:

这种方法有意义吗?

还有其他值得尝试的评估程序吗?我找到了这些论文(Gavin、Aggarwal,但它们在这里没有 100% 应用...)

非常感谢任何帮助!

我的代码:

matrix=np.random.uniform(0, .1, size=(10,300)) #test data set

scipy_distances=['euclidean', 'minkowski', ...] #these are the distance metrics 

for d in scipy_distances: #iterate over distances
    distmatrix=sklearn.metrics.pairwise.pairwise_distances(matrix, metric=d)
    distzscores = scipy.stats.mstats.zscore(distmatrix, axis=0, ddof=1)
    diststats=basicstatsmaker(distzscores)
    range=np.ptp(distzscores, axis=0)
    print "range of metric", d, np.ptp(range)

【问题讨论】:

这种方法是否有意义取决于您要达到的目标。使用一组分类/聚类算法,此功能集可能比其他功能集更有效。而其他功能可能适用于其他算法。您需要有一个您正在尝试优化的最终指标,并在此基础上您可以选择最适合的功能。该最终指标是您评估功能和算法的方式。 【参考方案1】:

一般来说 - 这只是一种启发式方法,可能会,也可能不会 - 工作。特别是,很容易构建一个“虚拟指标”,即使它没有用,它也会在你的方法中“获胜”。试试看

class Dummy_dist:

  def __init__(self):
    self.cheat = True

  def __call__(self, x, y):
    if self.cheat:
      self.cheat = False
      return 1e60
    else:
      return 0

dummy_dist = Dummy_dist()

这将为您提供 huuuuge 传播(即使使用 z 分数标准化)。当然,这是一个作弊示例,因为这是不确定的,但我想展示基本的反例,当然,鉴于您的数据,我们可以构建一个确定性的类比。

那你应该怎么做?您的指标应被视为流程的超参数。您不应该将生成聚类/分类的过程分为两个单独的阶段:选择距离然后学习;但是您应该联合执行此操作,将您的聚类/分类+距离对视为单个模型,因此您将使用 k-means+euclidean、k-means+minkowsky 等,而不是使用 k-means。这是唯一得到统计支持的方法。您无法构建评估指标“一般优度”的方法,因为没有这样的对象,指标质量只能在特定任务中评估,这涉及修复所有其他元素(例如聚类/分类方法,特定数据集等等。)。一旦你执行了如此广泛、详尽的评估,在许多数据集上检查了许多这样的对,你可能会声称给定的指标在这样的任务范围内表现最好。

【讨论】:

以上是关于评估向量距离度量的主要内容,如果未能解决你的问题,请参考以下文章

向量的相似性度量

距离度量以及python实现

距离度量以及python实现

相似性度量(距离及相似系数)

相似性度量(距离及相似系数)

基础概念--欧式距离