比较2D数据/散点图集

时间:2011-02-05 16:18:30

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

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

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

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

绿色和红色应该被认为是非常不同的,但推动是推,它们应该比蓝色和红色更相似。

http://img153.imageshack.us/img153/6730/screenshot20110204at004.png

我试过:

  • 基于总体超额和偏差进行比较
  • 将变量分成坐标区域(即(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”。然而,那里给出的答案建议比较质心中最近邻居之间的平均距离,我认为这对我来说不适合作为方向,对于我的目的来说,距离的距离一样重要。

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

2 个答案:

答案 0 :(得分:1)

分两步

1)第一:分辨蓝调。

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

enter image description here

蓝色配置,因为它们更分散,会给你的结果比红色和绿色更大。

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

忽略最近邻距离大于较小值的所有点(例如前一距离的四分之一)。为邻近区域进行聚类以获得格式的聚类:

enter image description hereenter image description here

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

你有。

HTH!

答案 1 :(得分:1)

尽管belisarius已经回答了这个问题,但这里有几条评论:

如果你可以减少每组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 )

(通常的欧几里德距离在这里根本不起作用。)

请跟进 - 告诉我们最终有什么作用,什么没有。