6

我有2000组数据,每组数据包含1000多个2D变量。我期望根据相似性将这些数据集群集中到20-100个群集中的任何位置。但是,我无法提出比较数据集的可靠方法。我尝试了一些(相当原始的)方法并完成了大量的研究,但我似乎找不到适合我需要的任何东西。比较2D数据/散点图组

我已经发布了一张图片,下面是我绘制的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”。然而,这里给出的答案建议比较最近邻居之间距离质心的平均距离,我认为这对我而言并不适合作为方向,这与我的目的距离同样重要。

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

+0

同意乔布洛 - 你可以尝试用最小二乘法做线性拟合,得到绿色,蓝色,红色点的3线方程,并比较这三个方程的斜率和截距。 – 2011-02-05 17:32:37

+0

你也可以尝试比较簇之间的Hausdorff距离。 – 2011-02-05 17:40:37

回答

1

分两步

1)首先:要分辨蓝色。

计算平均最近邻距离,直到截止。选择截止像黑色距离如下图:

enter image description here

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

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

不顾一切的中心,其最近的邻居距离比更小的东西(例如以前的距离的四分之一)以上。Clusterize用于接近,从而获得形式的集群:

enter image description hereenter image description here

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

你在那里。

HTH!

1

虽然贝利萨留回答了这口井,这里有一对夫妇的意见:

,如果你可以降低每一组的1000点,说的32分32个簇的每个 (或20×50或...) ,那么你可以使用32空间而不是1000空间。 尝试K-means clustering为此;另请参阅 SO questions/tagged/k-means

一种方法来衡量B将A之间的距离(点,群) 是采取就近对这样的:

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) 

请跟进—告诉我们到底什么工作,什么没有。