【问题标题】:Comparing sets of 2D data/scatterplots比较 2D 数据集/散点图
【发布时间】:2011-06-21 22:24:56
【问题描述】:

我有 2000 组数据,每组包含 1000 多个 2D 变量。我希望根据相似性将这些数据集聚类到 20-100 个聚类中。但是,我在想出一种比较数据集的可靠方法时遇到了麻烦。我尝试了一些(相当原始的)方法并进行了大量研究,但我似乎找不到任何适合我需要做的事情。

我在下面发布了一张我绘制的 3 组数据的图片。数据在 y 轴上以 0-1 为界,在 x 轴上在 ~0-0.10 范围内(实际上,理论上可能大于 0.10)。

数据的形状和相对比例可能是最重要的比较因素。然而,每个数据集的绝对位置也很重要。换句话说,每个点的相对位置与另一个数据集的单个点越接近,它们就越相似,那么就需要考虑它们的绝对位置。

绿色和红色应该被认为是非常不同的,但推到了紧要关头,它们应该比蓝色和红色更相似。

我已经尝试过:

  • 根据总体超额和偏差进行比较
  • 将变量分割成坐标区域(即(0-0.10, 0-0.10), (0.10-0.20, 0.10-0.20)...(0.9-1.0, 0.9-1.0))并根据共享点比较相似度区域内
  • 我尝试测量数据集中到最近邻居的平均欧几里得距离

所有这些都产生了错误的结果。我在研究中能找到的最接近的答案是“Appropriate similarity metrics for multiple sets of 2D coordinates”。但是,那里给出的答案建议比较最近邻居与质心的平均距离,我认为这对我来说不适合作为方向,但对于我的目的而言,它与距离一样重要。

我可能会补充一点,这将用于为另一个程序的输入生成数据,并且只会偶尔使用(主要用于生成具有不同数量的集群的不同数据集),因此不会出现半耗时算法问题。

【问题讨论】:

  • 同意 Joe Blow - 您可以尝试使用最小二乘法进行线性拟合,以获得绿、蓝、红点的 3 个线方程,并比较这三个方程的斜率和截距。
  • 您也可以尝试比较集群之间的 Hausdorff 距离。
  • 所有数据集的点数都相同吗?点的顺序是否重要(第 5 点是否对所有数据集都具有相似的含义?)
  • 不,任何给定的点索引都没有特殊含义。 @Joe Blow 我正在探索与 LOESS 的线条拟合,并考虑比较线条作为比较的一部分,谢谢。 @belisarius,谢谢。我一定会这样做的。

标签: algorithm language-agnostic graphics cluster-analysis similarity


【解决方案1】:

分两步

1) 第一:区分忧郁。

计算平均最近邻距离,直至截止值。在下图中选择类似于黑色距离的截止值:

蓝色配置,因为它们更分散,会给您带来比红色和绿色更好的结果。

2) 第二:区分红色和绿色

忽略最近邻距离大于较小值(例如先前距离的四分之一)的所有点。聚类以获取接近度,以便获得以下形式的集群:

丢弃少于 10 个点(左右)的簇。对于每个集群运行线性拟合并计算协方差。红色的平均协方差将远高于绿色,因为绿色在这个尺度上非常对齐。

你来了。

HTH!

【讨论】:

  • 至少,我想计算到 x 个最近邻居的平均距离会比我到最近邻居的平均最近距离要好得多。我还没有机会尝试它,但我怀疑它会与其他一些指标配对成为一个很好的指标。我不确定第二部分,但我会看看它。谢谢。
  • @mcnulty 我做了很多次这样的事情(作为一名物理学家)。您必须尝试截止值。如果你所有的红色、绿色和蓝色都与发布的相似,你不会发现很多麻烦。当然期待很多 cpu 时间。
【解决方案2】:

虽然贝利撒留已经很好地回答了这个问题,但这里有几个 cmets:

如果您可以将每组 1000 个点减少为 32 个集群,每组 32 个点 (或 20 x 50 或 ...),那么您可以在 32 空间而不是 1000 空间中工作。 为此尝试K-means clustering; 也可以看看 SO questions/tagged/k-means.

一种测量集合 A、B(点、簇)之间距离的方法 是像这样取最近的对:

def nearestpairsdistance( A, B ):
    """ large point sets A, B -> nearest b each a, nearest a each b """
        # using KDTree, http://docs.scipy.org/doc/scipy/reference/spatial.html
    Atree = KDTree( A )
    Btree = KDTree( B )
    a_nearestb, ixab = Btree.query( A, k=1, p=p, eps=eps )  # p=inf is fast
    b_nearesta, ixba = Atree.query( B, k=1, p=p, eps=eps )
    if verbose:
        print "a_nearestb:", nu.quantiles5(a_nearestb)
        print "b_nearesta:", nu.quantiles5(b_nearesta)
    return (np.median(a_nearestb) + np.median(b_nearesta)) / 2
        # means are sensitive to outliers; fast approx median ?

可以然后将 32 个空间中的 2000 个点聚类到 20 个聚类中心 一口气:

centres, labels = kmeans( points, k=20, iter=3, distance=nearestpairsdistance )

(通常的欧几里得距离在这里根本行不通。)

请跟进 - 告诉我们最终哪些有效,哪些无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多