我有2000组数据,每组包含超过1000个2D变量。我希望根据相似性将这些数据集聚集到20-100个集群中。但是,我在提出一种比较数据集的可靠方法时遇到了麻烦。我已经尝试了一些(相当原始的)方法并完成了很多研究,但我似乎找不到任何适合我需要做的事情。
我已经在下面发布了3组我的数据。数据在y轴上以0-1为界,在x轴上在~0-0.10范围内(实际上,理论上可能大于0.10)。
数据的形状和相对比例可能是最重要的比较。但是,每个数据集的绝对位置也很重要。换句话说,每个单独点与另一个数据集的各个点的相对位置越接近,它们就越相似,然后需要考虑它们的绝对位置。
绿色和红色应该被认为是非常不同的,但推动是推,它们应该比蓝色和红色更相似。
我试过:
所有这些都产生了错误的结果。我在研究中找到的最接近的答案是“Appropriate similarity metrics for multiple sets of 2D coordinates”。然而,那里给出的答案建议比较质心中最近邻居之间的平均距离,我认为这对我来说不适合作为方向,对于我的目的来说,距离的距离一样重要。
我可以补充说,这将用于为另一个程序的输入生成数据,并且只会偶尔使用(主要用于生成具有不同数量的簇的不同数据集),因此半耗时的算法不会出来问题。
答案 0 :(得分:1)
分两步
1)第一:分辨蓝调。
计算平均最近邻距离,直至截止值。在下图中选择类似黑色距离的截止值:
蓝色配置,因为它们更分散,会给你的结果比红色和绿色更大。
2)第二:分辨红色和绿色
忽略最近邻距离大于较小值的所有点(例如前一距离的四分之一)。为邻近区域进行聚类以获得格式的聚类:
和
丢弃少于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 )
(通常的欧几里德距离在这里根本不起作用。)
请跟进 - 告诉我们最终有什么作用,什么没有。