使用空间和时间变量在 python(scipy) 中进行聚类

Posted

技术标签:

【中文标题】使用空间和时间变量在 python(scipy) 中进行聚类【英文标题】:Clustering in python(scipy) with space and time variables 【发布时间】:2013-09-15 06:51:52 【问题描述】:

我的数据集的格式: [x-coordinate, y-coordinate, hour] 小时为 0 到 23 之间的整数值。

我现在的问题是,当我需要一个欧几里德距离度量作为坐标时,我如何对这些数据进行聚类,但是对于小时而言,我需要一个不同的度量(因为 d(23,0) 在欧几里得距离度量中是 23)。是否可以为 scipy 中的每个特征用不同的距离度量对数据进行聚类?如何?

谢谢

【问题讨论】:

你想使用什么聚类技术? 目前我正在尝试使用 kmeans,但是任何能够产生良好结果的聚类方法都可以。 你有信心它会收敛吗?我会这样做的方法是使用我自己的修改来修改VQ function,并根据每次迭代的字典进行修改。我认为这样做不会太难。 如果不同度量的距离选择得当,它应该会收敛,目前我正在尝试重写 kmeans 算法的一部分,以便它可以处理每个特征的不同距离度量。由于我对 python 很陌生,但这可能需要一段时间。但我觉得这是唯一的解决方案。 添加了回复,而不是搜索聚类是什么,n发现您并不是真的只想计算一侧(x0,y0)和(x1,y1)之间的距离和时间差在另一侧的 (h0) 和 (h1) 之间,但使用一个数据结构 - 如果这就是你想要做的,我可以取消删除我的回复 【参考方案1】:

您需要定义自己的指标,以适当的方式处理“时间”。在scipy.spatial.distance.pdist 的文档中,您可以定义自己的函数

Y = pdist(X, f)

使用用户提供的 2 元函数 f 计算 X 中所有向量对之间的距离。 [...] 例如,向量之间的欧几里得距离可以计算如下:

dm = pdist(X, lambda u, v: np.sqrt(((u-v)**2).sum()))

可以通过 metric 关键字将指标传递给任何 scipy 聚类算法。例如,使用linkage:

scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean')

【讨论】:

@user2768102 没问题,欢迎来到 Stack Overflow!更好的帖子的小提示,您无需在帖子中说“谢谢/请/干杯”,因为我们希望降低信噪比。

以上是关于使用空间和时间变量在 python(scipy) 中进行聚类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 scipy.integrate.odeint 求解具有时间相关变量的 ODE 系统

仅需6道题轻松掌握SciPy空间计算基础 | Python技能树征题

气象 python 二维线性插值

使用 scipy.io.loadmat 从 .mat Matlab 文件中将字典键转换为 Python 中具有相同值的变量名

Python读写mat文件(使用scipy.io)

Python机器学习(五十二)SciPy 基础功能