具有机器学习的周期性数据(如度数 -> 179 与 -179 有 2 个不同)
Posted
技术标签:
【中文标题】具有机器学习的周期性数据(如度数 -> 179 与 -179 有 2 个不同)【英文标题】:Periodic Data with Machine Learning (Like Degree Angles -> 179 is 2 different from -179) 【发布时间】:2013-12-21 08:37:56 【问题描述】:我正在使用 Python 进行核密度估计,并使用高斯混合模型对多维数据样本的可能性进行排序。 每一条数据都是一个角度,我不知道如何处理机器学习的角度数据的周期性。
首先,我通过向它们添加 360 来删除所有负角,因此所有负角都变为正角,-179 变为 181。我相信这可以优雅地处理 -179 的情况,类似的情况与 179 和类似的没有显着差异,但它不处理像 359 这样与 1 没有什么不同的实例。
我想到的解决问题的一种方法是同时保留负值和负 +360 值并使用两者中的最小值,但这需要修改机器学习算法。
对于这个问题,是否有一个好的仅预处理解决方案? scipy 或 scikit 内置了什么?
谢谢!
【问题讨论】:
当您说“每条数据都是一个角度”时,您的意思是输入特征和目标变量(用于回归)? 不是这些 scipy 或 scikit 方面的专家,但你可以尝试用 cos(angle)、sin(angle) 替换角度 @ogrisel,是的,我的意思是所有输入特征和目标变量都是角度。 @TalDarom,我不明白这如何解决数据的周期性。你能详细说明一下吗? 解决了这个问题,因为 cos 和 sin 是角度的周期函数。例如您可以在这些值之间使用欧几里得距离(或任何其他标准度量)。 【参考方案1】:正如 Tal Darom 在 cmets 中所写,在归一化为弧度后,您可以将每个周期性特征 x
替换为两个特征 cos(x)
和 sin(x)
。这解决了 359 ≈ 1 的问题:
>>> def fromdeg(d):
... r = d * np.pi / 180.
... return np.array([np.cos(r), np.sin(r)])
...
>>> np.linalg.norm(fromdeg(1) - fromdeg(359))
0.03490481287456796
>>> np.linalg.norm(fromdeg(1) - fromdeg(180))
1.9999238461283426
>>> np.linalg.norm(fromdeg(90) - fromdeg(270))
2.0
norm(a - b)
是向量a
和b
之间的旧欧几里得距离。正如您可以使用一个简单的图来验证的那样,或者通过意识到这些 (cos,sin) 对实际上是单位圆上的坐标,这个距离是两个 (cos,sin) 向量之间的最大距离(并且点积最小)当原始角度相差180°时。
【讨论】:
抱歉,我不确定我是否理解这个解决方案。它如何作为预处理步骤应用于数据集中的每个样本? @Kylamus:是的,这是特征提取的一部分。【参考方案2】:已经发布的方法的替代方法是使用Von Mises distribution 对角度变量进行建模。
scipy 似乎支持此分布,因此适合混合模型应该不会太难。
【讨论】:
【参考方案3】:另一种更简单的方法是使用时间作为角度测量而不是角度测量(虽然不是 DMS)。由于许多分析软件都将时间作为一种数据类型,因此您可以使用它的周期性来完成您的工作。
但请记住,您需要将 360 度缩放到 24 小时。
【讨论】:
【参考方案4】:您需要使用 mod 功能。在直接 python 中,这将是(ang2-ang1)%360
,但使用 scipy 看起来你可以使用numpy.mod()
- 请参阅the documentation。
【讨论】:
这甚至不是问题的答案。 OP不是在问“如何计算两个角度之间的差异”,这个问题涉及完全不同的方面,更深更难。这不是关于功能的问题,甚至不是任何实现问题。这是一个关于在一类聚类模型中使用自定义指标的概念问题。 @lejlot - 大约三分之二的问题似乎是关于如何计算角度之间的差异 - 甚至是标题的一半。我认为这就是问题所在,他可以做其他事情。但显然我误解了。以上是关于具有机器学习的周期性数据(如度数 -> 179 与 -179 有 2 个不同)的主要内容,如果未能解决你的问题,请参考以下文章