聚类二维欧几里得向量 - 适当的相异性度量

数据挖掘 聚类 k-均值 相似 距离 余弦距离
2022-02-12 23:05:36

我有一套大约。50 000 个二维欧几里得向量,与 20 个组相连,即每组大约有 50000 个二维欧几里得向量。2500 个二维欧几里得向量。我的数据包括端点坐标,即x0,y0,x1,y1. 现在我想对这些组中的向量进行聚类,可能使用 k-means/k-medoids 聚类(或其他具有预定义聚类数的聚类算法)。同样重要的是,我主要关注矢量的方向,长度是次要问题(但充其量仍应考虑在内)。我正在努力选择适合我的问题的差异度量。所以这是我的问题:

  1. 如何指定数据是否重要?或者,我可以计算矢量的角度和长度,并将数据指定为x0,y0,angle,length. 我的直觉是,如果角度明确存在,欧几里得距离应该能更好地捕捉矢量的方向。更重要的是,我可以使用一些加权,修改欧几里德距离并计算两个观测值之间的距离,例如:

(x01x02)2+(y01y02)2+(angle1angle2)2+1n(length1length2)2

在哪里n是一些常数。

  1. 我还认为角距离是一种差异度量。据我所知,这相当于对标准化数据点进行聚类,因此不会捕获大小(在我的情况下为长度)。但我不确定 k-means 聚类是否可以用余弦距离完成。如果是这样,R中是否有任何允许这样做的包?

  2. 执行两次聚类是一个好的且在统计上有效的想法:首先,对起点进行聚类,其次,在这些聚类中对角度和长度进行聚类?

  3. 你们知道任何关于类似问题的论文,即对二维数据点进行聚类吗?任何示例都会非常方便。

3个回答

对于这种情况,谱聚类是一种直观的解决方案。基本上,这个想法是在转换后的特征空间中执行 k-means 聚类,通过定义该空间中的内积应该是什么。

要点是给自己一个相似性度量。在您的情况下,这可能是:

S(v1,v2)=exp((x0(1)x0(2))2+(y0(1)y0(2))22σstart2(l(1)l(2))22σl2(θ(1)θ(2))22σθ2)

在哪里:

  • (1)(2)下标与向量 1 和 2 相关
  • x0y0是向量起点坐标
  • l表示向量长度(欧几里得范数)
  • θ表示角度
  • σstart,σlσθ是您应该调整的自定义参数,以或多或少地对向量的每个方面赋予或多或少的重要性(低θ值将意味着相应的特征将被处理为高灵敏度)

然后,您应该构建图拉普拉斯矩阵并获取与最低特征值相关联的特征向量,并将您的数据投影到这些特征向量上。您获得了更高维度的空间,但您的数据将很容易通过 k-means 算法分离。

关键是调整σ很好地获得您需要的聚类。

请注意,如果您的数据包含太多点,这可能是计算密集型的。您可能希望使用较小的子集来找到正确的投影和聚类中心。

我希望我正确地遵循了你的问题。如果您将这些数据点作为 2D 向量保存,这意味着您拥有,比如说N=50,000每个数据点表示为(xi,yi), 对?如果您关心的是角度和长度,那么您的表述似乎是正确的。您可以转换每个数据点(xi,yi)进入(θi,di),它们是向量的角度和长度。这两个参数(θi,di)在每个样本中充当两个特征,您可以在此运行 k-means。您必须小心使用一致的角度测量(总是逆时针或顺时针)。据我所知,您的差异度量似乎非常正确。我相信你知道这个 python 包,但只是为了完成你可以使用 这个或者在 MATLAB 中你可以使用这个我不确定 R,如果这是您问题的重要部分,请原谅我。

(x0,y0,x1,y1)会表现得比,例如,(x0,y0,angle,length)(因为角度的比例非常不同)。或者,您也可以使用(x0,y0,x1x0,y1y0).

当你想考虑这两点时,你当然应该同时使用两者。

但如果所有向量都很短,您可能仍需要仔细缩放属性以获得最佳结果,或者聚类可能主要基于起点。

这些向量上的欧几里得距离可能很好。x 和 y 值都在欧几里得空间中,大概 x 中的差 1 与 y 中的差 1 相同,不是吗?如果您使用角度,这将不再适用!有人可能会争辩说,这两点应该被认为是独立的。可以尝试取两个距离之和(x0,y0)(x1,y1). 但我不认为结果会有很大不同。但是对于k-means,我会坚持通常的平方和(它不会最小化欧几里得距离,而是平方误差)。如果您的数据噪音太大,请考虑使用更强大的算法,例如 DBSCAN。