评估向量距离度量
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。这是唯一得到统计支持的方法。您无法构建评估指标“一般优度”的方法,因为没有这样的对象,指标质量只能在特定任务中评估,这涉及修复所有其他元素(例如聚类/分类方法,特定数据集等等。)。一旦你执行了如此广泛、详尽的评估,在许多数据集上检查了许多这样的对,你可能会声称给定的指标在这样的任务范围内表现最好。
【讨论】:
以上是关于评估向量距离度量的主要内容,如果未能解决你的问题,请参考以下文章