我正在使用单词频率向量并尝试Scikit Learns Pairwise Distances中可用的一些不同距离度量。我想使用这些距离进行聚类和分类。
我通常有一个约30,000 x 100的特征矩阵。我的想法是通过在距离度量available in Scipy的同一数据集上运行成对差异来选择最大化成对距离的距离度量(例如Euclidean,Cityblock等)和每个指标
将为数据集计算的距离转换为zscores以跨指标进行标准化
获取这些zscores的范围,即距离的扩展
使用距离指标,它给出了最宽的距离范围,因为它显然给了我在数据集上的最大分布以及最常用的差异。 (参见下面的代码)
我的问题:
非常感谢任何帮助!
我的代码:
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)
答案 0 :(得分: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,而是使用k-means + euclidean,k-means + minkowsky等等。这是唯一受统计支持的方法。你不能建立一种评估“一般善良”的方法。由于没有这样的对象,度量质量只能在特定任务中进行评估,其中涉及修复每个其他元素(例如聚类/分类方法,特定数据集等)。一旦您执行了如此广泛,详尽的评估,检查许多此类对,在许多数据集上,您可能会声称给定的度量标准在这样的任务范围内表现最佳。